Vue3 Mixin的基础使用

作者: 温新

分类: 【Vue.js】

阅读: 3251

时间: 2021-08-11 14:50:14

作者:温新

时间:2021-08-11

hi,我是温新,一名PHPer

Vue3 Mixin官方定义为:Mixin 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个 mixin 对象可以包含任意组件选项。当组件使用 mixin 对象时,所有 mixin 对象的选项将被“混合”进入该组件本身的选项。

官方的解释不好理解阿,看例子吧。

<div id="app">
    {{ webName }}
</div>


<script>
    // 使用一个对象定义Mixin
    const myMixin = {
        data () {
            return {
                webName:'个人博客'
            }
        },
        created(){
            console.log('Mixin created')
        }
    };

    const app = Vue.createApp({
        // 组件上使用Mixin
        mixins:[myMixin],
        data () {
            return { webName:'自如初' }
        },
        created(){
            console.log('created')
        }
    });

    app.mount('#app');
</script>

使用Mixin需要知道:

1)组件中的data 优先级大于 mixin中的data;

2)组件中的 methhods 优先级大于 mixin中的methods;

3)生命周期函数,先执行 mixin 中定义的生命周期函数,后执行组件中的生命周期函数;

4)自定义属性,组件中的属性优先级 大于 mixin中定义的属性

全局Mixin

<div id="app"></div>

<script>

    const app = Vue.createApp({
        data () {
            return { webName:'自如初' }
        },
        template:`
        <div>
            {{ webName }}
        <hr>
        <mi-demo></mi-demo>   
        </div>
        `
    });

    // 全局mixin
    app.mixin({
        data () {
            return {
                name:'全局mixin中的name'
            }
        }
    });

    app.component('mi-demo', {
        // 使用全局mixin中的name
        template:`<div>{{ name }}</div>`
    });

    app.mount('#app');
</script>

自定义属性值

<div id="app"></div>

<script>
    // 使用一个对象定义Mixin
    const myMixin = {
        webUrl:'www.ziruchu.com'
    };

    const app = Vue.createApp({
        // 组件上使用Mixin
        mixins:[myMixin],
        // 自定义属性
        webUrl:'https://www.ziruchu.com',
        data () {
            return { webName:'自如初' }
        },
        template:`
        <div>
            {{ this.$options.webUrl }}
        </div>
        `
    });

    // 修改属性优先级
    app.config.optionMergeStrategies.webUrl = (mixinValue, appValue) => {
        // 优先返回mixin中的属性值
        return mixinValue || appValue;
    }
    app.mount('#app');
</script>

我是温新

第天进步一点,就一点点

请登录后再评论