Vue之自定义指令

先了解一下,在 vue 中,有很多内置的指令.

比如:

  • v-for 用于遍历
  • v-if & v-show 用于隐藏和显示元素(区别在于后者是修改 display:block|none,前者是不创建把元素从dom中删除或者创建.
  • v-bind: 属性绑定,把数据绑定在HTML元素的属性上.
  • v-html & v-text 把数据绑定在HTML元素的属性上,作用同 innerHTML & innerText
  • v-on: 绑定HTML元素事件
  • v-if & v-else-if & v-else 条件渲染
  • v-model 绑定表单元素,实现双向绑定.

等等.....

所以,关于指令,我们可以总结下面几点:

  • 指令是写在 HTML 属性地方的.<input v-model=‘name‘ type=‘text‘ />
  • 指令都是以 v- 开头的.
  • 指令表达式的右边一般也可以跟值 v-if = false

2.0 Vue自定义指令场景小DEMO(非常尬)

  场景: 我们需要一个指令,写在某个HTML表单元素上,然后让它在被加载到DOM中时,自动获取焦点.

// 和自定义过滤器一样,我们这里定义的是全局指令
Vue.directive(‘focus‘,{
    inserted(el) {
      el.focus()
    }
})
<div id=‘app‘>
    <input type="text">
    <input type="text" v-focus placeholder="我有v-focus,所以,我获取了焦点">
  </div>
  

  这里放了两个 input ,但是后面的 input 才使用了我们的自定义 v-focus 指令,所以看到了是后面那个文本框获取了焦点,而不是前面一个.

  

先总结几个点:

  • 使用 Vue.directive() 来新建一个全局指令,(指令使用在HTML元素属性上的)
  • Vue.directive(‘focus‘) 第一个参数focus是指令名,指令名在声明的时候,不需要加 v-
  • 在使用指令的HTML元素上,<input type="text" v-focus placeholder="我有v-focus,所以,我获取了焦点"/> 我们需要加上 v-.
  • Vue.directive(‘focus‘,{}) 第二个参数是一个对象,对象内部有个 inserted() 的函数,函数有 el 这个参数.
    • el 这个参数表示了绑定这个指令的 DOM元素,在这里就是后面那个有 placeholderinput
    • el 就等价于 document.getElementById(‘el.id‘)....
    • 可以利用 $(el) 无缝连接 jQuery

指令的生命周期

其实上面个例子很尬!
HTML5 本身就提供了一个 autofocus 的属性,我们直接写这个就OK了.

用指令我们需要:

  • 新增一个指令
  • 定义指令的第二个参数里的 inserted 函数
  • 在需要获取焦点的元素上,使用这个指令.

非常的费时费力....

在说明,为什么我要这么麻烦的使用指令之前,可以先了解一下指令的一些基本知识.

上述例子中,我们写了一个叫 inserted(){} 的函数,
有了 inserted 就说明了,指令在绑定到 HTML 元素上时,肯定也是有一堆钩子函数的,说白了也就是生命周期.

当一个指令绑定到一个元素上时,其实指令的内部会有五个生命周期事件函数.

先上官方说明:

  • bind(){} 当指令绑定到 HTML 元素上时触发.只调用一次.
  • inserted() 当绑定了指令的这个HTML元素插入到父元素上时触发(在这里父元素是 div#app).但不保证,父元素已经插入了 DOM 文档.
  • updated() 所在组件的VNode更新时调用.
  • componentUpdate 指令所在的组件的VNode以及其子VNode 全部更新后调用.
  • unbind: 指令和元素解绑的时候调用,只调用一次
Vue.directive(‘gqs‘,{
    bind() {
      // 当指令绑定到 HTML 元素上时触发.**只调用一次**
      console.log(‘bind triggerd‘)
    },
    inserted() {
      // 当绑定了指令的这个HTML元素插入到父元素上时触发(在这里父元素是 `div#app`)**.但不保证,父元素已经插入了 DOM 文档.**
      console.log(‘inserted triggerd‘)
    },
    update() {
      // 所在组件的`VNode`更新时调用.
      console.log(‘update triggerd‘)
    },
    componentUpdated() {
      // 指令所在组件的 VNode 及其子 VNode 全部更新后调用。
      console.log(‘componentUpdated triggerd‘)

    },
    unbind() {
      // 只调用一次,指令与元素解绑时调用.
      console.log(‘unbind triggerd‘)
    }
  })

HTML

<div id=‘app‘ v-gqs></div>

结果

bind triggerd
inserted triggerd

发现默认情况下只有 bind 和 inserted 声明周期函数触发了.

那么剩下的三个什么时候触发呢?

 <div id=‘app‘ >
    <p v-gqs v-if="show">v-if是删除或者新建dom元素,它会触发unbind指令声明周期吗?</p>
    <button @click="show=!show">toggle</button>
  </div>

一开始猜测 unbind 应该是删除元素的时候触发,也是弄了个 v-if.

然后点击按钮,发现果然如此.
当指令绑定的元素被销毁时,会触发指令的 unbind 事件.
(新建并显示,仍然是触发 bind & inserted)

update()与conponentUpdated()几乎是伴随触发,先触发update()函数,再触发componentUpdated()函数

  • v-show的显示/隐藏
  • :style与:class的样式改变时(:style={fontSize:fontSize+‘px‘} :style={changeClass: bool} )
  • 内容改变 (v-model="text")  v-mode一定要绑定,否则无法触发

注意:使用this.$refs.<dom>来修改隐藏、显示、样式、内容是无法触发update()和componentUpdated()

利用指令,可以做一些小事情.

既然,指令并不是一次性的活.
当绑定指令的元素的状态发生改变时(这里主要是指元素绑定的vue数据发生改变时),仍然会触发指令中的 update 函数.

那么我们可以利用指令的简写形式,来做一些有意思的事情.

核心思想就是:

当一个HTML元素设置了指令,那么在这个元素的状态发生改变时(由vue数据变化带来的带来的监控),我们可以利用update()钩子函数监控到这个元素的变化,然后根据需要做一些其他的事情.

使用官方指定的指令简写模式:

Vue.directive(‘color-swatch‘, function (el, binding) {
  el.style.backgroundColor = binding.value
})

inserted or update .

当元素的状态发生改变时,就会触发 update

在写demo之前,还需要了解一下指令钩子函数的几个参数.

  • el: 绑定指令的那个dom元素.(doucument.getElementById(‘el.id‘)
  • binding: 一个对象
    • name : v-gqs ==> gqs 不包括前面的v-
    • valule : 指令后面的值 v-gqs=‘abc‘ value=abc
    • oldValue 前一个值,只能在 update & componentUpdate 中使用.
    • expression : v-gqs=‘1+1‘,如果是 value = 2 ,如果是 expression = 1 + 1
    • arg: 指令传递的参数 ,比如 v-gqs:hello arg = hello
    • modifiers : 比如 v-gqs.a.b modifiers = {a:true,b:true}
  • vnode:Vue编译生成的虚拟节点.
  • oldVnode:上一个虚拟节点,仅在 update & componentUpdated 中可用.
Vue.directive(‘change-bgc‘, (el, binding,vnode,oldVnode) => {
    el.style.backgroundColor = ‘red‘
    console.log(`binding.name:${binding.name}`)
    console.log(`binding.value:${binding.value}`)
    console.log(`binding.expression:${binding.expression}`)
    console.log(`binding.arg:${binding.arg}`)
    console.log(`binding.modifiers:${JSON.stringify(binding.modifiers)}`)
    console.log(`binging.oldValue:${binding.oldValue}`)
    console.log(`vnode:${Object.keys(vnode).join(‘,‘)}`)
    console.log(`oldVnode:${JSON.stringify(oldVnode)}`)
  })
binding.name:change-bgc
binding.value:2
binding.expression:1+1
binding.arg:foo
binding.modifiers:{"left":true,"bottom":true}
binging.oldValue:undefined
vnode:tag,data,children,text,elm,ns,context,fnContext,fnOptions,fnScopeId,key,componentOptions,componentInstance,parent,raw,isStatic,isRootInsert,isComment,isCloned,isOnce,asyncFactory,asyncMeta,isAsyncPlaceholder
oldVnode:{"tag":"","data":{},"children":[],"raw":false,"isStatic":false,"isRootInsert":true,"isComment":false,"isCloned":false,"isOnce":false,"isAsyncPlaceholder":false}

原文地址:https://www.cnblogs.com/aidixie/p/12627085.html

时间: 2024-10-10 01:12:01

Vue之自定义指令的相关文章

Vue.js自定义指令的用法与实例

市面上大多数关于Vue.js自定义指令的文章都在讲语法,很少讲实际的应用场景和用例,以致于即便明白了怎么写,也不知道怎么用.本文不讲语法,就讲自定义指令的用法. 自定义指令是用来操作DOM的.尽管Vue推崇数据驱动视图的理念,但并非所有情况都适合数据驱动.自定义指令就是一种有效的补充和扩展,不仅可用于定义任何的DOM操作,并且是可复用的. 比如谷歌图片的加载做得非常优雅,在图片未完成加载前,用随机的背景色占位,图片加载完成后才直接渲染出来.用自定义指令可以非常方便的实现这个功能. 效果: 自定义

vue怎么自定义指令??

最近看看vue中自定义指令,感觉vue的指令和angular1的指令相差较大 <script> //指令钩子函数: /* bind 只调用一次,指令第一次绑定到元素的时调用 inserted 被指令绑定指令的元素插入 父节点的时候调用 update 被绑定的元素模版只要发生变化,就会触发(通过比较模板变化前后) componentUpdated 被绑定元素所在模版完成一次更新周期时被触发 unbind 指令被解除绑定的时候 */ /*定义指令回调函数(钩子函数的几个参数的意义)第一个参数:绑定

最简单的方式理解Vue的自定义指令

vue.js 自定义指令 钩子函数:bindinsertedupdatecomponentUpdatedunbind 钩子函数完整实例:html: <div id="hook-arguments-example" v-demo:hello.a.b="message" v-color-swatch="bgColor" ></div> js: Vue.directive('demo', { bind: function (el

vue中自定义指令

在vue中自定义标签,首先要调用vue中一个directive的方法,具体方法:Vue.direction('指令名称',function(){ }); 例如我们要写一个关于颜色的指令,叫v-colorred: 1 Vue.directive('colorred',function(){ 2 3 this.el.style.color='red'; 4 }); 在html中,我直接用v-colorred指令就可以了,例如: 1 <p v-colorred>1234567890</p>

vue(2) - 自定义指令

我们都知道v-for.v-html.等等都是指令:扩展html 语法 自定义指令: 属性指令 Vue.deirctive(指令名称,function(){ this.el ==>原生的dom元素 }) <div id="box"> <span v-red>1222</span> </div> <script> Vue.directive('red',function(){ this.el.style.background

Vue.js 自定义指令

自定义指令 除了默认设置的核心指令(如:v-model,v-for),Vue.js也允许注册自定义指令,自定义指令提供一种机制将数据的变化映射为DOM行为 Vue.js用 Vue.directive(id, definition)方法注册一个全局自定义指令,它接收两个参数:指令ID和定义对象.也可以用组建的directives选项注册一个局部自定义指令 例如:聚焦一个 input 元素 <div id="directive-focus">     <input v-f

vue.js自定义指令入门

Vue.js 允许你注册自定义指令,实质上是让你教 Vue 一些新技巧:怎样将数据的变化映射到 DOM 的行为.你可以使用Vue.directive(id, definition)的方法传入指令id和定义对象来注册一个全局自定义指令.定义对象需要提供一些钩子函数(全部可选): bind: 仅调用一次,当指令第一次绑定元素的时候. update: 第一次是紧跟在 bind 之后调用,获得的参数是绑定的初始值:以后每当绑定的值发生变化就会被调用,获得新值与旧值两个参数. unbind:仅调用一次,当

Vue中自定义指令的使用方法!

除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令.注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件.然而,有的情况下,你仍然需要对普通 DOM 元素进行底层操作,这时候就会用到自定义指令.举个聚焦输入框的例子,如下:(咳咳,借官网的用一用) 1.定义全局的自定义变量 main.js Vue.directive('color',{ inserted(el){ // 各单位注意,这里的el获取的是标签元素,说白了就是可以直接操作DOM cons

Vue.directive 自定义指令

// 注册一个全局自定义指令 `v-focus` Vue.directive('focus', { // 当被绑定的元素插入到 DOM 中时…… inserted: function (el) { // 聚焦元素 el.focus() } }) 局部 directives: { focus: { // 指令的定义 inserted: function (el) { el.focus() } } } 页面使用 <input v-focus> 自定义指令中传递的三个参数 el: 指令所绑定的元素,