假设一个项目,首页不需要登录就可以直接进入,但是在首页中有各种其他的模块,这些模块中,有些需要登录权限,而有些则不需要登录权限,所以在进入这些模块的时候,我们都要判断当前的登录状态,那么我们应该怎么组织这一部分代码呢?

在每一个需要登录状态的组件内,进行单独判断?

如果需要判断登录状态的模块比较少,也就是单独的组件很少,其实也无所谓,但是如果有10个、8个的模块需要判断登录状态呢?每个组件内部,判断一次?虽然代码都一样,也就是合并复制粘贴一下,但是,这是不是一种浪费,这时,就是mixins混入大展身手的时候了。

vue官方文档上说:

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

单独定义一个mixin的文件,使用ES6模块方式,将其定义成一个完整的模块。假设文件名为mixin.js。

export default {
data() {
return {
msg: "这现在都可以这么玩了么?"
}
},
mounted() {
let loginState = window.localStorage.getItem("loginState");
console.log(loginState)
// 依赖loginState的结果进行不同的逻辑操作,或者路由跳转 }
}

  这就是共用代码部分的mixin即可:

import mixin from "./mixin"
export default {
mixins: [mixin],
// 组件内其他逻辑操作代码
data(){
return {}
},
methods:{},
mounted(){}
...
}

  如果还有其他需要混入的部分,用相同的方法引入即可,然后将引入的对象添加到mixins这个属性值的数组里面,数组的先后顺序决定了他们的执行顺序,比如都有mounted这个方法的话,就按mixins数组的先后顺序执行,最后才执行组件内部的mounted。

当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合。

比如,数据对象在内部会进行浅合并 (一层属性深度),在和组件的数据发生冲突时以组件数据优先。

值为对象的选项,例如 methods, components 和 directives,将被混合为同一个对象。两个对象键名冲突时,取组件对象的键值对。

  就是说methods, components 和 directives这些个属性当中,如果有与mixin中对象的键名冲突了,那使用的是组件内部的键值。

export default {
data() {
return {
msg: "这现在都可以这么玩了么?"
}
},
methods: {
whyClick() {
console.log("why dispatch click, what would you like todo?")
}
},
mounted() {
let loginState = window.localStorage.getItem("loginState");
console.log(loginState)
// 依赖loginState的结果进行不同的逻辑操作,或者路由跳转 }
}

  而同时,在引入该mixin的组件内部的methods中,也有whyClick这一方法

export default {
mixins: [mixin],
data (){
return {
// msg: "我就想看看这个mixin当中的this指向哪里?"
}
},
methods:{
whyClick(){
console.log("I just click, and test it, not OK ?")
}
},
...
}

  此时,在组件中

<button @click="whyClick">whyClick, don't you kow?</button>

  那么只会执行组件内部的whyClick方法,而不会执行mixin中的whyClick。

mixin不仅可以组件内局部混入,也可以全局混入。

Vue.mixin({
...
})  

  在这里需要提示注意的一点是:全局混入,即Vue.mixin({})需要写在new Vue({})之前,包括Vue.filter(), Vue.directive()也是如此,就是说所有全局定义的,需要在vue实例构造之前定义。

vue为我们定义了一整套选项合并的策略,但是总有一些特殊需求,需要一些特殊的合并策略,vue同时提供了自定义选项合并策略

自定义选项将使用默认策略,即简单地覆盖已有值。如果想让自定义选项以自定义逻辑合并,可以向 Vue.config.optionMergeStrategies 添加一个函数:
Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {
// return mergedVal
}

  更多复杂的合并策略可以翻看其官方文档自定义选项合并策略

vue2.0混入mixins的更多相关文章

  1. 重开Vue2.0

    目录: 内容: 一.Vue内部指令: 1.v-if v-else&v-show v-if与v-show都是选择性显示内容的指令,但是二者之间有区别: 1.v-if:判断是否加载,在需要的时候加 ...

  2. Vue2.0组件的继承与扩展

    如果有需要源代码,请猛戳源代码 希望文章给大家些许帮助和启发,麻烦大家在GitHub上面点个赞!!!十分感谢 前言 本文将介绍vue2.0中的组件的继承与扩展,主要分享slot.mixins/exte ...

  3. Vue2.0源码阅读笔记--生命周期

    一.Vue2.0的生命周期 Vue2.0的整个生命周期有八个:分别是 1.beforeCreate,2.created,3.beforeMount,4.mounted,5.beforeUpdate,6 ...

  4. vue2.0中使用sass

    第一部分:Sass语言 Sass是一种强大的css扩展语言(css本身并不是一门语言),它允许你使用变量.嵌套规则.mixins.导入等css没有但开发语言(如Java.C#.Ruby等)有的一些特性 ...

  5. vue2.0和better-scroll实现左右联动效果

    在做移动端商城或者其他页面的时候,经常会遇到左右联动的效果,今天小编vue2.0和better-scroll这个插件一起实现左右联动效果. 实现上面的效果,思路一定很重要,还有需求 1. 左边一级分类 ...

  6. vue2.0读书笔记2-进阶

    一.深入响应式原理 二.过渡效果 三.过渡状态 四.Render函数 五.自定义指令 六.混合 七.插件 八.单文件组件 九.生产环境 十.路由 vue-router: http://router.v ...

  7. Vue2.0父子组件间事件派发机制

    从vue1.x过来的都知道,在vue2.0中,父子组件间事件通信的$dispatch和$broadcase被移除了.官方考虑是基于组件树结构的事件流方式实在是让人难以理解,并且在组件结构扩展的过程中会 ...

  8. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

  9. vue2.0构建淘票票webapp

    项目描述 之前一直用vue1.x写项目,最近为了过渡到vue2.0,特易用vue2.0栈仿写了淘票票页面,而且加入了express作为后台服务. 前端技术栈:vue2.0 + vue-router + ...

随机推荐

  1. 性能优化之永恒之道(实时sql优化vs业务字段冗余vs离线计算)

    在项目中,随着时间的推移,数据量越来越大,程序的某些功能性能也可能会随之下降,那么此时我们不得不需要对之前的功能进行性能优化.如果优化方案不得当,或者说不优雅,那可能将对整个系统产生不可逆的严重影响. ...

  2. SDRAM单字写操作

    SDRAM单字写操作 1.单字写操作时序 2.写verilog程序体会 在初始状态,先写好跳转条件.If()....else... 3.通过仿顺序操作来实现连续写操作 首先完成单字写操作,然后跳转到下 ...

  3. Xilinx FPGA开发环境vivado使用流程

    Xilinx FPGA开发环境vivado使用流程 1.启动vivado 2016.1 2.选择Create New Project 3.指定工程名字和工程存放目录 4.选择RTL Project 5 ...

  4. WPF Demo17 数据绑定

    实例一:以资源的形式实现 namespace 数据绑定1 { public class Student { public int Id { get; set; } public string Name ...

  5. 隐藏网页中DIV和DOM的各种方法

    记录一下各种隐藏html元素的方法 <!DOCTYPE html> <html> <head> <title></title> <me ...

  6. [蓝桥杯]ALGO-81.算法训练_动态数组使用

    从键盘读入n个整数,使用动态数组存储所读入的整数,并计算它们的和与平均值分别输出.要求尽可能使用函数实现程序代码.平均值为小数的只保留其整数部分. 样例输入: 样例输出: 样例输入: 样例输出: 题目 ...

  7. 蓝桥杯-四阶幻方(DFS)

    标题:四阶幻方 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. 比如: ...

  8. C++11--右值引用(Perfect Forwarding)

    /* * 右值引用 2: Perfect Forwarding */ void foo( boVector arg ); // boVector既有移动构造又有拷贝构造 template< ty ...

  9. C++进阶--理解左值和右值

    /* * 理解左值和右值 * * * 为什么要关心这个? * 1. 有助于理解C++结构,搞明白编译器的错误和警告 * 2. C++ 11中引入了右值引用,理解左值右值是前提 * */ /* * 简单 ...

  10. 在centos7中安装nodejs(npm )

    我当前使用的是Centos7 首先在官网查看当前最新的版本 https://nodejs.org/dist/ 我现在最新的是 https://nodejs.org/dist/latest-v10.x/ ...