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

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

如果需要判断登录状态的模块比较少,也就是单独的组件很少,其实也无所谓,但是如果有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. LOJ 2585 「APIO2018」新家 ——线段树分治+二分答案

    题目:https://loj.ac/problem/2585 算答案的时候要二分! 这样的话,就是对于询问位置 x ,二分出一个最小的 mid 使得 [ x-mid , x+mid ] 里包含所有种类 ...

  2. tk简单使用

    # 引入tk import tkinter as tk class UserLogin(object): """ 初始化窗口 """ def ...

  3. NET设计模式 第二部分 创建型模式(6):创建型模式专题总结(Creational Pattern)

    创建型模式专题总结(Creational Pattern) ——.NET设计模式系列之七 Terrylee,2006年1月 概述 创建型模式,就是用来创建对象的模式,抽象了实例化的过程.它帮助一个系统 ...

  4. Windows系统下MySQL数据库出现Access denied for user 'root'@'localhost' (using password:YES) 错误

    Windows系统下MySQL数据库出现Access denied for user 'root'@'localhost' (using password:YES) 错误,(root密码错误) 处理方 ...

  5. ionic cordova platform --help

    ionic platform add android 给我报这个问题,不理解 The platform command has been renamed. To find out more, run: ...

  6. Keras/Tensorflow训练逻辑研究

    Keras是什么,以及相关的基础知识,这里就不做详细介绍,请参考Keras学习站点http://keras-cn.readthedocs.io/en/latest/ Tensorflow作为backe ...

  7. linux 添加多个网段

    1.在系统中添加网络配置文件脚本 # cd /etc/sysconfig/network-scripts # cp ifcfg-eth0 ifcfg-eth0:0 2.修改新添加的网络配置脚本文件如下 ...

  8. SpringBoot之退出服务(exit)时调用自定义的销毁方法

    我们在工作中有时候可能会遇到这样场景,需要在退出容器的时候执行某些操作.SpringBoot中有两种方法可以供我们来选择(其实就是spring中我们常用的方式.只是destory-method是在XM ...

  9. MOngoDB为现有数据添加或删除某一字段

    var lst =db.getCollection('config').find({}); while(lst.hasNext()) { var site=lst.next(); db.config. ...

  10. 【IIS错误】IIS各种错误

    IIS简介 当用户试图通过HTTP或文件传输协议(FTP)访问一台正在运行Internet信息服务 (IIS)的服务器上的内容时,IIS返回一个表示该请求的状态的数字代码.该状态代码 记录在IIS日志 ...