Skip to content

指令篇

v-if和v-show

  • v-if如果值为false时,在生成node树时不会生成对应的节点,不会出现在DOM
  • v-show会生成节点并插入到dom中,只是在渲染的时候,通过display:none的方式隐藏了元素

应用场景

如果元素需要频繁的切换显示/隐藏时,使用v-show更加的合适

v-if切换时性能消耗较高,v-show渲染效率更高

v-model语法糖

v-modelVue中经常用到的一个指令了,其实它是一个语法糖,实现起来也很简单

先定义一个valref变量用于存放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>

对于不同的元素,发送的事件也是不同的

  • texttextarea使用的是input事件和value属性
  • checkboxradio使用的是change事件和checked属性
  • select使用的是change事件

onLine Demo

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-ifv-for优先级更高,注意此时v-if中无法访问到v-for作用域内定义的变量别名

风格指南 - Avoid v-if with v-for