vue2.x之mixin混入

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

功能

混入可以将多个组件中的公共配置提取成一个混入对象。这样就可以实现代码的复用。

语法

混入和过滤器等配置类似,也有两种使用方式:全局混入和局部混入。

首先注册一个mixin对象

const mixin = {
  data() {
    return {
      mixinData: {
        name: '儿子',
        msg: '我是你爸爸'
      }
    };
  },
  created() {
    console.log('混入的created');
  },
  methods: {
    sayHello() {
      console.log('我是混入的sayHello');
    }
  }
};
export default mixin;

1. 全局混入

⏰ 语法

Vue.mixin(mixin)

⏰ 参数

其中参数mixin是一个对象,里面包含混入的所有组件配置。

⏰ 说明

全局注册一个混入,影响注册之后所有创建的每个 Vue 实例。使用混入可以向组件注入自定义的行为。⚠️ 但是不推荐在应用代码中使用

⏰ 使用方法

  • 在main.js中全局混入
    import mixin from './mixin/data';
    Vue.mixin(mixin);
  • 组件中使用
    <template>
      <div class="hello">
        <button @click="sayHello">点我打印信息</button>
      </div>
    </template>
    
    <script>
    export default {
      name: 'HelloWorld',
      data() {
        return {
        }
      }
    }
    </script>

    这样所有组件就能使用混入配置了。效果如下:

     

❗️ 说明:上面效果图中打印了三遍是因为使用的组件是个子组件,它的父组件也加载了created方法。因此mixin在实际生产环境中不建议使用全局混入。

2. 局部混入

将定义好的混入对象引入要用的组件。它和全局混入的方式不同的是,它不需要在main.js中引入。

⏰ 语法

mixins: [mixin]

⏰ 参数说明

同全局混入一样,其中参数mixin是一个对象,里面包含混入的所有组件配置。

⏰ 使用方法

在组件中引入并使用

<template>
  <div class="hello">
    <button @click="sayHello">点我打印信息</button>
  </div>
</template>

<script>
import mixin from '../mixin/data';
export default {
  name: 'HelloWorld',
  mixins: [mixin],
  data() {
    return {
    }
  }
}
</script>

效果如图:

 

混入规则

1. 数据对象内部,如果是基本类型的变量,那么组件中变量会覆盖混入中定义的变量。如果是引用数据类型,在内部会进行递归合并,并在发生冲突时以组件数据优先。

⏰ 混入

// 混入组件
const mixin = {
  data() {
    return {
      name: '儿子',
      msg: {
        name: '刘亦菲',
        age: 16
      }
    };
  },
  created() {
    console.log('混入的created');
  },
  methods: {
    sayHello() {
      console.log('我是混入的sayHello');
    }
  }
};

export default mixin;

⏰ 组件

// 组件
<template>
  <div class="hello">
    <button @click="sayHello">点我打印信息</button>
    <p>{{name}}</p>
    <p v-for="(item, index) in msg" :key="index">{{item}}</p>
  </div>
</template>

<script>
import mixin from '../mixin/data';
export default {
  name: 'HelloWorld',
  mixins: [mixin],
  data() {
    return {
      name: '女儿',
      msg: {
        name: '张雨彤',
        title: '我是乖乖女'
      }
    }
  }
}
</script>

⏰ 效果如下:

 

2. 生命周期钩子冲突时,会执行两遍,先执行混入中的,然后执行组件中的。

⏰ 混入

// 混入组件
const mixin = {
  data() {
    return {
      name: '儿子',
      msg: {
        name: '刘亦菲',
        age: 16
      }
    };
  },
  created() {
    console.log('混入的created');
  },
  methods: {
    sayHello() {
      console.log('我是混入的sayHello');
    }
  }
};

export default mixin;

⏰ 组件

// 组件
<template>
  <div class="hello">
    <button @click="sayHello">点我打印信息</button>
    <p>{{name}}</p>
    <p v-for="(item, index) in msg" :key="index">{{item}}</p>
  </div>
</template>

<script>
import mixin from '../mixin/data';
export default {
  name: 'HelloWorld',
  mixins: [mixin],
  data() {
    return {
      name: '女儿',
      msg: {
        name: '张雨彤',
        title: '我是乖乖女'
      }
    }
  },
  created() {
    console.log('组件的created');
  }
}
</script>

⏰ 效果如下:

3. 值为对象的其他配置,比如methods等,会合并成一个对象,然后取组件中的键值执行。

⏰ 混入

// 混入组件
const mixin = {
  data() {
    return {
      name: '儿子',
      msg: {
        name: '刘亦菲',
        age: 16
      }
    };
  },
  created() {
    console.log('混入的created');
  },
  methods: {
    sayHello() {
      console.log('我是混入的sayHello');
    }
  }
};

export default mixin;

⏰ 组件

// 组件
<template>
  <div class="hello">
    <button @click="sayHello">点我打印信息</button>
    <p>{{name}}</p>
    <p v-for="(item, index) in msg" :key="index">{{item}}</p>
  </div>
</template>

<script>
import mixin from '../mixin/data';
export default {
  name: 'HelloWorld',
  mixins: [mixin],
  data() {
    return {
      name: '女儿',
      msg: {
        name: '张雨彤',
        title: '我是乖乖女'
      }
    }
  },
  created() {
    console.log('组件的created');
  },
  methods: {
    sayHello() {
      console.log('我是组件的sayHello');
    }
  }
}
</script>

⏰效果如下:

 

 

posted on 2024-07-10 15:29  梁飞宇  阅读(77)  评论(0)    收藏  举报