vue自定义指令和混入mixin
vue自定义指令
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<h2>自定义指令</h2>
<div id="app">
<!-- 使用指令 v-xxx -->
<input type="text" v-autofocus:username.navtive.stop="true">
<!-- v-pre 不解析语法 -->
<div v-pre>{{ username }}</div>
<!-- v-cloak 这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,
这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。-->
<div v-cloak>{{ username }}</div>
<!-- v-once 只渲染元素和组件一次。随后的重新渲染,元素/组件及其所有的子节点将被视为静态内容并跳过。
这可以用于优化更新性能。-->
<div v-once>{{ username }}</div>
</div>
<script>
/*
自定义指令
1、全局指令
Vue.directive(name, options)
2、局部指令
directives:{name: options} //options:{function | object}
3、钩子函数参数
el:指令所在的元素节点
binding:
1、name:指令名
2、value:指令值
3、expression:字符串形式的指令表达式
4、modifiers:指令修饰符
*/
// 全局自定义指令
Vue.directive('autofocus', {
// 初始化时执行 (默认)
bind(el, binding) {
// el:指令所在的元素节点 这里是input
// binding:指令的信息
console.log('el=', el)
console.log('binding=', binding)
},
// 元素插入页面时执行
inserted(el, binding) {
el.focus()
}
})
// 局部自定义指令
Vue.component('myform', {
data() { },
directives: {
autofocus: {
bind(el, binding) { },
inserted() { },
}
}
})
const vm = new Vue({
el: '#app',
data: {
username: 'fqniu'
}
})
</script>
</body>
</html>
vue的混入mixin
混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="../js/vue.js"></script>
</head>
<body>
<h2>混入</h2>
<div id="app">
<coma>
<com1></com1>
<com2></com2>
</coma>
</div>
<script>
/*
mixin 混入
1、全局 Vue.mixin(options)
2、局部 mixins:[minxin1,minxin2,...]
同名配置:
data -> 保留组件自己的配置 注意:不会改为混入的数据
template -> 会覆盖自己的配置
生命周期函数 都会执行一遍,不会覆盖
注意点:
全局注册一个混入,会影响后面所有创建的每个 Vue 实例/组件(影响较大,一般用于插件编写)
*/
// 全局混入
Vue.mixin({
data() {
return {
qty: 10
}
},
methods: {
getData() {
console.log('getData', this.name) // 依次打印 root coma coma1 coma2
}
},
created() {
this.getData();
}
});
// 局部混入
const myMixin = {
data() {
return {
type: 'myMixin',
name: 'myMixin'
}
},
mounted() {
console.log('myMixin mounted') // 打印两次 myMixin mounted
}
}
// 全局组件
Vue.component('coma', {
data() {
return {
name: 'coma',
}
},
template: `<div>
<h4 @click="getData">{{name}}-> {{qty}}</h4>
<coma1></coma1>
<coma2></coma2>
</div>`,
components: {
coma1: {
data() {
return {
name: 'coma1'
}
},
mixins: [myMixin],
template: `<div>{{name}}</div>`
},
coma2: {
data() {
return {
name: 'coma2'
}
},
template: `<div>{{name}}</div>`
}
}
});
const vm = new Vue({
el: '#app',
data: {
name: 'root'
},
mixins: [myMixin],
mounted() {
console.log('root mounted=', this.name) // 打印 root mounted= root
}
})
</script>
</body>
</html>
依次执行的函数打印
vue开发插件
/**
* 定义插件
* 插件可以是一个对象(必须提供 install 方法)。也可以是一个函数,它会被作为 install 方法。
并把 Vue 作为参数传入
* 使用插件:Vue.use(plugin)
* 调用Vue.use()方法,内部会自动执行install
*/
Vue.js 的插件应该暴露一个 install 方法。这个方法的第一个参数是 Vue 构造器,第二个参数是一个可选的选项对象:
MyPlugin.install = function (Vue, options) {
// 1. 添加全局方法或 property
Vue.myGlobalMethod = function () {
// 逻辑...
}
// 2. 添加全局资源
Vue.directive('my-directive', {
bind (el, binding, vnode, oldVnode) {
// 逻辑...
}
...
})
// 3. 注入组件选项
Vue.mixin({
created: function () {
// 逻辑...
}
...
})
// 4. 添加实例方法
Vue.prototype.$myMethod = function (methodOptions) {
// 逻辑...
}
}
使用插件
通过全局方法 Vue.use() 使用插件。它需要在你调用 new Vue() 启动应用之前完成:
// 调用 `MyPlugin.install(Vue)`
Vue.use(MyPlugin)
new Vue({
// ...组件选项
})
也可以传入一个可选的选项对象:
Vue.use(MyPlugin, { someOption: true })
Vue.js 官方提供的一些插件 (例如 vue-router) 在检测到 Vue 是可访问的全局变量时会自动调用 Vue.use()。然而在像 CommonJS 这样的模块环境中,你应该始终显式地调用 Vue.use():
// 用 Browserify 或 webpack 提供的 CommonJS 模块环境时
var Vue = require('vue')
var VueRouter = require('vue-router')
// 不要忘了调用此方法
Vue.use(VueRouter)