目录

  • 1. vue内置指令
    • 1-1. v-text
    • 1-2. v-html
    • 1-3. v-pre
    • 1-4. v-cloak
    • 1-5. v-once
    • 1-6. v-for
    • 1-7. v-if 和 v-else 和 v-if-else
    • 1-8. v-show
    • 1-9. v-model
      • 1-9-1. 表单上使用v-model
      • 1-9-2. 组件上使用v-model
      • 1-9-3. 使用.sync修饰符实现v-model等效
    • 1-10. v-bind
    • 1-11. v-on
    • 1-12. v-slot
      • 1-12-1. 匿名插槽
      • 1-12-2. 具名插槽
      • 1-12-3. 作用域插槽
  • 2. 自定义指令
    • 2-1. 全局自定义指令
    • 2-2. 局部自定义指令
    • 2-3. 动态参数和简写

Vue.js指令 (Directives) 是带有 v- 前缀的特殊特性。指令特性的值预期是单个 JavaScript 表达式 (v-for 是例外情况)。我们可以将指令看作特殊的HTML特性,作用是:当表达式的值改变时,将其产生的连带影响,响应式地作用于绑定的DOM。

1. vue内置指令

内置指令指的就是Vue.js自带的指令,开箱即用,一共有14个:

  • 内容渲染指令

    • v-text
    • v-html
    • v-pre
    • v-cloak
    • v-once
  • 条件渲染指令
    • v-for
    • v-if
    • v-else
    • v-else-if
    • v-show
  • 属性绑定指令
    • v-model
    • v-bind
    • v-on
  • 插槽指令
    • v-slot

1-1. v-text

该指令的作用是更新DOM元素的文本内容,使用率很低,一般都是用双花括号来代替了,可以忽略

语法如下:

<template><div><span v-text="msg"></span></div>
</template><script>
export default {name: "home",data() {return {msg: '我是一个文本信息'}}
}
</script>

1-2. v-html

该指令的作用是更新DOM元素的innerHTML,内容按普通HTML插入,用处挺多的,比如渲染字符串html,动态插入元素等。(滥用可能会引起XSS攻击,比如用户提交"<a href="https://有害网站">xxx</a>",会被渲染成html标签)

语法如下:

<template><div><div v-html="span"></div></div>
</template><script>
export default {name: "home",data() {return {span: '<div><span>我是span</span></div>'}}
}
</script>

1-3. v-pre

该指令不需要表达式,作用是跳过绑定了这个指令的元素和它的子元素的编译过程。跳过大量没有指令的节点会加快编译,但是绑定了后,会直接显示双花括号{{ xxx }},按需使用。

1-4. v-cloak

该指令不需要表达式。这个指令会保持在dom元素上,直到其关联的实例结束编译才失效。作用是配合css选择器[v-cloak],来实现隐藏未编译完成的元素,直到实例准备完毕。

语法如下:

<template><div><p v-cloak>{{ text }}</p></div>
</template><script>
export default {name: "home",data() {return {text: '这是一段text文本'}}
}
</script><style scoped>
[v-cloak] {display: none;
}
</style>

1-5. v-once

该指令不需要表达式,作用是只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。

例子如下:

<template><div class="app"><h1 v-once>{{ time }}</h1></div>
</template><script>
export default {name: 'home',data(){return {time: new Date().getTime()}},mounted() {setInterval(() => {this.time = new Date().getTime()}, 1000)}
}
</script>

因为h1标签带上了v-once指令,所以只渲染了一次,后续计时器不停修改值,也不会再渲染,显示的时间戳也就始终停在第一次。

1-6. v-for

基于源数据,多次渲染元素或模板块。数据源可以是stringarrayobjectnumberIterable(有迭代接口的值)。一般v-for会搭配内置属性key使用,避免渲染出现问题。这也是一个经典面试题,具体原因可以看:传送门1,传送门2

例子如下:

<template><div class="app"><!-- 例1 --><h1 v-for="(item, index) in obj" :key="index">{{item}}</h1><!-- 例2 --><h1 v-for="item in 10" :key="item">{{item}}</h1><!-- 例3 --><div v-for="item in arr" :key="item"><span>姓名:{{item.name}}</span><span>年龄:{{item.age}}</span></div></div>
</template><script>
export default {name: 'home',data(){return {obj: {a: 100,b: 200,c: 300},arr: [{ name: 'x', age: 10 },{ name: 'xx', age: 11 },{ name: 'xxx', age: 12 }]}}
}
</script>

1-7. v-if 和 v-else 和 v-if-else

根据表达式之真假值来渲染元素。在切换时绑定该指令的元素/组件会被销毁并重建。如果是绑定在template标签上,将提出template的内容作为条件块。

当和 v-for 一起使用时,v-for 的优先级比 v-if 更高

该指令可触发组件过渡效果

例子如下:

<template><div class="app"><h1 v-if="num < 2">num小于2</h1><h2 v-else-if="num <= 5">num小于等于5</h2><h3 v-else>num大于5</h3></div>
</template><script>
export default {name: 'home',data(){return {num: Math.round(Math.random() * 10)}}
}
</script>

1-8. v-show

根据表达式之真假值,切换元素的CSS display属性,当值为false时,display为none

该指令可触发组件过渡效果

例子如下:

<template><div class="app"><h1 v-show="num < 5">我是H1</h1></div>
</template><script>
export default {name: 'home',data(){return {num: 0}},mounted() {setInterval(() => {this.num = Math.round(Math.random() * 10)}, 1000)}
}
</script>

1-9. v-model

在表单控件或者组件上创建双向绑定的值,本质上来说,它是一个语法糖,它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。比如:v-model="foo",等价于 :value="foo"加上@input="foo = $event"的便捷写法。

在大部分情况下,以下两种写法是等价的:

<input v-model="name" /><input :value="name" @input="name = $event" />

拥有以下修饰符:

  • .lazy:取代 input 监听 change 事件
  • .number:输入字符串转为有效的数字
  • .trim:过滤首尾空格

1-9-1. 表单上使用v-model

<template><div class="app"><input type="text" v-model="text"></div>
</template><script>
export default {name: 'home',data(){return {text: ''}}
}
</script>

1-9-2. 组件上使用v-model

  • 父组件
<template><div><h1>{{ total }}</h1><hello-world v-model="total" @input="handleInput" /></div>
</template><script>
import helloWorld from '@/components/HelloWorld'export default {name:'home',components:{helloWorld},data(){return {total: 0}},methods: {handleInput(v) {this.total = v}}
}
</script>
  • 子组件(子组件接收的props值字段必须是value
<template><div class="app"><button @click="handleChange">增加</button></div>
</template><script>
export default {name: 'holle',props: ['value'],methods: {handleChange() {this.$emit('input', this.value + 1)}}
}
</script>

1-9-3. 使用.sync修饰符实现v-model等效

  • 父组件
<template><div><h1>{{ total }}, {{ age }}</h1><hello-world :a.sync="total" :b.sync="age" @input="handleInput" /></div>
</template><script>
import helloWorld from '@/components/HelloWorld'export default {name:'home',components:{helloWorld},data(){return {total: 0,age: 0}},methods: {handleInput(v1, v2) {this.total = v1this.age = v2}}
}
</script>
  • 子组件
<template><div class="app"><button @click="handleChange">增加</button></div>
</template><script>
export default {name: 'holle',props: ['a', 'b'],methods: {handleChange() {this.$emit('input', this.a + 1, this.b + 2)}}
}
</script>

1-10. v-bind

动态的绑定一个或多个属性到组件上,可以绑定class、style等任意值。可以简写为:。拥有以下修饰符:

  • .sync:语法糖,扩展成一个更新父组件绑定值的 v-on 侦听器
  • .camel:kebab-case转camelCase
  • .prop:作为一个DOM property绑定而不是作为attribute绑定,通过自定义属性存储变量,避免暴露数据。防止污染HTML结构

例子:

<template><div><h1 :class="['aaa','bbb', num < 100 ? 'ccc':'ddd']"></h1><h2 :style="mode"></h2><input type="text" :value="msg"><img v-bind:src="data:imageSrc" /></div>
</template><script>
export default {name:'aaa',data(){return {num: 200,mode: {color: 'red',fontSize: '20px'},msg: '',imageSrc: 'https://www.baidu.com/xxx.png'}}
}
</script>

1-11. v-on

绑定事件监听器。事件类型由参数指定。可以简写为@。拥有以下修饰符:

  • .stop:调用 event.stopPropagation(),阻止冒泡
  • .prevent:调用 event.preventDefault(),阻止元素发生默认的行为
  • .capture:添加事件侦听器时使用 capture 捕获模式
  • .self:事件从侦听器绑定的元素本身触发时才触发回调
  • .keyCode:当事件是从特定键触发时才触发回调
  • .native:监听组件根元素的原生事件
  • .once:只触发一次回调
<button v-on:click="add"></button>
// 动态事件
<button @[event]="change"></button>
// 事件对象
<button @click="add('hello', $event)"></button>
// 按键事件
<input @keyup.enter="onEnter" />
// 按键代码
<input @keyup.13="onEnter" />

1-12. v-slot

slot,也称插槽,是组件的一块HTML模版,这块模版由父组件提供。可以说是子组件暴露的一个让父组件传入自定义内容的接口,来实现内容分发。一般都写在template标签上,可以简写为#

1-12-1. 匿名插槽

匿名插槽用slot标签来确定渲染的位置,里面可以放置父组件没传内容时的默认内容,一个组件里,匿名插槽只能有一个。slot="default"可以忽略不写。

  • 父组件
<template><div><aaaChildren></aaaChildren><aaaChildren><h1>我是父组件的内容</h1></aaaChildren></div>
</template><script>
import aaaChildren from './children/index.vue'export default {name:'aaa',components:{aaaChildren}
}
</script>
  • 子组件
<template><div class="aaa_children"><slot><h1>我是默认内容</h1></slot></div>
</template><script>export default {name:'aaaChildren'}
</script>

1-12-2. 具名插槽

slot标签上加入name属性,使得父级可以将内容插入对应的位置中。具名插槽可以有很多个,使用的时候需要带上名字做区分。

  • 父组件
<template><div><aaaChildren><template #text>111</template><template #footer>222</template></aaaChildren></div>
</template><script>
import aaaChildren from './children/index.vue'export default {name:'aaa',components:{aaaChildren}
}
</script>
  • 子组件
<template><div class="aaa_children"><slot name="text"><h1>我是text插槽</h1></slot><div><slot name="footer"><h2>我是footer插槽</h2></slot></div></div>
</template><script>
export default {name: 'aaaChildren'
}
</script>

1-12-3. 作用域插槽

作用域插槽在slot上绑定属性来将子组件的信息传给父组件使用,这些属性会被挂在父组件slot-scope接受的对象上。绑定时用的key,就是父组件获取数据的键。

  • 父组件
<template><div><aaaChildren><template #default="scope"><h1>{{ scope.info.age }}</h1></template><template #text="scope"><h2>{{ scope.data }}</h2></template></aaaChildren></div>
</template><script>
import aaaChildren from './children/index.vue'export default {name:'aaa',components:{aaaChildren}
}
</script>
  • 子组件
<template><div class="aaa_children"><slot :info="user"></slot><slot name="text" :data="name"></slot></div>
</template><script>export default {name:'aaaChildren',props:[],components:{},data(){return {user: {age: 18,name: '小明'},name: '卡卡罗特'}}}
</script>

2. 自定义指令

自定义指令。是Vue暴漏了自定义指令的API给我们,让我们除了使用内置指令外,我们还可以自己定义指令(比如:复制粘贴指令,图片懒加载指令,防抖指令等等),定义好后和内置指令的方式非常类似。它可以有全局的和局部的两种。指令也有自己的钩子函数,如下:

  • bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置
  • inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)
  • update:所在组件的VNode更新时调用,但是可能发生在其子VNode更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新
  • componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用
  • unbind:只调用一次,指令与元素解绑时调用

以上钩子函数都有4个参数,如下:

  • el:指令所绑定的元素,可以用来直接操作 DOM
  • binding:一个对象,包含这些属性
    • name:指令名,不包括 v- 前缀
    • value:指令的绑定值,例如:v-bold=“1 + 1” 中,绑定值为 2
    • oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用
    • expression:字符串形式的指令表达式。例如 v-bold=“1 + 1” 中,表达式为 “1 + 1”
    • arg:传给指令的参数,可选。例如 v-bold:foo 中,参数为 “foo”
    • modifiers:一个包含修饰符的对象。例如:v-bold.foo.bar 中,修饰符对象为 { foo: true, bar: true }
  • vnode:Vue 编译生成的虚拟节点
  • oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用

2-1. 全局自定义指令

通过Vue实例身上的directive() API注册一个全局自定义指令。例子如下:

  • 首先在src文件夹下创建一个directive文件夹,里面创建一个index.js文件,写入以下代码
/*** 安装指令* @param Vue vue实例*/
export default function installDirective(Vue) {// 粗体指令Vue.directive('bold', {inserted(el) {el.style.fontWeight = 'bold'}})
}
  • 然后在main.js里,引入directive,然后使用Vue.use安装指令
import Vue from 'vue'
import App from './App.vue'
import initDirective from '@/directive'Vue.use(initDirective)new Vue({render: h => h(App),
}).$mount('#app')
  • 使用如下:
<template><div v-bold>123</div>
</template>

2-2. 局部自定义指令

组件中也接受一个directives的选项,在组件中定义的自定义指令,就是局部自定义指令,其参数和全局指令一致。例子如下:

<template><div v-bold>123</div>
</template><script>
export default {name: 'aaaChildren',directives: {bold: {inserted: function (el) {el.style.fontWeight = 'bold'}}}
}
</script>

2-3. 动态参数和简写

指令的参数可以是动态,这样可以灵活运用,例子如下,可以动态修改高度的指令:

  • 注册指令:
/*** 安装指令* @param Vue vue实例*/
export default function initDirective(Vue) {// 简写 在bind和update时触发相同行为Vue.directive('height', (el, binding) => {el.style.backgroundColor = 'skyblue'el.style.height = `${binding.value}px`})
}
  • 使用指令:
<template><div><button @click="addHeight">点击增高</button><div v-height="h"></div></div>
</template><script>
export default {name:'aaa',data(){return {h: 100}},methods: {addHeight() {this.h += 2}}
}
</script>

如果看了觉得有帮助的,我是@上进的鹏多多,欢迎 点赞 关注 评论;

往期文章

  • Vue2全家桶+Element搭建的PC端在线音乐网站
  • vue3+element-plus配置cdn
  • 助你上手Vue3全家桶之Vue3教程
  • 助你上手Vue3全家桶之VueX4教程
  • 助你上手Vue3全家桶之Vue-Router4教程
  • 超详细!Vue的九种通信方式
  • 超详细!Vuex手把手教程
  • 使用nvm管理node.js版本以及更换npm淘宝镜像源
  • vue中利用.env文件存储全局环境变量,以及配置vue启动和打包命令
  • 超详细!Vue-Router手把手教程

个人主页

  • CSDN
  • GitHub
  • 简书
  • 博客园
  • 掘金

vue2的指令和自定义指令相关推荐

  1. Vue011_ 内置指令与自定义指令

    内置指令与自定义指令 常用内置指令 1) v:text : 更新元素的 textContent 2) v-html : 更新元素的 innerHTML 3) v-if : 如果为 true, 当前标签 ...

  2. Vue中常用的内置指令及自定义指令

    内置指令 v-bind [单向数据绑定] [格式:v-bind:属性名="data中定义的属性"] [简写::属性名="data中定义的属性"] <div ...

  3. vue2入门--->过滤器,内置指令,自定义指令

    1. 过滤器 1.1 介绍 过滤器:定义:对要显示的数据进行特定格式化后再显示(适用于一些简单逻辑的处理).语法:1.注册过滤器:Vue.filter(name,callback) 或 new Vue ...

  4. 教女朋友学习 vue中的指令及其自定义指令

    写在前面: 我是「扬帆向海」,这个昵称来源于我的名字以及女朋友的名字.我热爱技术.热爱开源.热爱编程.技术是开源的.知识是共享的. 这博客是对自己学习的一点点总结及记录,如果您对 Java.算法 感兴 ...

  5. 2.0 vue内置指令与自定义指令

    一.概述 模板在解析之前指令是存在的,但是解析完成以后就不存在了. 1.1 常用内置指令 1) v:text : 更新元素的 textContent 2) v-html : 更新元素的 innerHT ...

  6. vue.js 四(指令和自定义指令)

    官方的指令说明已经很简单了,这里再写一遍,也是自己加深一下印象 v-text 就是写入单纯的文本,可以忽略这个指令直接双花括号代替 <span v-text="msg"> ...

  7. vue 自定义指令_vue 自定义指令

    <template><div><div class="movebox"><div class="movego"> ...

  8. 【vue系列-04】vue的表单数据收集,基本指令和自定义指令

    vue的表单数据收集.指令 一,vue的核心属性 1,收集表单数据 1.1,收集数据案例 1.1.1,type类型的输入框 1.1.2,radio类型的单选框 1.1.3,checkbox类型的复选框 ...

  9. Vue3(撩课学院)笔记04-高阶API-mixin混入,mixin自定义属性,全局配置mixin,自定义全局指令,自定义局部指令,自定义指令传入数据,teleport传送门

    1.Mixin混入 将课复用代码独立出来用于复用 通过创建Mixin对象将复用代码放在Mixin对象中 在根组件中添加mixins属性,通过数组来存放多个minxin对象(也就是把minin内容混入根 ...

最新文章

  1. gdb调试工具的使用
  2. python+OpenCV图像处理
  3. 皮一皮:中国好男友?
  4. 【深度学习】模式识别技术探索之决策树(Decision tree)
  5. struts2 ibatis Spring系统架构图
  6. Flutter入门篇(一)
  7. andriod studio 查看项目依赖_Intellij IDEA 中如何查看maven项目中所有jar包的依赖关系图...
  8. pytorch统计矩阵非0的个数_矩阵的三种存储方式---三元组法 行逻辑链接法 十字链表法...
  9. C语言课后习题(68)
  10. 通过自定义类加载器进行动态编译与动态实现接口
  11. 副本引发的问题corrupt data exception
  12. HDU 2639 Bone Collector II (dp)
  13. is和as在类型转换时的性能差异
  14. thinkphp学习总结
  15. 最小二乘支持向量机--LSSVM分类及MATLAB代码实现
  16. retina 显示屏详细理解
  17. Office小知识(一)——word插入各种方向和条件个数的大括号{ }
  18. Win10 通知区域蓝牙图标消失问题
  19. hsv白色h值是多少_rgb颜色模型与hsv颜色模型的理解
  20. 胖客户端程序RCP与瘦客户端程序TCP

热门文章

  1. 近一年多看过的电影和书籍
  2. 从普通 Msconfig 启动选择转为选择性启动
  3. 2022.08.12 第三组 高小涵
  4. 观察力训练(福尔摩斯演绎法)
  5. 小白零基础教学:用自助BI工具搭建领导驾驶舱
  6. Tom小猫,让我看清你的五脏六腑1
  7. 公司财务发工资时,记录了当时发工资的资料Employee.txt 1.定义公司员工类Employee,属性有:工号,姓名,性别,工资(double类型),进行属性的隐藏和封装,重写toString.
  8. linux下磁盘sda,Linux下磁盘设备文件(sda,sdb,sdc….)变化问题
  9. 上海高考物理能不能用计算机,上海高考再放大招!选物理再也不会吃亏了
  10. 拜读阮一峰JavaScript教程笔记