🗒️Vue 指令
来自官网 https://cn.vuejs.org
1. Class 和 Style 绑定
class 和 style 都是 attribute,所以可以使用 v-bind 指令。
- :class是- v-bind:class的缩写
- :style是- v-bind:style的缩写
考虑到复杂绑定时用 v-bind 拼接生成字符串比较麻烦而且容易出错,所以 Vue 专门为 class 和 style 的 v-bind 用法提供了特殊的功能增强,就是除了字符串外,表达式的值还可以是对象或数组。
1.1 绑定对象
eg1. 给 class 绑定对象
<!-- 1. -->
<div :class="{ active: isActive}"></div>
<!-- 2. 和静态共存 -->
<div
  class="static"
  :class="{ active: isActive, 'text-danger': isError }"
></div>
<!-- 3. 绑定个对象 -->
<div :class="classObject"></div>
<!-- 4. 绑定个计算属性 -->
<div :class="classObject2"></div>import { ref, reactive, computed } from 'vue';
const isActive = ref(true);
const isError = ref(true);
const error = ref(null);
const classObject = reactive({
  active: true,
  "text-danger": false
});
const classObject2 = computed(() => ({
  active: isActive.value && !error.value,
  "text-danger": error.value && error.value.type === "fatal"
}));eg2. 给 style 绑定对象
<!-- 1. 给 style 绑定对象(以下两个等价) -->
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
<div :style="{ color: activeColor, 'font-size': fontSize + 'px' }"></div>
<!-- 2. 直接绑定一个对象 -->
<div :style="styleObject"></div>
<!-- 3. 绑定一个计算属性 -->import {ref, reactive} from 'vue';
  
const activeColor = ref("red");
const fontSize = ref(30);
const styleObject = reactive({
  color: "red",
  fontSize: "13px"
});1.2 绑定数组
eg1. 给 class 绑定数组
<!-- 1. 普通数组 -->
<div :class="[activeClass, errorClass]"></div>
<!-- 2. 有条件地渲染 -->
<div :class="[isActive ? activeClass : '', errorClass]"></div>
<!-- 3. 在数组中嵌套对象(可避免冗长的条件渲染) -->
<div :class="[{ active: isActive }, errorClass]"></div>import { ref } from "vue";
  
const activeClass = ref("active");
const errorClass = ref("text-danger");
const isActive = ref(true);在组件上使用。关于更多组件的 attribute 继承的细节,详见 透传 Attributes。
2. v-if 和 v-show
v-if 和 v-show它们的区别:
条件渲染
是真实地按条件渲染,它会确保事件监听器和子组件都会被销毁和重建
只是切换了元素的 CSS display 属性
初始渲染的开销
是惰性的。如果初次渲染时是 false,则不会做任何事情;只有当条件首次变为 true 时才被渲染
初始一定会被渲染(即在 DOM 树中保留该元素),而无论初始条件如何
切换的开销
更高
仅更改 display 属性
是否支持 <template> 
支持
不支持
所以,v-show 适用于频繁切换,而 v-if 更适用于在运行时绑定条件很少改变的。
3. v-for
v-for3.1 用法
- 遍历一个数组 - <li v-for="item in items"></li>- 解构 - <li v-for="{ message } in items"></li>
 
- <li v-for="(item, index) in items"></li>- 解构 - <li v-for="({ message }, index) in items"></li>
- for-in
 
- <li v-for="item of items"></li>- for-of更接近 JavaScript 的迭代器语法
 
 
- 遍历一个对象:遍历对象的所有属性,顺序是基于对该对象调用 - Object.keys()的返回值- <li v-for="value in myObject"></li>
- <li v-for="(value, key) in myObject"></li>
- <li v-for="(value, key, index) in myObject"></li>
 
- 直接接受一个整数值 - <span v-for="n in 10"></span>初值是从 1 开始
 
在 v-for 块中可以完整地访问父作用域内的属性和变量。多层嵌套的 v-for,作用域的工作方式和函数的作用域很类似,每个 v-for 作用域都可以访问到父级作用域。
v-for 也能在 <template> 上使用。
3.2 :key 绑定
:key 绑定对于通过 v-for 渲染的元素列表,Vue 默认按照“就地更新”的策略来更新。比如当数据项的顺序改变时,Vue 不会随之移动 DOM 元素的顺序,而是就地更新每个元素。
默认模式是高效的,但只适用于列表渲染输出的结果不依赖子组件状态或者临时 DOM 状态的情况(例如表单输入值)。
给每个元素对应的块提供一个唯一的 key 属性,可以让 Vue 跟踪每个节点,从而重用和重新排序现有的元素。key 绑定的值期望是一个基础类型的值,不要赋个对象。更多详见内置的特殊 Attributes key。
3.3 v-for 和 v-if
v-for 和 v-if- 不推荐同时使用 - v-if和- v-for,详见风格指南。
- 若同时使用了, - v-if的优先级会更高,这意味着- v-if的条件将无法访问到- v-for作用域内定义的变量别名。更多请查阅列表渲染指南。
- 通常会在外新包装一层 - <template v-for><li v-if></li></template>
- <template v-if><li v-for></li></template>
 
4. v-on
v-onv-on 指令可以监听 DOM 事件,比如 v-on:click="handler",简写为 @click="handler"。
- 内联事件处理器 - 比如 - <button @click="count++">Add 1</button>
- 比如 - <button @click="say('hello')">Say hello</button>
- 传事件参数 - <button @click="(event) => warn('xxx', event)"></button>
 
- 方法事件处理器 - 比如 - <button @click="greet">Greet</button>
 
4.1 事件修饰符
功能类似 event.preventDefault() 和 event.stopPropagation()。
- .stop:停止冒泡
- .prevent:阻止默认
- .self:仅当- event.target是元素本身时
- 与原生 - addEventListener事件相对应- .capture:使用- capture捕获模式
- .once:最多被触发一次
- .passive:和 scrolling 相关
 
修饰符可链式书写:
- 比如 - <a @click.stop.prevent="doThat"></a>
- 需注意顺序 - @click.prevent.self会阻止元素及其子元素的所有点击事件的默认行为
- @click.self.prevent则只会阻止对元素本身的点击事件的默认行为
 
- 不要同时使用 - .passive和- .prevent- 因为 - .passive向浏览器表明了不想阻止事件的默认行为
 
4.2 按键修饰符
- 常用按键的别名 - .enter
- .tab
- .delete(捕获“Delete”和“Backspace”两个按键)
- .esc
- .space
- .up
- .down
- .left
- .right
 
- 系统按键修饰符 - .ctrl
- .alt
- .shift
- .meta
 
- .exact修饰符:确定组合的系统按键修饰符
- 鼠标按键修饰符 - .left
- .right
- .middle
 
<input @keyup.enter="submit" />
<input @keyup.page-down="onPageDown" />
<input @keyup.alt.enter="clear" />
<div @click.ctrl="doSomething"></div>5. v-model
v-model关于表单输入的绑定,如果是手动连接值绑定和更改事件监听器可能会很麻烦,而 v-model 指令能帮我们简化很多。如下:
<input :value="text" @input="event => text = event.target.value" />
<input v-model="text" />5.1 不同类型的输入
v-model 可以处理不同类型的输入,比如 <input>, <textarea>, <select> 元素。它还会根据所使用的元素自动使用对应的 DOM 属性和事件组合:
- 文本类型的 - <input>和- <textarea>元素会绑定- valueproperty 并侦听- input事件
- <input type="checkbox">和- <input type="radio">会绑定- checkedproperty 并侦听- change事件
- <select>会绑定- valueproperty 并侦听- change事件
注意:v-model 会忽略任何表单元素上初始的 value, checked 或 selected attribute。它将始终将当前绑定的 JavaScript 状态视为数据的正确来源。
5.2 修饰符
- .lazy:让- v-model更新数据的时机从- input事件之后变成- change事件 之后
- .number:若输入框有- type="number"该修饰符会自动启用
- .trim:自动去除两端的空格
Last updated