经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » JavaScript » 查看文章
vue3.0 mixin 混入
来源:cnblogs  作者:阡陌夕殇  时间:2020/12/28 9:51:10  对本文有异议

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

通俗来讲,就是 mixin 中的属性,比如 data、methods 或者自定义属性,将被混入到全部或者指定的组件中,让这些组件可以调用 mixin 中所定义的属性或者事件

全局 mixin

首先,我们直接定义全局的 mixin

  1. // 定义全局 mixin
  2. app.mixin({
  3. message: 'mixin',
  4. data() {
  5. return {
  6. count: 100,
  7. };
  8. },
  9. });

混入 data

全局mixin默认会混入所有组件中,接下来,我们再定义一个组件,模板中插入 message 字段,如下所示:

  1. const app = Vue.createApp({
  2. template: `
  3. <div>{{message}}</div>
  4. `,
  5. });

此时mixin中的data属性将会混入到组件中,虽然组件的 data 中并没有包含 message 字段,但是在运行的页面中依然显示出 message 的值 mixin message。现在,我们在组件内部的 data 中也添加 message 字段。

  1. const app = Vue.createApp({
  2. data() {
  3. return {
  4. message:'app message'
  5. }
  6. }
  7. ...
  8. });

这时候,运行页面,模板中的内容将显示组件中 data 里的值 app message,这说明,组件内部 data 的优先级是高于 mixin 内部 data 的优先级的。

混入事件(methods)

同样的,我们也可以一下测试事件的优先级

  1. const app = Vue.createApp({
  2. ...
  3. methods: {
  4. handleClick() {
  5. console.log('app click');
  6. }
  7. },
  8. // 这里点击元素,会打印出 "app click"
  9. template: "<div @click="handleClick">{{message}}</div>"
  10. });
  11. // 定义全局 mixin
  12. app.mixin({
  13. ...
  14. methods: {
  15. handleClick() {
  16. console.log('mixin click');
  17. }
  18. }
  19. });

点击div,将会打印出 app click ,这说明当 mixin 中和组件中都存在 handleClick 事件时,组件中同名事件优先级会比较高。

混入生命周期函数(created、mounted 等)

下面,我们同时在 mixin 和 app 中定义 created 函数

  1. const app = Vue.createApp({
  2. ...
  3. created() {
  4. console.log("app created");
  5. }
  6. });
  7. // 定义全局 mixin
  8. app.mixin({
  9. created() {
  10. ...
  11. console.log("mixin created");
  12. }
  13. });

运行此页面,打印台会输出

  1. mixin created
  2. app created

也就是说,mixin中的生命周期钩子函数与 app 组件中的钩子函数都会运行,mixin 优先执行

混入自定义属性

我们还可以直接在 mixin 和 app 组件中自定义属性。自定义属性在模板中需要用 $options[prop] 的方式调用

  1. const app = Vue.createApp({
  2. message: "app message",
  3. template: "<div @click="handleClick">{{$options.message}}</div>"
  4. });
  5. // 定义全局 mixin
  6. app.mixin({
  7. message: "mixin message"
  8. });

运行页面,模板将会展示 app 组件中 message 中的值 app message ,可见,自定义属性也是组件比 mixin 优先级高。

修改自定义属性合并策略

如果我们想让 mixin 的优先级高于组件的优先级,我们可以通过以下代码进行修改

  1. app.config.optionMergeStrategies.message = (mixinVal, appVal) => {
  2. return mixinVal || appVal;
  3. };

合并策略方法中接受两个参数,第一个参数为 mixin 自定义属性值,第二个参数为 app 组件自定义属性值,用户可以通过方法判断来返回哪个值,来定义自定义属性的优先级。

上面代码定义了如果 mixinVal 有值则返回 mixinValue,否则返回 appVal,所以模板中显示的应该的是 mixin message

局部组件

局部组件的定义,需要显式声明进组件内。

  1. // 1. 声明局部组件变量
  2. const MyMixin = {
  3. data() {
  4. return {
  5. };
  6. },
  7. created() {
  8. console.log('mixin created');
  9. },
  10. methods: {
  11. handleClick() {
  12. },
  13. },
  14. };
  15. // 2. 通过mixins属性注入到要被混合组件中
  16. const app = Vue.createApp({
  17. mixins: [myMixin]
  18. })

除了需要通过 mixins 属性注入,其他与全局组件无差异,所以不在单独阐述。

缺陷

mixin可以将部分组件抽成可重用块,但是他也有不可避免的问题。

  1. mixin很容易发生冲突,你会不清晰某个值到底是从 mixin 还是 app 来的。
  2. 可重用性有限,不能通过传递参数修改 mixin 的逻辑,降低了抽象逻辑的灵活性。

总结

这篇文章,我们讲了如下几点:

  1. mixin的概念及定义
  2. 混入 data、methods、生命周期函数
  3. 混入自定义属性,修改自定义属性的混合策略
  4. 全局 mixin 及 局部 mixin 定义方式
  5. mixin 的缺陷

原文链接:http://www.cnblogs.com/mengxudong/p/14196769.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号