Vue2高级用法
- mixin
- 示例一
- 示例二
- plugin插件
- 自定义指令
- vue-element-admin
- slot插槽
- filter过滤器
mixin
示例一
App.vue
<template>
<div id="app">
</div>
</template>
<script>
const mixin2={
created(){
console.log("mixin created");
}
}
export default {
name: 'App',
mixins:[mixin2],
data(){
return {
message:"inner Hello world"
}
},
created(){
console.log("inner created");
}
}
</script>
<style>
</style>
main.js
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
const mixin1={
created:function(){
console.log("global created");
console.log("message",this.$data.message);
}
}
Vue.mixin(mixin1)
new Vue({
render: h => h(App),
}).$mount('#app')
示例二
App.vue
<template>
<div id="app">
</div>
</template>
<script>
const mixin2={
created(){
// console.log("mixin created");
},
data(){
return {
message:"mixin message"
}
}
}
export default {
name: 'App',
mixins:[mixin2],
data(){
return {
message:"inner message"
}
},
created(){
// console.log("inner created");
}
}
</script>
<style>
</style>
main.js
import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
const mixin1={
created:function(){
// console.log("global created");
console.log("message",this.$data.message);
},
data(){
return{
message:"global message"
}
}
}
Vue.mixin(mixin1)
new Vue({
render: h => h(App),
}).$mount('#app')
global注入到new Vue实例上,然后在App.vue的实例中执行自己当前的data
与Vue实例执行顺序有关,先进行当前实例化声明(全局注入),然后再实例化声明的时候注入我们内部的mixin,是外部的的global更高一点
- 面试题:如果我们不想使用global进行注入的话,我们应该怎么做?(在Vue2中,除了mixin之外的话,如果不希望导致全局影响,还有什么方法避免这种问题?)
使用插件,插件化可以解决全局注入的问题
plugin插件
像Vue-router、Vuex等也是插件,通过插件注入进去的
Vue-router
Vue-router关于插件的内容
Vuex
- 如果要找源码的入口,可以找package.json中对应的入口
[Vuex的package.json
install的方法,将全部内容挂载到Vue的构造函数上,通过use方法挂载到Vue实例上
插件列表
自定义指令
全局中定义
局部中定义:
- bind:初始化调用
- unbind:解绑调用
- inserted:指定对应的元素->绑定到父节点的时候
App.vue:
<template>
<div>
<!-- foo.a.b 这里的.a,.b是修饰符,不是属性的意思,modifiers是对象,所以先后顺序无所谓 -->
<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
</div>
</template>
<script>
export default {
data() {
return {
message: 'hello!'
}
},
directives:{
demo:{
bind: function (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(', ')
console.log("vnode",vnode);
}
}
}
}
</script>
<style scoped>
</style>
vue-element-admin
权限验证:v-permission
插件化的方式注入的
指令实现的功能:
const checkPermission=(el,binding)=>{
const {value}=binding
if(value instanceof Array){
if(!value.length){
//没有内容就用父节点删除子节点
el.parentNode.removeChild(el)
}
const roles=store.rule; //当前用户的权限
//查找是否有权限
const hasPermission=roles.some(role=>value.includes(role))
//没有权限就删除
if(!hasPermission){
el.parentNode.removeChild(el)
}
}else{
throw new Error("type error")
}
}
Vue.directives('permission',{
inserted(el,binding){
checkPermission(el,binding)
},
update(el,binding){
checkPermission(el,binding)
}
})
Google搜索东西举例:github awesome vue directive 在源代码中寻找
slot插槽
v-slot:基于web components衍生出来的
就当做占位符来看待
作用域插槽已经废弃了
filter过滤器
<template>
<div>
{{ time|timeFormat }}
</div>
</template>
<script>
import dayjs from 'dayjs'
export default {
data() {
return {
time:1713401633460
}
},
filters:{
timeFormat(value,str="YYYY-MM-DD HH:mm:ss"){
return dayjs(value).format(str)
}
}
}
</script>
<style scoped>
</style>
要求:1.Vue官网自己过一遍