Vue 指令系列
v-html
- 设置元素 innerHtml
- 尽量只展示开发者的内容,不然又 xss 注入是吧
- 不支持组件
js
<div v-html='a'></div>
<script setup>
const a=<section style='color:red'>woodbell</section>
</script>
vue-text
js
<div v-text='a'></div>
<script setup>
const a='woodbell'
</script>
v-bind
- v-bind 的简写为:
- style 和 class 等常用属性都可以绑定
- 考虑到标签原有的 class,vue 支持一组 class 事先绑定,一组 class 动态绑定
- v-bind 花样普通的是 :[] = xxx [] @[] = xxx []中可以任意指定希望动态变化的属性或事件
- 动态绑定 class 的方法是比较奇特的
- 可以普通单个绑定样式
- 可以数组风格绑定,数组元素直接为 data 中的属性,属性值写单个样式(其实也可以理解成数组取子集嗷)
- 也可以对象风格绑定,对象 key 需要在样式中先写好,value 是 data 中做判断的值
- 还可以数组里传对象,数组元素相当于写死,对象元素就临时判断
js
<div v-bind:id='event'>看看id试试</div>
<div :id='event'>看看id试试</div>
<div :style='style'>看看id试试</div>
<div :class="['a', 'b']">看看id试试</div>
<div :class="[judge ? 'a':'b']">看看id试试</div>
<div class='c' :class="[judge ? 'a':'b']">看看id试试</div>
<script setup>
const event = 'click'
const judge = true
const style = {
color:'red',
border:'1px solid #ccc'
}
</script>
<style>
.a {
color:red
}
.b{
border: 1px solid #ccc
}
.c{
background-color:blue
}
</style>
v-on
- 支持 v-on 简写为@
- 支持多个回调函数 @click='fun1, fun2(xxx)'以及它的参数
- 支持动态事件@[event]
- 支持事件修饰符
- prevent
- stop 阻止冒泡,非常直观
- capture 捕获触发
- self 只处理自己元素的事件
- once 只处理一次
js
<div v-on:click="xxx">点一下试试</div>
<div @click="xxx">点一下试试</div>
<button @click.prevent="xxx">点一下试试</button>
<div v-on:[event]="xxx">点一下试试</div>
<script setup>
const event = 'click'
const xxx = () => {console.log('clicked')}
</script>
- 获取 event 对象时,绑定这里需要传入$event
- 在内联语法中 $event 就是传递 event target 的标准方式
v-model
v-model 相当于 @input 和 联合的语法糖
由于触发 js 行为,可能阻塞页面渲染,还是尽量加 lazy
多选框绑定的对象是一个数组,其他基本都是空字符串占位
v-model
js<input v-model='a' type='text'> <script setup> import { ref } from 'vue' const a = ref('woodbell') </script>
阻止默认有两种方法,一个是事件监听可以主动传 e/event 参数,e.preventDefault 完事,另一种就是用 vue 指令.prevent
key 事件中驼峰命名的在 vue 里要改横线命名
exact 修饰符的作用是不接受连续操作,比如只要空格,就不容忍你之前按空格
表单修饰符
lazy 动作彻底完成,比如失焦时再触发事件
trim
number 把默认的字符串转为 number, 使用 parseFloat,或者设置表单的 type 为 number
v-if & v-show
使用 v-if 和 v-show 包裹一批元素的方式
- 都要求同级 html 元素,或者说需要紧挨着
- 如果想分组展示,用任意元素包裹起来,再把包裹元素写 v-else 就行
- 因为会直接删除节点,所以动画效果基本会拉
- template 又成了一种推荐方式
- v-show 不能和 template 一起用
v-if 和 v-show 的作用方式
- v-if 是将变为注释节点
- v-show 只是将 display:none,也会搞坏动画
基本评价
v-show 在切换时的性能高于 v-if
v-if 在生成销毁时性能高于 v-show
js<div v-if='a'>true</div> <div v-else-if='a === false'>else-if</div> <div v-else>else</div> <script setup> const a= false </script>
js<div v-show='a'>true</div> <script setup> const a= false </script>
v-for
有子元素和 index 两个参数
支持嵌套循环
v-for 的更新默认或者说没 key 时是原地更新,是 diff 算法的实际执行
但元素顺序确实重要时,设置 key 属性有助于 vue 按顺序更新
通过 n in num v-for 可以实现 r 和 matlab 的序列生成
js<div v-for='(item, index) in a' :key='xxx'> {{ index+1}}-{{ item }} <div v-for='item.xxx'>{{xxx}}</div> </div> <script setup> const a = ['wood', 'bell', 'woodbell'] </script>
v-once
- 只渲染一次
- 因此也可以用来锁定初始值
js
<div v-once>123</div>
v-memo
- 条件成立时跳过更新,手动控制缓存嘛
- 传[]和 v-once 一样
- 一般配合 v-for 操作
js
<div v-for='(item, index) in a' :key='xxx' v-memo='[item ===2]'>
{{ index+1}}-{{ item }}
</div>
<script setup>
const a = ['wood', 'bell', 'woodbell']
</script>
v-cloak
- 在没构建的版本中,可以配合样式隐藏尚未加载的内容
- [v-cloak]
- v-once 某个元素只渲染一次,对于保存响应式数据的初始值还蛮有用的
自定义指令
使用和 data 等同级的 directive 配置项
全局定义就变成 app.directive
主要是设置在不同生命周期的行为,由于最常用的就是挂载和更新,所以只有这两个周期时可以省略设置
主要参数是 el 和 binding,分别是被绑定 html 元素和传入指令的值
binding 可以接收动态传参
jsapp.directive("fsize", { mounted(el, binding) { el.style.fontSize = binding.value + "px"; }, }); <p v-fsize="18">这是一个段落</p>; <p v-fsize:[unit]="fontSize">这是一个段落</p> app.directive("fsize", (el, binding) => { el.style.fontSize = binding.value + (binding.arg || "px"); });