美文网首页
Vue3的mixin

Vue3的mixin

作者: 技术小王 | 来源:发表于2021-09-09 19:18 被阅读0次

小编在之前的项目中还没有接触过minxin(数据混入),直到一次面试的时候,面试官问我,我才注意到,原来还有这样的一个东西,今天小编就和大家一起看看这个神奇的mixin。个人感觉mixin和组件的注册和使用很类似,我们要注册一个局部的mixin的时候,可以这样。大家还可以关注我的微信公众号,蜗牛全栈。

// 组件data和methods优先级高于mixin中的data优先级,组件和mixin数据同时存在的时候,使用组件中的data数据,如果组件内部没有data,使用mixin中的数据
// 声明周期函数,先执行mixin里面的,再执行组件里面的生命周期函数
const myMinxin = {
   data(){
       return {
           num: 2
       }
   },
   created(){
       console.log('mixin created')
   },
   methods:{
       handleClick(){
           console.log('mixin handleClick')
       }
   }
}


const app = Vue.createApp({
   data(){
       return {
           num: 1
       }
   },
   mixins:[myMinxin],
   methods:{
       handleClick(){
           console.log('handleClick')
       }
   },
   created(){
       console.log('created')
   },
   template:`<div>{{ num }}</div>
           <button @click="handleClick">点击</button>`
})

const vm = app.mount('#root')

之所以叫上面的组件为局部组件,是因为只能在哪个组件内注册,在哪个组件内部使用,在有子组件的时候,并不能获取到数据混入的数据,就像这样

const myMinxin = {
   data(){
       return {
           num: 2,
           count:66
       }
   },
   created(){
       console.log('mixin created')
   },
   methods:{
       handleClick(){
           console.log('mixin handleClick')
       }
   }
}


const app = Vue.createApp({
   data(){
       return {
           num: 1
       }
   },
   mixins:[myMinxin],
   methods:{
       handleClick(){
           console.log('handleClick')
       }
   },
   created(){
       console.log('created')
   },
   template:`<div>{{ num }}</div>
           <child />
           <button @click="handleClick">点击</button>`
})

app.component('child',{
   template:`<div>{{ count }}</div>` // 这个时候,就获取不到了,因为是在组件内部定义的,可以理解成局部的mixin。如果想用的话,需要在子组件中,也用一个mixin
})

const vm = app.mount('#root')

类似组件,那我们想全局注册一个mixin,要怎么写呢?

const app = Vue.createApp({
   data(){
       return {
           num: 1
       }
   },
   methods:{
       handleClick(){
           console.log('handleClick')
       }
   },
   created(){
       console.log('created')
   },
   template:`<div>{{ num }}</div>
           <child />
           <button @click="handleClick">点击</button>`
})

app.component('child',{
   template:`<div>{{ count }}</div>`
})
// 通过app.mixin注册全局mixin
app.mixin({
   data(){
       return {
           num: 2,
           count:66
       }
   },
   created(){
       console.log('mixin created')
   },
   methods:{
       handleClick(){
           console.log('mixin handleClick')
       }
   }
})

const vm = app.mount('#root')

从上面的几个例子,我们知道,不管是全局mixin还是局部mixin,如果组件和mixin中同时存在相同的数据,组件内的数据优先级总是高于mixin中的数据,那么有没有什么办法,让mixin内的数据优先级高于组件内呢,答案是肯定的,我们可以修改Vue的配置,就像这样

const myMinxin = {
   num: 2,
}
const app = Vue.createApp({
   num: 1,
   mixins:[myMinxin],
   methods:{
       handleClick(){
           console.log('handleClick')
       }
   },
   created(){
       console.log('created')
   },
   template:`<div>{{ this.$options.num }}</div> // this.$options.num
           <button @click="handleClick">点击</button>`
})

// 修改num中的数据混入和data中的策略
app.config.optionMergeStrategies.num = (mixinVal,appValue) => {
   return mixinVal || appValue
}

const vm = app.mount('#root')

相关文章

  • vue3 hook函数

    Vue3 的 hook函数 相当于 vue2 的 mixin, 不同在与 hooks 是函数 Vue3 的 hoo...

  • Vue3——Hook函数 & 生命周期 & toRef和toRe

    一、Hook函数 Vue3 的hook函数相当于 vue2 的 mixin,不同点在于hooks是函数。Vue3的...

  • Vue3的mixin

    小编在之前的项目中还没有接触过minxin(数据混入),直到一次面试的时候,面试官问我,我才注意到,原来还有这样的...

  • Vue3中的自定义指令

    有了前面组件、mixin的基础之后,再来了解今天小编要说的内容,就相对容易一些,今天小编和大家一起学习Vue3中的...

  • 【译文】关于Mixin

    文章来源:Mixin 主页https://mixin.one/xin About Mixin Mixin is a...

  • MIXIN 白皮书连载之域解读

    Mixin 域 (Mixin Domain)Mixin 域为 Mixin 内核提供资产的分布式账本。这些资产可以是...

  • 混合 mixin

    定义mixin 通过@include 名字 调用mixin mixin使用参数

  • Vue mixin 混入及自定义Vue插件

    一、mixin混入 mixin即合并公共方法: 可以设置通用的方法或者变量外部mixin 如下:全局mixin:V...

  • 《Java编程思想 Generics》读书笔记——Mixin

    何谓Mixin Mixin即mix in,混入的意思。和多重继承类似,但通常混入Mixin的类和Mixin类本身不...

  • SCSS

    变量 mixin mixin 基本用法 mixin 传一个参数 mixin 传多个参数 extend 基础知识 简...

网友评论

      本文标题:Vue3的mixin

      本文链接:https://www.haomeiwen.com/subject/kakwwltx.html