vue从入门到进阶:自定义指令directive,插件的封装以及混合mixins(七)

前端开发 作者: 2024-08-20 20:55:01
一.自定义指令directive 除了核心功能默认内置的指令 (v-model 和 v-show),Vue 也允许注册自定义指令。注意,在 Vue2.0 中,代码复用和抽象的主要形式是组件。然而,有的
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus',{
   当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
     聚焦元素
    el.focus()
  }
})
directives: {
  focus: {
     指令的定义
    inserted:  (el) {
      el.focus()
    }
  }
}
<input v-focus>

钩子函数

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

钩子函数参数

  • el:指令所绑定的元素,可以用来直接操作 DOM 。
    • name:指令名,不包括 v- 前缀。
    • value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2
    • oldValue:指令绑定的前一个值,仅在 updatecomponentUpdated 钩子中可用。无论值是否改变都可用。
    • expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"
    • arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"
    • modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true,bar: true }
  • vnodeVue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
  • oldVnode:上一个虚拟节点,仅在 updatecomponentUpdated 钩子中可用。
div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo' (el,binding,vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(',')
  }
})

new Vue({
  el: '#hook-arguments-example'
  }
})
name: "demo"
value: "hello!"
expression: "message"
argument: "foo"
modifiers: {"a":true,"b":true}
vnode keys: tag,data,children,text,elm,ns,context,fnContext,fnOptions,fnScopeId,key,componentOptions,componentInstance,parent,raw,isStatic,isRootInsert,isComment,isCloned,isOnce,asyncFactory,asyncMeta,isAsyncPlaceholder
Vue.directive('color-swatch', binding.value
})

对象字面量

v-demo="{ color: 'white',text: 'hello!' }">
Vue.directive('demo',binding) {
  console.log(binding.value.color)  => "white"
  console.log(binding.value.text)   => "hello!"
})
  • 1.添加全局方法或者属性,如: vue-custom-element
  • 2.添加全局资源:指令/过滤器/过渡等,如 vue-touch
  • 3.通过全局 mixin 方法添加一些组件选项,如: vue-router
  • 4.添加 Vue 实例方法,通过把它们添加到 Vue.prototype 上实现。
  • 5.一个库,提供自己的 API,同时提供上面提到的一个或多个功能,如 vue-router
MyPlugin.install =  (Vue,options) {
   1. 添加全局方法或属性
  Vue.myGlobalMethod =  () {
     逻辑...
  }

   2. 添加全局资源
  Vue.directive('my-directive'    }
    ...
  })

   3. 注入组件
  Vue.mixin({
    created:  () {
       4. 添加实例方法
  Vue.prototype.$myMethod =  (methodOptions) {
      }
}

怎样使用插件

 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin)
Vue.use(MyPlugin,{ someOption: true })
 用 Browserify 或 webpack 提供的 CommonJS 模块环境时
var Vue = require('vue')
var VueRouter = require('vue-router')

 不要忘了调用此方法
Vue.use(VueRouter)

简单例子

template>
    >封装一个最简单的插件</>
script>
export default{
    name:'count-down
}
>
import countDown from './countdown';

countDown.install = (Vue){
    Vue.component(countDown.name,countDown)
};

export default countDown;
import countDown from './components/countdown/index.js' 
Vue.use(countDown)
count-down>
 定义一个混合对象
var myMixin = {
  created: this.hello()
  },methods: {
    hello:  () {
      console.log('hello from mixin!')
    }
  }
}

 定义一个使用混合对象的组件
var Component = Vue.extend({
  mixins: [myMixin]
})

var component = new Component()  => "hello from mixin!"

选项合并

var mixin = () {
    console.log('混合对象的钩子被调用')
  }
}

 Vue({
  mixins: [mixin],created:  () {
    console.log('组件钩子被调用' => "混合对象的钩子被调用"
// => "组件钩子被调用"
 {
  methods: {
    foo:  () {
      console.log('foo')
    },conflicting:  () {
      console.log('from mixin'var vm =  () {
      console.log('bar' () {
      console.log('from self')
    }
  }
})

vm.foo()  => "foo"
vm.bar()  => "bar"
vm.conflicting()  => "from self"

全局混合

 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({
  created: var myOption = .$options.myOption
    if (myOption) {
      console.log(myOption)
    }
  }
})

 Vue({
  myOption: 'hello!'
})
 => "hello!"

自定义选项合并策略

Vue.config.optionMergeStrategies.myOption =  (toVal,fromVal) {
   return mergedVal
}
var strategies = Vue.config.optionMergeStrategies
strategies.myOption = strategies.methods
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_65715.html