返回顶部
首页 > 资讯 > 前端开发 > VUE >Vue如何自定义指令回顾v-内置指令
  • 252
分享到

Vue如何自定义指令回顾v-内置指令

2024-04-02 19:04:59 252人浏览 八月长安
摘要

这篇文章主要介绍了Vue如何自定义指令回顾v-内置指令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue.js 的各种指令(Directi

这篇文章主要介绍了Vue如何自定义指令回顾v-内置指令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

vue.js 的各种指令(Directives)更加方便我们去数据驱动 DOM,例如 v-bind、v-on、v-model、v-if、v-for、v-once 等内置指令,这些指令的职责就是当表达式改变时将某些行为应用到 DOM 上,尽量不去操作增删改 DOM。通过了解如何去自定义指令,可以想象内置指令是如何完成的。

内置指令

指令名称描述使用
v-model绑定数据<\input v-model="message">
v-text输出文本,不能解析标签<\p v-text="message"></p>
v-html输出文本,可解析标签<\p v-html="message">/p>
v-once只绑定一次数据<\p v-once >{{message}}</p>
v-bind绑定属性<\img v-bind:src="imgurl"> 或 <\img :src="imgurl">
v-if控制是否显示容器 值转为布尔为false时 注释该容器,反之显示<\div v-if="true"></div>
v-show控制是否显容器,改变的时display:none/block<\div v-show="true"></diiv>
v-for循环遍历数组、对象<\li v-for="(val,key) in arr">{{val}}</li>
v-cloak在还没有执行到vue代码的时候隐藏元素,可解决‘闪烁'问题<\p v-cloak>{{message}}</p>

自定义指令

在需要特殊功能时,使用自定义指令对 DOM 进行底层操作

注册

自定义指令的注册分为全局注册和局部注册,类似组件的注册,只是方法名为 directive,写法如下:

// 全局注册 自定义指令
Vue.directive(‘mydir',{
  // 指令选项
});
// 全局注册 自定义指令函数
Vue.directive('mydir', function () {
 // 这里将会被 `bind` 和 `update` 调用
})
// 局部注册(只针对组件内元素)
export default {
  directives: {
    mydir: {
      // 指令选项
    }
  }
}

需要注意的是:Vue.directive( ) 注册指令要在实例初始化 new Vue( ) 之前才能全局注册指令。定义指令时驼峰式写法会报错,所以一般小写。

指令选项

自定义指令的选项是由几个钩子函数(可选)组成,可以根据需求选择不同的钩子,例如使用全局注册一个指令时:

Vue.directive('mydir', {
 bind: function () {
  // 只调用一次,指令第一次绑定到元素时调用,用于在绑定元素时执行一次的初始化动作。
  },
 update: function () {
  // 第一次是紧跟在 bind 之后调用,获得的参数是绑定的初始值,
  // 之后被绑定元素所在的模板更新时调用,而不论绑定值是否变化,可以忽略不必要的模板更新。  
  }, 
 inserted: function () {
  // 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
  },
 componentUpdated: function () {
  // 被绑定元素所在模板完成一次更新周期时调用。
  },
 unbind: function () {
  // 只调用一次, 指令与元素解绑时调用。
  }
})

以上每个钩子函数都有几个参数可用:

  1. el:指令所绑定的元素,可以用来直接操作 DOM;

  2. binding:包含指令信息的一个对象;

  3. vnode:Vue 编译的生成虚拟节点;

  4. oldVnode:上一次的虚拟节点,仅在update和componentUpdated钩子函数中可用。

示例

// 一个带自定义指令的元素
<div v-mytest:foo.m1.m2="1+1">MyDirective</div>

// 部分 js 代码
export default {
  directives:{
   mytest: {
    bind: function (el, binding, vnode) {
     console.log(el)
     console.log(binding)
     console.log(vnode)
    }
   }
  }
}

控制台输出截图:

Vue如何自定义指令回顾v-内置指令

其中对于 binding 对象输出的属性有:

  1. rawName: "v-mytest:foo.m1.m2" // 自定义指令

  2. name: "mytest" // 指令名称

  3. arg: "foo" // 指令的参数

  4. modifiers: {m1: true, m2: true} // 指令的修饰符

  5. expression: "1+1" // 指令绑定值的字符串形式

  6. value: 2 // 指令的绑定值

v-bind || : 绑定属性

Vue 内置指令 v-bind 用于动态更新 HTML 元素属性,使用 v-bind:someAttr = "someData"或者语法糖 :someAttr = "someData"就可以在 someData 改变时更新绑定的 someAttr 属性。

基本用法

绑定单一的属性值

<a :href="url" rel="external nofollow" rel="external nofollow" :id="linkID">链接</a>

测试 data 如下:

// js
data : {
  url: 'https://www.baidu.com/',
  linkID : 'myid'
}

元素渲染输出:

<a href="Https://www.baidu.com/" rel="external nofollow" rel="external nofollow" id="myid">链接</a>

对象语法

v-bind 最常用的是绑定 class 或 style 属性来动态改变样式。例如可以给 :class 设置一个对象来动态切换 class 的值:

<!-- class 绑定 -->
<div :class="{colorRed: isRed}"></div>

当 isRed:true 时渲染输出:

<div class="colorRed"></div>

对象中可以传入多个属性值来动态切换 class:

<!-- class 绑定,传入多个属性 -->
<div :class="{ classA: isA, classB: isB }">

当 isA、isB 变化时 classA、classB 会动态更新,当都为 true 时显然渲染结果为:

<div class="classA classB"></div>

同理对于 style 可以传入对象属性,并且可以使用字符串拼接:

<!-- style 绑定 -->
<div :></div>

对于元素中的各个对象可以统一用 v-bind 绑定:

<!-- 绑定一个有属性的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

数组语法

class 可以传入多值,给 :class 绑定一个数组就可以使用 class 列表

<div :class="[activeA, activeB]"></div>

例如当 {activeA: 'class1', activeB: 'class2'} 时渲染结果为:

<div class="class1 class2"></div>

还可以在数组语法中使用三元表达式切换 class,例如:

<div :class="[isA ? activeA : '', activeB]">

在 class 有多个条件时使用三元表达式比较繁琐,可以在数组语法中使用对象语法:

<div :class="[{activeA: isA}, activeB]">

修饰符

v-bind 的修饰符很少,api 中只提供.prop、.camel和.sync,并且多用于组件,使用方式示例:

<!-- 通过 prop 修饰符绑定 DOM 属性 (property) -->
<div v-bind:text-content.prop="text"></div>

<!-- .camel 修饰符(2.1.0+)将 v-bind 属性名称 kebab-case 驼峰化为 camelCase -->
<svg :view-box.camel="viewBox"></svg>

<!-- .sync 修饰符(2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的 v-on 侦听器-->
<text-document v-bind:title.sync="doc.title"></text-document>
<!-- 批量绑定,将 doc 对象中的每一个属性 (如 title) 都作独立的 prop ,各自添加 v-on 监听器-->
<text-document v-bind.sync="doc"></text-document>

v-on || @ 监听事件

v-on 用于动态绑定事件监听器,使用 v-on:someEvent = "someFunction"或者语法糖 @someEvent = "someFunction"就可以监听 someEvent 进行交互。

基本用法

@someEvent 调用的方法名后面可以不跟(),例如:

<a :href="url" rel="external nofollow" rel="external nofollow" :id="linkID">链接</a>
<!-- 监听一个事件 -->
<button @click="changeFun">change button</button>

可以在 methods 中添加函数:

// 部分 JS 代码
methods :{
 changeFun : function () {
  this.linkID = 'changeID' // 指向当前组件本身
 }
}

点击 button 按钮后 a 元素的 id 改变:

<a href="https://www.baidu.com/" rel="external nofollow" rel="external nofollow" id="changeID">链接</a>

当然 v-on 还可以使用对象语法监听多个事件:

<!-- v2.4.0+ -->
<button v-on="{ mousedown: doThis, mouseup: doThat }"></button>

对于在 HTML 元素上监听的事件,当 ViewModel 销毁时,所有的事件处理器会自动删除,无需自己清理。

修饰符

Vue 可以将原生事件对象参数 event 传入事件方法中,并提供了特殊变量$event用来访问元素 DOM 事件。此外可以通过一些事件修饰符来实现特定的事件,如 .stop、.prevent、.capture、.once 等,常用的使用示例:

<!-- 停止单击事件冒泡,调用 event.stopPropagation()-->
<button @click.stop="doThis"></button>

<!-- 阻止默认行为,调用 event.preventDefault() -->
<button @submit.prevent="doThis"></button>

<!-- 添加事件侦听器时使用 capture 事件捕获模式 -->
<button @click.capture="doThis"></button>

<!-- 点击回调只会触发一次 -->
<button @click.once="doThis"></button>

<!-- 只当点击鼠标左键时触发(2.2.0) -->
<button @click.left="doThis"></button>

<!-- 串联修饰符 -->
<button @click.stop.prevent="doThis"></button>

此外,v-on 还提供按键修饰符来监听键盘事件,键值为 .keyCode,常用有.entry、.delete、.tab、.esc、.space、.down等,如下:

<!-- 只有在 `keyCode` 是 5 时调用 `vm.submit()` -->
<input v-on:keyup.5="submit">

<!-- 为重要的 keyCode 如 enter 提供别名-->
<input v-on:keyup.enter="submit">

<!-- 缩写语法 -->
<input @keyup.enter="submit">

此外还有系统修饰符监听键盘事件,不同的系统其键盘/系统修饰符不一样。这些按键修饰符可以任意组合使用。

v-if、v-show 条件渲染

条件渲染 v-if 根据表达式的值的真假条件渲染元素,在表达式为真时渲染,为假时移除。

<p v-if="status === 1">当 status 为 1 时显示此行</p>

<p v-else-if="status === 1">当 status 为 2 时显示此行</p>

<p v-else>其它情况默认显示此行</p>

v-show 也是条件渲染,但只切换元素的 CSS 属性 display,无论条件真假都会被编译,相比于 v-if 更适用于频繁切换场景。

<p v-show="status === 1">当 status 为 1 时显示此行</p>

当 data: {status: 2} 时隐藏,但依旧会被编译,渲染结果为:

<p >当 status 为 1 时显示此行</p>

显然在 Vue.js 内置的 <template> 元素上可以使用 v-if,但不能使用 v-show,可以思考下为什么。

v-for 列表渲染

列表渲染指令 v-for 常用于数组遍历或枚举一个对象的循环显示,必须结合 in 使用特定语法 alias in expression 为当前遍历的元素提供别名:

<!-- 遍历一个数组 -->
<div v-for="item in items">{{ item.text }}</div>

<!-- 提供第二个的参数为数组的索引 -->
<div v-for="(item, index) in items">{{ index }} - {{ item.text }}</div>

<!-- 遍历对象属性 -->
<div v-for="value in object">{{ value }}</div>

<!-- 提供第二个可选的参数:对象的键名 -->
<div v-for="(value, key) in object">{{ key }}: {{ value }}</div>

<!-- 提供第三个的可选参数:对象的索引 -->
<div v-for="(value, key, index) in object">{{ index }}. {{ key }}: {{ value }}</div>

可以用 of 替代 in 作为分隔符

当 v-for 和 v-if 在同一节点一起使用时,v-for 的优先级比 v-if 更高。

v-model 表单控件双向绑定

v-model 其实也是一个特殊的语法糖,其实实现的数据双向绑定也可用v-bind和v-on实现,但v-model在不同表单上会有更加智能的处理。

文本框

经典的使用案例是对<input>、<textarea>文本框的双向数据绑定:

<!-- 输入框 -->
<input type="text" v-model="message" placeholder="edit me">
<!-- 文本域 -->
<textarea v-model="message" placeholder="edit me"></textarea>
<!-- 实时更新 -->
<p>Message is: {{ message }}</p>

动态选择

对于单选按钮,复选框及选择框的选项,v-model配合 Vue 实例的数据作为value属性值实现不同效果,即会忽略所有表单元素的 value、checked、selected 特性的值。

<!--单选按钮的互斥效果-->
<div id="example-radio">
 <input type="radio" id="one" value="One" v-model="picked">
 <label for="one">One</label>
 
 <input type="radio" id="two" value="Two" v-model="picked">
 <label for="two">Two</label>
 
 <!-- picked 显示的是 value 的值 -->
 <p>Picked: {{ picked }}</p>
</div>

<!--多选按钮-->
<div id='example-checkbox'>
 <input type="checkbox" id="one" value="One" v-model="checkedNames">
 <label for="jack">Jack</label>
 <input type="checkbox" id="two" value="Two" v-model="checkedNames">
 <label for="john">John</label>

  <!-- Checked 显示的是 value 组成的数组 -->
 <p>Checked: {{ checkedNames }}</p>
</div>

修饰符

v-model的修饰符的使用限制在<input>、<select>、<textarea> 和组件。

  1. .lazy - 取代 input 监听 change 事件

  2. .number - 输入字符串转为数字

  3. .trim - 输入首尾空格过滤

v-pre、v-cloak、v-once

这三个指令的共同点是无需表达式,用法如下:

<!-- 不显示未编译的标签直到实例初始化完 -->
<div v-cloak>{{ message }}</div>
<!-- 需要配合 CSS 隐藏样式 [v-cloak]{ display: none;}-->

<!-- 只渲染一次,随后的渲染将被视为静态内容并跳过 -->
<div v-once>{{ message }}</div>

<!-- 不会被编译,直接显示显示原始{{ }}标签 -->
<div v-pre>{{ message }}</div>

感谢你能够认真阅读完这篇文章,希望小编分享的“Vue如何自定义指令回顾v-内置指令”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网VUE频道,更多相关知识等着你来学习!

--结束END--

本文标题: Vue如何自定义指令回顾v-内置指令

本文链接: https://lsjlt.com/news/75041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue如何自定义指令回顾v-内置指令
    这篇文章主要介绍了Vue如何自定义指令回顾v-内置指令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Vue.js 的各种指令(Directi...
    99+
    2024-04-02
  • vue自定义加载指令v-loading占位图指令v-showimg
    目录了解自定义指令的钩子函数注册成为全局指令需求描述列表组件 ListCom.vue加载动画组件 LoadingCom.vue钩子函数 loading.js分析上面的代码main.j...
    99+
    2022-11-13
    vue自定义加载占位图指令 vue自定义指令
  • Vue中如何自定义指令
    这篇文章主要介绍Vue中如何自定义指令,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Vue中除了内置指令,也允许注册自定义的指令。自定义指令提供一种将数据的变化映射为DOM的行为例如:当我们想用一个函数表示焦点Vue...
    99+
    2023-06-04
  • Vue自定义指令v-focus实例详解
    目录前言自定义指令 directive项目实际使用技术背景实际操作优势setTimeout(fn, 0) 永远的神$nextTick(callback)小结前言 本文直接参考vue2...
    99+
    2024-04-02
  • 如何自定义类似于jQueryUISelectable的Vue指令v-selectable
    这期内容当中小编将会给大家带来有关如何自定义类似于jQueryUISelectable的Vue指令v-selectable,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有...
    99+
    2024-04-02
  • vue如何使用自定义指令
    这篇文章将为大家详细讲解有关vue如何使用自定义指令,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 使用自定义指令的逻辑与使用事件修饰符的逻辑...
    99+
    2024-04-02
  • vue如何自定义加载指令
    本文小编为大家详细介绍“vue如何自定义加载指令”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue如何自定义加载指令”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言用过element-ui的都应该知道,里面...
    99+
    2023-07-02
  • Vue自定义指令详细
    目录1、背景2、局部自定义指令3、全局自定义指令4.1 自定义指令钩子函数4.2 钩子函数参数4.3 动态指令传参 5、拓展1、背景 最近在面试找工作,然后面试官就问了有关自定义指令...
    99+
    2024-04-02
  • Vue自定义指令详解
    目录Vue自定义指令自定义指令钩子函数输出相关属性运用例子总结Vue自定义指令 自定义指令 注册一个全局指令v-focus,该指令的功能是在页面加载时元素获得焦点 <!DO...
    99+
    2024-04-02
  • Vue中如何使用自定义指令
    今天就跟大家聊聊有关Vue中如何使用自定义指令,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.自定义指令的语法Vue自定义指令语法如下:Vue.d...
    99+
    2024-04-02
  • vue全局自定义指令和局部自定义指令的使用
    目录局部自定义指令(只针对组件内的元素)定义全局自定义指令自定义指令的钩子函数自定义指令钩子函数的参数例子除了默认设置的核心指令 (v-model 和 v-show),Vue 也允许...
    99+
    2024-04-02
  • Angular.js如何自定义指令
    这篇文章主要介绍了Angular.js如何自定义指令,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体代码如下所示:<!DOCTYPE...
    99+
    2024-04-02
  • Vue自定义复制指令v-copy功能的实现
    使用自定义指令创建一个点击复制文本功能 1. 创建v-copy.js文件 import Vue from "vue"; // 注册一个全局自定义复制指令 `v-copy` Vue.d...
    99+
    2024-04-02
  • vue中的自定义指令如何使用
    这篇文章主要介绍“vue中的自定义指令如何使用”,在日常操作中,相信很多人在vue中的自定义指令如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中的自定义指令如何使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • Vue自定义指令怎么写
    小编给大家分享一下Vue自定义指令怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是Vue指令指令是一种可以附加到DOM...
    99+
    2024-04-02
  • vue中的自定义指令clickOutside
    目录自定义指令clickOutside首先我们先看看vue官方的文档clickoutside 这个指令用在哪里呢?写法自定义指令clickoutside使用及扩展用法自定义指令cli...
    99+
    2024-04-02
  • vue.js 自定义指令(拖拽、拖动、移动) 指令 v-drag详解
    1.main.js文件中添加已下代码 Vue.directive('drag', { //1.指令绑定到元素上回立刻执行bind函数,只执行一次 //2.每个函数中第一个参数...
    99+
    2023-01-28
    vue.js 自定义指令 vue自定义拖拽指令v-drag vue指令 v-drag
  • Vue自定义v-has指令实现按钮权限判断
    应用场景 以后台管理系统为例,每个用户所拥有的按钮权限不一样。管理员配置权限之后,用户登录时,从接口拿到按钮权限列表,然后根据后台数据判断显示哪些按钮。 简单说一下,自定义指令 ...
    99+
    2024-04-02
  • 在vue自定义组件中使用 v-model指令详情
    目录一、前言1.技术点提前知二、在自定义的vue组件中使用v-model1.效果演示图2.自定义组件代码示例3.在父组件使用自定义组件三、优写时刻一、前言 如何实现在自定义的vue组...
    99+
    2024-04-02
  • vue.js内部自定义指令与全局自定义指令的示例分析
    这篇文章将为大家详细讲解有关vue.js内部自定义指令与全局自定义指令的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。directive这个单词是我们写自定义指令...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作