因为在项目中 mixins(混合)特性使用频率是很高的 有必要熟练掌握
官方文档: mixins


实际项目中 一般都存在 列表(list) 这种很常见的使用场景

话再多都不如上demo

file: mixins/list.js

 module.exports = {
data () {
return {
list: [],
page: 1,
limit: 15,
total: 0
}
},
created () {
this.initList()
},
watch: {
page: 'loadData'
},
methods: {
/**
* 获取请求参数 默认只传递index(页码) limit(每页条数) 可以由调用方传递指定对象合并(或者覆盖)原参数
* @param params
* @returns {*}
*/
getParams (params) {
return Object.assign({
index: this.page,
limit: this.limit
}, params)
},
/**
* 加载更多
*/
loadMore () {
this.page++
},
/**
* 推送到list中 因为vue的监听特性 只能用push进行数据的添加 如果有特殊处理 通过传递一个filter来过滤数据
* @param list
* @param filter
*/
pushToList (list, filter) {
list.forEach((item) => {
if (typeof filter === 'function') {
this.list.push(filter(item))
} else {
this.list.push(item)
}
})
},
/**
* 初始化列表
*/
initList () {
this.page = 1
this.list = []
this.loadData()
},
/**
* @overwrite
* 加载数据方法 用到该mixin的都应该重写该方法 否则无法实现加载数据
*/
loadData () {
// 每个列表自己的获取数据的方法需要重写
}
}
}

解析

一个列表的基本属性

属性 作用或备注
list 列表
page 页码
limit 每页条数
total 总条数

基本方法

方法 作用或备注
initList() 初始化列表
loadData() 加载数据
loadMore() 加载更多

扩展方法[主要用于参数的处理和结果的处理]

方法 作用或备注
getParams() 获取HTTP请求参数
pushToList() 数据处理方法

每一个列表结构都具备的属性以及方法 可以放到mixins的声明中

从这段代码中可以得知 加载了该mixins的组件会在创建之后执行一个initList方法
顾名思义 就是初始化列表的方法

 created () {
this.initList()
}

问题

但是问题来了 如果我的组件 不只是在初始化的时候使用
而是在使用了keep-alive的应用下在route->data()的钩子中执行初始化呢?

 route: {
data () {
this.initList()
}
}

这时候你打开控制台 刷新页面 就会发现 第一次进入 初始化了两次

原因

因为mixins的合并策略

当混合对象与组件包含同名选项时,这些选项将以适当的策略合并。例如,同名钩子函数被并入一个数组,因而都会被调用。另外,混合的钩子将在组件自己的钩子之前调用。

 var mixin = {
created: function () {
console.log('mixin hook called')
}
}
new Vue({
mixins: [mixin],
created: function () {
console.log('component hook called')
}
})
// -> "mixin hook called"
// -> "component hook called"

值为对象的选项,如 methods, components 和 directives 将合并到同一个对象内。如果键冲突则组件的选项优先。

 var mixin = {
methods: {
foo: function () {
console.log('foo')
},
conflicting: function () {
console.log('from mixin')
}
}
}
var vm = new Vue({
mixins: [mixin],
methods: {
bar: function () {
console.log('bar')
},
conflicting: function () {
console.log('from self')
}
}
})
vm.foo() // -> "foo"
vm.bar() // -> "bar"
vm.conflicting() // -> "from self"

注意 Vue.extend() 使用同样的合并策略。

所以即使你在引用的组件中 把created重写 也是被合并(两个都会执行) 因为合并的策略不同 导致了 methods 可以被重写 而created ready等只会被合并

解决方法

怎么解决?

读过阅读官方文档后我想你会有答案

我这里提供一个文档中提到的比较灵活的简单的方案 加一个自定义选项

 created () {
let option = this.$options.doNotInit
if (!option) {
this.initList()
}
}

通过该选项 doNotInit 来判断是否需要在组件创建完毕之后就初始化

在调用该mixins的组件中 添加这么一个选项 就可以让组件不执行初始化方法

而是通过route->data()钩子来控制列表的初始化

调用

file: anyVueComponent.vue

 import List from 'path/mixins/list'
export default{
mixins: [List],
data () {
return {
// 除列表外额外的属性
}
},
methods: {
loadData () {
this.$http.post(yourApiUrl, this.getParams()).then((res) => {
// do somethings
})
}
},
doNotInit: true,
route: {
data () {
this.initList()
}
}
}

说到底 仔细阅读Vue文档 项目中遇到的绝大多数问题 都能迎刃而解~

vue-mixins使用注意事项和高级用法的更多相关文章

  1. vue keep-alive保存路由状态2 (高级用法,接上篇)

    接上篇 https://www.cnblogs.com/wangmaoling/p/9803960.html 本文很长,请耐心看完分析. 4.高级用法,指定从什么组件进入才缓存,以及销毁缓存:先介绍我 ...

  2. 详解Vue中watch的高级用法

    我们通过实例代码给大家分享了Vue中watch的高级用法,对此知识点有需要的朋友可以跟着学习下. 假设有如下代码: <div> <p>FullName: {{fullName} ...

  3. vue路由高级用法

    五.路由设置高级用法alias 别名 {path:'/list',component:MyList,alias:'/lists'}redirect 重定向 {path:'/productList',r ...

  4. vue自定义指令clickoutside使用以及扩展用法

    vue自定义指令clickoutside使用以及扩展用法 产品使用vue+element作为前端框架.在功能开发过程中,难免遇到使用element的组件没办法满足特殊的业务需要,需要对其进行定制,例如 ...

  5. 多年经验,教你写出最惊艳的 Markdown 高级用法

    点赞再看,养成习惯,微信搜索[高级前端进阶]关注我. 本文 GitHub https://github.com/yygmind 已收录,有一线大厂面试完整考点和系列文章,欢迎 Star. 最近在学习的 ...

  6. 多年经验总结,写出最惊艳的 Markdown 高级用法

    点赞再看,养成习惯,微信搜索[高级前端进阶]关注我. 本文 GitHub https://github.com/yygmind 已收录,有一线大厂面试完整考点和系列文章,欢迎 Star. 最近在学习的 ...

  7. 羽夏闲谈—— C 的 scanf 的高级用法

    前言   今天看到博友发了个有关scanf的使用的注意事项,就是讨论缓冲区残存数据的问题,用简单的代码示例复述一下: #define _CRT_SECURE_NO_WARNINGS #include ...

  8. Visual Studio 宏的高级用法

    因为自 Visual Studio 2012 开始,微软已经取消了对宏的支持,所以本篇文章所述内容只适用于 Visual Studio 2010 或更早期版本的 VS. 在上一篇中,我已经介绍了如何编 ...

  9. SolrNet高级用法(分页、Facet查询、任意分组)

    前言 如果你在系统中用到了Solr的话,那么肯定会碰到从Solr中反推数据的需求,基于数据库数据生产索引后,那么Solr索引的数据相对准确,在电商需求中经常会碰到菜单.导航分类(比如电脑.PC的话会有 ...

随机推荐

  1. 解决google登录界面input输入框颜色不正确问题

    加入以下样式: input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px #e2e2e2 inset !important; }

  2. 【SQLServer2008】之如何导入mdf,ldf文件、导入.mdf文件报错解决问题以及如何获得Authenticated Users 权限

    一.如何导入mdf,ldf文件: 链接:http://jingyan.baidu.com/article/09ea3ede21258cc0afde3943.html 二.导入.mdf文件报错解决问题 ...

  3. eclipse配置python插件

    eclipse配置python主要可以分为以下几个步骤完成: 1. 安装python,python主要有两个版本,python2和python3,这里安装的是python2.7.主要考虑python使 ...

  4. SQL_为表和列加凝视

    ***********************************************声明*************************************************** ...

  5. esper 附录A

    A2 select irstream symbol, volume, price from MarketDate.win.time(5.5 sec) seconds seconds seconds s ...

  6. 一篇很不错的关于WPF DataGrid的文章,包含validation

    https://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical-Examples

  7. PHP-Manual的学习----【语言参考】----【基本语法】

    2017年6月28日11:29:311.当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php 和 ?>,这告诉 PHP 开始和停止解析二者之间的代码.此种解析方式使得 PHP ...

  8. Linux Samba文件共享服务配置

    http://blog.csdn.net/xht555/article/details/4631063

  9. 仿百度壁纸client(五)——实现搜索动画GestureDetector手势识别,动态更新搜索keyword

    仿百度壁纸client(五)--实现搜索动画GestureDetector手势识别,动态更新搜索关键字 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager ...

  10. centos7.0 crontab 的yii计划任务没有执行

    */1 * * * * /www/yii solr/update-article 创建了每分钟执行一次的计划而计划任务没有执行 原因是自己少加了执行用户 */1 * * * * php /www/yi ...