uniapp 混合mixins和继承extends详解

uniapp 混合mixins和继承extends详解
1. uniapp 混合mixins和继承extends详解vue提供了mixins、extends配置项。混合mixins和继承extends其实两个都可以理解为继承mixins接收对象数组可理解为多继承extends接收的是对象或函数可理解为单继承。uniapp中的extends用于单继承优先级高于mixins常用于创建派生组件或复用基础逻辑。官方文档https://uniapp.dcloud.net.cn/tutorial/vue3-api.html#%E9%80%89%E9%A1%B9-%E7%BB%84%E5%90%88官方文档https://cn.vuejs.org/api/options-composition#extends1.1. 继承钩子函数1.1.1. 示例constextend{created(){console.log(extends created)}}constmixin1{created(){console.log(mixin1 created)}}constmixin2{created(){console.log(mixin2 created)}}exportdefault{extends:extend,mixins:[mixin1,mixin2],name:app,created(){console.log(created)}}控制台输出extends created mixin1 created mixin2 created created1.1.2. 结论1优先调用mixins和extends继承的父类extends触发的优先级更高相对于是队列2push(extend, mixin1, minxin2, 本身的钩子函数)3经过测试 watch的值 继承规则一样。1.2. 继承methods1.2.1. 示例constextend{data(){return{name:extend name}}}constmixin1{data(){return{name:mixin1 name}}}constmixin2{data(){return{name:mixin2 name}}}// name nameexportdefault{mixins:[mixin1,mixin2],extends:extend,name:app,data(){return{name:name}}}// 只写出子类name mixin2 nameextends优先级高会被mixins覆盖exportdefault{mixins:[mixin1,mixin2],extends:extend,name:app}// 只写出子类name mixin1 namemixins后面继承会覆盖前面的exportdefault{mixins:[mixin2,mixin1],extends:extend,name:app}1.2.2. 结论1子类再次声明data中的变量都会被重写以子类的为准。2如果子类不声明data中的变量将会最后继承的父类为准。3经过测试 props中属性 、 methods中的方法 和 computed的值 继承规则一样。1.3. mixins、extends、extend1.3.1. mixins调用方式: mixins: [mixin1, mixin2]是对父组件的扩充包括methods、components、directive等。。。触发钩子函数时先调用mixins的函数再调用父组件的函数。虽然也能在创建mixin时添加data、template属性但当父组件也拥有此属性时以父为准从这一点也能看出制作者的用心扩充。data、methods内函数、components和directives等键值对格式的对象均以父组件/实例为准。1.3.2. extends调用方式: extends: CompA同样是对父组件的扩充与mixins类似但优先级均次于父组件。1.3.3. extend扩展组件的构造器。当我们调用vue.component(‘a’, {…})时自动调用。值得注意的是extend内的data为一个函数。