指令Directive

198 阅读3分钟

指定

什么是指令

  • <div v-text="x"></div>
  • <div v-html="x"></div>
  • 以v-开头的东西就是指令

语法

  • v-指令名:参数=值,如 v-on:click=add
  • 如果值里没有特殊字符,则可以不加引号
  • 有些指令没有参数和值,如 v -pre
  • 有些指令没有值,如v-on:click.prevent

修饰符

有些指令支持修饰符

  • @click.stop="add"表示阻止事件传播/冒泡
  • @click.prevent="add"表示阻止默认动作
  • @click.stop.prevent="add"同时表示两种意思

一共有多少修饰符

有很多种,具体看文档

.sysn修饰符

场景描述

  • 爸爸给儿子钱,儿子要花钱怎么办,示例
  • 答:儿子打电话(触发事件)向爸爸要钱
  • Vue规则:组件不能修改props外部数据
  • Vue规则: this. emit可以触发事件,并传参1Vue规则:emit可以触发事件,并传参1 Vue规则: event可以获取$emit的参数
  • 不要问我为什么有。上面三条规则,这是尤雨溪定的
  • 由于这种场景很常见
  • 所以尤雨溪发明了.sync,示例
  • :money.sync="total"等价于
  • :money="total" v-on:update:money="total = $event"

指令directives

两种写法

第一种:声明一个全局指令

Vue。directive('x',directiveOptions)
之后就可以在任意组件使用

第二种:声明一个局部指令

new Vue({
	...,
    directives:{
    "x":directiveOptions
    }
})

v-x只能在该实例中使用;

directiveOptions里有哪些属性?

directiveOptions

五个函数属性

  • bind(el,info,vnode,oldVnode)-类似create
  • inserted(参数同上)-类似mounted
  • updated(参数同上)-类似updated
  • componentUpdated(参数同上)-用的不多,详情见文档
  • unbind(参数同上)-类似destroyed

举例

缩写

  • directiveOptions在某些条件下可以缩写为函数,用得不多,可以看文档。

指令的作用

主要用于dom操作

  • Vue实例/组件用于数据绑定,事件监听,dom更新
  • Vue指令主要目的就是原生dom操作

减少重复

  • 如果某个dom操作经常使用,就可以封装成指令,
  • 如果某个dom操作比较复杂,也可封装成指令

mixins -混入

  • 混入其实就复制

减少重复

类比

  • directives的作用就是减少dom操作的重复
  • mixins的作用是减少data,methods,钩子的重复

场景描述

  • 假设我们需要在每个组件上添加name和time
  • 在created,打出提示,并报出存活时间
  • 一共有五个组件,怎么做???
  • 给每个组件添加data和钩子,共五次
  • 或者使用mixinx减少重复
  • 示例1(未完成)
  • 示例1(已完成)

mixins技巧

extends 继承

减少重复

与mixins同样的需求

  • 不想要每次都写一个mixins,怎么办
  • 你可以使用Vue.extend或options。extends
const MyVue = Vue.extend({
  data(){ return {name:'',time:undefined} },
  created(){
    if(!this.name){console.error('no name!')}
    this.time = new Date()
  },
  beforeDestroy(){
    const duration = (new Date()) - this.time
            console.log(`${this.name}
  }
})

  • 然后我们就可以使用new MyVue(options)了

extends是比minxins更抽象一点的封装,如果你嫌弃mixins,可以考虑extends一次,实际使用较少。

provide和inject 提供和注入

使用举例

  • 一键换肤功能:默认蓝色,可以切换成红色
  • 文字大小:默认正常,可以改成大或小
  • 未完成的示例
  • 已完成的示例
  • 祖先栽树(provide),后人乘凉(inject)

总结

  • 作用:大范围的data和method等共用
  • 注意:不能只传themeName不传changeTheme,因为themeName的值是被复制给provide的
  • 引用可以做到,但是不推荐,容易失控