Vue Mixin 与微信小程序 Mixins 应用

> #### # 什么是Mixin(混入)

Mixin是一种思想,用来实现代码高度可复用性,可以针对属性复制实现代码复用的想法进行一个扩展,就是混入(mixin)。混入并不是复制一个完整的对象,而是从多个对象中复制出任意的成员并将这些成员组合成一个新的对象。

```

const obj1 = {a:1,b:2,c:3,d:4,e:5};

const obj2 = {f:6,g:7,h:8,i:9,a:10};

let obj3 = {};

Object.assign(obj3,obj1,obj2);

console.log(obj3);

// 输出结果 {"a":10,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9};

```

上面是一个对象混入,把两个对象,合并成一个对象,如果有相同属性存在则后者会覆盖原有的属性值,如果存在方法名相同同样会覆盖,因为在对象内部是以key来区分的,并且每个key是唯一的。

> #### # 为什么要使用混入

> Mixin的优点

混入可以减少程序中重复的功能,增强函数的复用性。当一个应用程序可能需要在各种对象中共享行为时,我们可以通过Mixin中维持这种共享功能并专注于程序中真正不同的功能,轻松避免任何重复,使项目结构更加清晰更加易于维护。

> Mixin的缺点

Mixin是一种很灵活的代码复用方式,但把功能属性和方法导入,如果文件过多,会导致属性方法来源方面的不确定性,在大型系统中需要对项目文件的划分以及整体的掌控。

> #### # Vue Mixins 应用

> 官方解释

混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

> dome

mixins.js

```

export default {

data: function () {

return {

message: ‘hello‘,

foo: ‘abc‘

}

}

}

```

index.js

```

new Vue{

mixins: [mixin],

data: function () {

return {

message: ‘goodbye‘,

bar: ‘def‘

}

},

created: function () {

console.log(this.$data)

// => { message: "goodbye", foo: "abc", bar: "def" }

}

}

```

在实际项目中可以根据业务领域把相同的业务场景按文件进行划分,比如好多页面都需要插入/删除/更改,这些方法都是相同的,可以单独放在一个js文件里面去统一的管理。

再举一个例子,比如有很多页面里面都有表单,然而这些页面内的表单都需要方法去校验,每个页面都写一次的话,会导致大量的重复代码的出现,而且不易于管理,维护,我们可以把所有的表单的校验方法放在一个js文件里面导出去,哪些组件或者页面需要进行格式校验,使用mixin混入这些方法。即使是以后需要添加或者更改校验方法就直接更改这个js文件就好了。

唯一一点很重要的就是,混入的方法会覆盖掉之前页面内部的同名属性或方法。

[Vue Mixins 文档](https://cn.vuejs.org/v2/guide/mixins.html)

> #### # 小程序Mixins应用

小程序的Page并没有给出混入的API以及解方案,如果想要实现混入,需要自己封装Mixins方法,来实现对象方法以及属性的混入,达到代码的复用的目的。

> Mixins实现

在小程序初始化使用App去创建每个页面,通过Page可以获取到创建页面时所需要的属性和方法,如果把Page看做是一个函数,然而在函数里面写的方法或者属性,其实都放在了一个对象里面,data也好方法也好其实都是这个对象里面唯一的属性和方法,为页面提供消费。

```

export let CreatePage = (obj) => {

let {mixins} = obj;

Reflect.deleteProperty(obj, ‘mixins‘);

obj.data = obj.data || {};

mixins.forEach((el) => {

merge(el,obj)

})

return obj;

}

let merge = (el,obj) => {

let elKeys = Object.keys(el);

el.data = el.data || {};

elKeys.forEach((e) => {

e === "data" && Object.assign(obj.data,el.data);

(e !== "data") && (obj[e] = el[e]);

})

}

```

上面代码中创建了一个名为CreatePage的函数,函数接收了一个对象作为参数,然而这个对象就是我们在使用Page的时候传入供页面消费的对象,在对象内部添加了一个属性Mixins,这个属性是一个数组,里面的每一项都是需要混入到里面的属性和方法。遍历Mixins数组,获取到其中的每一项,使用merge函数把里面的每一项都进行合并。由于data是一个对象,直接和并可能会导致只有合并后的data数据,合并之前的数据丢失,所以做了判读如果遇到data就单独去处理data的合并。其他的属性或者方法直接合并到obj里面,最后把obj返回出去。

> 应用

index.js

```

// 引入mixin

import {CreatePage} from "../../utils/mixin.js";

// 引入静态数据 mixin1

import mixin1 from "../../mixins/public/mixin1.js";

Page(CreatePage({

mixins:[mixin1],

data:{

one:"我是index里面的数据"

},

a(){

console.log("我是a函数",this.data.two)

},

onLoad(){

this.a();

this.b();

}

}))

```

mixin1.js

```

module.exports = {

data:{

two:"我是Mixin里面的数据"

},

b(){

console.log("我是b函数",this.data.one)

}

}

```

通过这种方法可以把项目中业务重复的方法以及静态数据放到mixins文件中,统一管理统一维护。一旦项目需求发生变化更改一个地方就可以了,没有必要在成百行代码中找到某行代码,无疑是增加大量的查找以及修改的作业。

> mixins 改进

```

let native = Page;

Page = (obj) => {

let {mixins = []} = obj;

let merge = new Merge();

Reflect.deleteProperty(obj, "mixins");

let pageData = mixins.length<=0?obj:merge.start(obj,...mixins);

native(pageData);

}

class Merge {

constructor(){}

start(rootObj,...objs){

let root = {};

objs.forEach((el) => {

root = Merge.recursive(rootObj,el);

})

return root;

}

static recursive = (rootObj,obj) => {

for(let attr in obj){

if(rootObj[attr] === undefined){

rootObj[attr] = obj[attr];

}

else if(Merge.isObject(obj[attr])){

Merge.recursive(rootObj[attr],obj[attr])

}

else{

rootObj[attr] = obj[attr];

}

}

return rootObj;

}

static isObject = (obj) => {

return Object.prototype.toString.call(obj).includes("Object");

}

}

```

在第一种方法上做了进一步的改进,上面的代码中首先存储了一份Page函数,然后获取到Page里面的参数进行深度拷贝处理,深度拷贝完毕之后,把拷贝后的对象return出去。把存储的Page执行一下,最后把合并后的data传进去就好了。

> 改进应用

index.js

```

// 引入静态数据 mixin1

import mixin1 from "../../mixins/public/mixin1.js";

Page({

mixins:[mixin1],

data:{

one:"我是index里面的数据"

},

a(){

console.log("我是a函数",this.data.two)

},

onLoad(){

this.a();

this.b();

}

})

```

mixin1.js

```

module.exports = {

data:{

two:"我是Mixin里面的数据"

},

b(){

console.log("我是b函数",this.data.one)

}

}

```

改进之后无需再使用createPag函数,之前使用Page的时候,使用方法是一样的,只是里面添加一个`mixins`属性而已,用来混入那些公用的属性或者方法。

> 优点

代码改进后不仅仅只有Page可以使用呢mixins,`Component`也可以通过上面的方法,重新改写一下`Component`在组件中使用mixins。

> 总结

随然mixins模式,使代码变得复用性很强,但是任何事物都有两面性,如果只是为了应用而应用的话很可能会适得其反,没有达到理想的效果。个人认为,强大的文档有助于将与混入函数来源有关的困惑减至最低,但对于每一种模式,如果在实现期间多加注意,多做考虑,一定会应用的很顺利的。

Vue Mixins 与微信小程序 Mixins 应用

Vue Mixin 与微信小程序 Mixins 应用

# 什么是Mixin(混入)

Mixin是一种思想,用来实现代码高度可复用性,可以针对属性复制实现代码复用的想法进行一个扩展,就是混入(mixin)。混入并不是复制一个完整的对象,而是从多个对象中复制出任意的成员并将这些成员组合成一个新的对象。

const obj1 = {a:1,b:2,c:3,d:4,e:5};
const obj2 = {f:6,g:7,h:8,i:9,a:10};
let obj3 = {};
Object.assign(obj3,obj1,obj2);
console.log(obj3);
// 输出结果 {"a":10,"b":2,"c":3,"d":4,"e":5,"f":6,"g":7,"h":8,"i":9};

上面是一个对象混入,把两个对象,合并成一个对象,如果有相同属性存在则后者会覆盖原有的属性值,如果存在方法名相同同样会覆盖,因为在对象内部是以key来区分的,并且每个key是唯一的。

# 为什么要使用混入

Mixin的优点

混入可以减少程序中重复的功能,增强函数的复用性。当一个应用程序可能需要在各种对象中共享行为时,我们可以通过Mixin中维持这种共享功能并专注于程序中真正不同的功能,轻松避免任何重复,使项目结构更加清晰更加易于维护。

Mixin的缺点

Mixin是一种很灵活的代码复用方式,但把功能属性和方法导入,如果文件过多,会导致属性方法来源方面的不确定性,在大型系统中需要对项目文件的划分以及整体的掌控。

# Vue Mixins 应用

官方解释

混入 (mixins) 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。

dome

mixins.js

export default {
  data: function () {
    return {
      message: ‘hello‘,
      foo: ‘abc‘
    }
  }
}

index.js

new Vue{
  mixins: [mixin],
  data: function () {
    return {
      message: ‘goodbye‘,
      bar: ‘def‘
    }
  },
  created: function () {
    console.log(this.$data)
    // => { message: "goodbye", foo: "abc", bar: "def" }
  }
}

在实际项目中可以根据业务领域把相同的业务场景按文件进行划分,比如好多页面都需要插入/删除/更改,这些方法都是相同的,可以单独放在一个js文件里面去统一的管理。

再举一个例子,比如有很多页面里面都有表单,然而这些页面内的表单都需要方法去校验,每个页面都写一次的话,会导致大量的重复代码的出现,而且不易于管理,维护,我们可以把所有的表单的校验方法放在一个js文件里面导出去,哪些组件或者页面需要进行格式校验,使用mixin混入这些方法。即使是以后需要添加或者更改校验方法就直接更改这个js文件就好了。

唯一一点很重要的就是,混入的方法会覆盖掉之前页面内部的同名属性或方法。

Vue Mixins 文档

# 小程序Mixins应用

小程序的Page并没有给出混入的API以及解方案,如果想要实现混入,需要自己封装Mixins方法,来实现对象方法以及属性的混入,达到代码的复用的目的。

Mixins实现

在小程序初始化使用App去创建每个页面,通过Page可以获取到创建页面时所需要的属性和方法,如果把Page看做是一个函数,然而在函数里面写的方法或者属性,其实都放在了一个对象里面,data也好方法也好其实都是这个对象里面唯一的属性和方法,为页面提供消费。

export let CreatePage = (obj) => {
    let {mixins} = obj;
    Reflect.deleteProperty(obj, ‘mixins‘);
    obj.data = obj.data || {};
    mixins.forEach((el) => {
        merge(el,obj)
    })
    return obj;
}
let merge = (el,obj) => {
    let elKeys = Object.keys(el);
    el.data = el.data || {};
    elKeys.forEach((e) => {
        e === "data" && Object.assign(obj.data,el.data);
        (e !== "data") && (obj[e] = el[e]);
    })
}

上面代码中创建了一个名为CreatePage的函数,函数接收了一个对象作为参数,然而这个对象就是我们在使用Page的时候传入供页面消费的对象,在对象内部添加了一个属性Mixins,这个属性是一个数组,里面的每一项都是需要混入到里面的属性和方法。遍历Mixins数组,获取到其中的每一项,使用merge函数把里面的每一项都进行合并。由于data是一个对象,直接和并可能会导致只有合并后的data数据,合并之前的数据丢失,所以做了判读如果遇到data就单独去处理data的合并。其他的属性或者方法直接合并到obj里面,最后把obj返回出去。

应用

index.js

// 引入mixin
import {CreatePage} from "../../utils/mixin.js";
// 引入静态数据 mixin1
import mixin1 from "../../mixins/public/mixin1.js";
Page(CreatePage({
    mixins:[mixin1],
    data:{
        one:"我是index里面的数据"
    },
    a(){
        console.log("我是a函数",this.data.two)
    },
    onLoad(){
        this.a();
        this.b();
    }
}))

mixin1.js

module.exports = {
    data:{
        two:"我是Mixin里面的数据"
    },
    b(){
        console.log("我是b函数",this.data.one)
    }
}

通过这种方法可以把项目中业务重复的方法以及静态数据放到mixins文件中,统一管理统一维护。一旦项目需求发生变化更改一个地方就可以了,没有必要在成百行代码中找到某行代码,无疑是增加大量的查找以及修改的作业。

mixins 改进

let native = Page;
Page = (obj) => {
    let {mixins = []} = obj;
    let merge = new Merge();
    Reflect.deleteProperty(obj, "mixins");
    let pageData = mixins.length<=0?obj:merge.start(obj,...mixins);
    native(pageData);
}
class Merge {
    constructor(){}
    start(rootObj,...objs){
        let root = {};
        objs.forEach((el) => {
            root = Merge.recursive(rootObj,el);
        })
        return root;
    }
    static recursive = (rootObj,obj) => {
        for(let attr in obj){
            if(rootObj[attr] === undefined){
                rootObj[attr] = obj[attr];
            }
            else if(Merge.isObject(obj[attr])){
                Merge.recursive(rootObj[attr],obj[attr])
            }
            else{
                rootObj[attr] = obj[attr];
            }
        }
        return rootObj;
    }
    static isObject = (obj) => {
        return Object.prototype.toString.call(obj).includes("Object");
    }
}

在第一种方法上做了进一步的改进,上面的代码中首先存储了一份Page函数,然后获取到Page里面的参数进行深度拷贝处理,深度拷贝完毕之后,把拷贝后的对象return出去。把存储的Page执行一下,最后把合并后的data传进去就好了。

改进应用

index.js

// 引入静态数据 mixin1
import mixin1 from "../../mixins/public/mixin1.js";
Page({
    mixins:[mixin1],
    data:{
        one:"我是index里面的数据"
    },
    a(){
        console.log("我是a函数",this.data.two)
    },
    onLoad(){
        this.a();
        this.b();
    }
})

mixin1.js

module.exports = {
    data:{
        two:"我是Mixin里面的数据"
    },
    b(){
        console.log("我是b函数",this.data.one)
    }
}

改进之后无需再使用createPag函数,之前使用Page的时候,使用方法是一样的,只是里面添加一个mixins属性而已,用来混入那些公用的属性或者方法。

优点

代码改进后不仅仅只有Page可以使用呢mixins,Component也可以通过上面的方法,重新改写一下Component在组件中使用mixins。

总结

随然mixins模式,使代码变得复用性很强,但是任何事物都有两面性,如果只是为了应用而应用的话很可能会适得其反,没有达到理想的效果。个人认为,强大的文档有助于将与混入函数来源有关的困惑减至最低,但对于每一种模式,如果在实现期间多加注意,多做考虑,一定会应用的很顺利的。

???企企csvcsvcsvcsvcsvcsv

原文地址:https://www.cnblogs.com/aaron---blog/p/9406545.html

时间: 2024-10-07 19:45:12

Vue Mixin 与微信小程序 Mixins 应用的相关文章

MPVUE - 使用vue.js开发微信小程序

MPVUE - 使用vue.js开发微信小程序 什么是mpvue? mpvue 是美团点评前端团队开源的一款使用 Vue.js 开发微信小程序的前端框架.框架提供了完整的 Vue.js 开发体验,开发者编写 Vue.js 代码,mpvue 将其解析转换为小程序并确保其正确运行. 简单上手mpvue 官方提供了一套quickstart模板. vue init mpvue/mpvue-quickstart my-project 安装好依赖之后,执行npm run dev,将会将小程序文件打包进dis

微信小程序内嵌网页的一些(最佳)实践

前言 3 个月前,微信小程序推出了 web-view 组件引发了一波小高潮,笔者所在的大前端团队写过一篇浅析,详情可见:浅谈微信小程序前端生态. 我们曾大胆猜想,这一功能,可能直接导致小程序数量增长迎来一波高峰. 毕竟磨刀霍霍却一直资源不足的团队应该不少,现在可以把已有 H5 应用嵌入到小程序 web-view 容器中,以最低的开发成本坐蹭微信流量红利,何乐而不为呢? 我们也曾畅想也许"小程序页面+ web 页"混合开发(甚至 web 更重)会成为以后的新趋势. 2M 代码限制(如今已

微信小程序开发总结(附源代码)

最近公司项目不是很忙,有时间研究研究微信小程序.参考了目前市场上各类答题类的app.小程序等等,做了一款自己的微信答题小程序,包括前端和后端,后端是用node做的.现在已经上线了,名字叫[你问我猜猜猜],大家感兴趣的话可以去试玩一下. 会vue.react, 微信小程序,so easy 如果之前用过vue或者react,直接看看文档上手微信小程序完全没问题.整体开发思路很相似,包括其中的一些语法,基本上都是一样的.或者用美团的mpvue框架,那就根本不用学习小程序的语法了,写起来跟vue一样.但

微信小程序之初探(常见语法 VS vue)常见问题(点击不生效,数据绑定)

最近在调研微信小程序开发,对于一个前端小白来说,在各种框架都还用不熟的情况下,再来开发小程序确实还是不容易. 小程序出来之初,听过演讲,看过一点点儿视频,感觉和angular语法有点相似(PS:那是也是只了解一点点儿angular语法): 近两天开始尝试开发小程序,讲真,语法和angular和vue都很相似,小程序提供的语法现在还算全面,很多方法都有提供: 下面简述一下常用方法的使用: 一:数据绑定: html js 直接把数据写在data里面就行了,这样数据可以直接渲染到页面上, 那么问题来了

微信小程序如何像vue一样在动态绑定类名

微信小程序如何像vue一样在动态绑定类名 更新时间:2018年04月17日 14:08:44 这篇文章主要介绍了微信小程序如何像vue一样在动态绑定类名,文中给大家提到了vue与微信小程序的区别,需要的朋友可以参考下 小程序 开发中遇到这样一个问题... 排行榜开发的时候,前三名的样式不同,其余的样式一样.但是都是通过同一元素来遍历的,当时卡了一下.后来发现有module模块化这一概念,于是查了下api,一下子就做出来了. 就是不同名次上边的样式根据实际情况展示效果. 模块化 我们可以将一些公共

去除富文本中的html标签及vue、react、微信小程序中的过滤器

在获取富文本后,又只要显示部分内容,需要去除富文本标签,然后再截取其中一部分内容:然后就是过滤器,在微信小程序中使用还是挺多次的,在vue及react中也遇到过 1.富文本去除html标签 去除html标签及?空格 let richText = ' <p style="font-size: 25px;color: white">&nbsp; &nbsp; &nbsp; &nbsp;sdaflsjf的丰富及饿哦塞尔</p><s

vue中进行判断不同字段的判断,主要是区分于微信小程序和网页版之间写法

网页版的vue字段的判断的写法如下: v-if="item.scoreItemState == 0" v-if="item.scoreItemState == 1" 微信小程序中的vue字段的判断的写法 注意:一定要带双花括号{{}} wx:if="{{item.scoreItemState == 0}}" wx:if="{{item.scoreItemState == 1}}"   原文地址:https://www.cnbl

vue、react、微信小程序中的过滤器

一.去除html标签及空格  1 let richText = ' <p style="font-size: 25px;color: white">&nbsp; &nbsp; &nbsp; &nbsp;sdaflsjf的丰富及饿哦塞尔</p><span>dsfjlie</span>'; 2 3 /* 去除富文本中的html标签 */ 4 /* *.+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们

vue和微信小程序的区别、比较

链接:https://segmentfault.com/a/1190000015684864 一.生命周期 先贴两张图: vue生命周期 小程序生命周期 相比之下,小程序的钩子函数要简单得多. vue的钩子函数在跳转新页面时,钩子函数都会触发,但是小程序的钩子函数,页面不同的跳转方式,触发的钩子并不一样. onLoad: 页面加载一个页面只会调用一次,可以在 onLoad 中获取打开当前页面所调用的 query 参数. onShow: 页面显示每次打开页面都会调用一次. onReady: 页面初