指令篇
v-if和v-show
v-if如果值为false时,在生成node树时不会生成对应的节点,不会出现在DOM中v-show会生成节点并插入到dom中,只是在渲染的时候,通过display:none的方式隐藏了元素
应用场景
如果元素需要频繁的切换显示/隐藏时,使用v-show更加的合适
v-if切换时性能消耗较高,v-show渲染效率更高
v-model语法糖
v-model是Vue中经常用到的一个指令了,其实它是一个语法糖,实现起来也很简单
先定义一个val的ref变量用于存放input框中的值,input元素绑定input事件,从事件参数从拿到input框中的值将其赋值到val中即可。
vue
<template>
<div id="app">
<input :value="val" @input="handleChange" />
</div>
</template>
<script>
import { ref } from 'vue';
export default {
name: 'App',
setup() {
const val = ref('');
const handleChange = (e) => {
val.value=e.target.value
};
return {
val,
handleChange
}
},
};
</script>对于不同的元素,发送的事件也是不同的
text和textarea使用的是input事件和value属性checkbox和radio使用的是change事件和checked属性select使用的是change事件
Vue内置的指令有哪些
| 指令 | 描述 |
|---|---|
| v-show | 控制元素是否显示,原理是利用display:none |
| v-if | 控制元素是否渲染,原理是利用display:none |
| v-html | 将指定指令值作为html文本渲染到组件上,会先清空目标中的所有内容 |
| v-for | 通常用于遍历模板 |
| v-else | 配合v-if使用 |
| v-else-if | 配合v-if使用 |
| v-on | 用于绑定事件监听器,语法糖为@ |
| v-bind | 用于传递属性到组件中,语法糖为: |
| v-model | 双向数据绑定 |
| v-slot | 用于将组件传递到具名插槽中 |
| v-pre | 绑定的元素不进行编译,不做如何处理 |
| v-once | 绑定的元素只渲染一次,后续不在更新(性能优化) |
| v-memo | 缓存模板子树,应该很少用到 |
| v-cloak | 用于未编译完成时隐藏元素 |
为什么说v-for和v-if不建议一起使用
在Vue2中,当遍历一个元素时,添加v-if指令,Vue会先将元素遍历出来,之后再通过v-if去推断是否渲染该元素(会触发指令、组件销毁重构),从这里看到v-for的优先级是高于v-if的
在Vue3中,如果这两个指令同时使用时,v-if比v-for优先级更高,注意此时v-if中无法访问到v-for作用域内定义的变量别名