vue mixins组件复用的几种方式(小结)


Posted in Javascript onSeptember 06, 2017

最近在做项目的时候,研究了mixins,此功能有妙处。用的时候有这样一个场景,页面的风格不同,但是执行的方法,和需要的数据非常的相似。我们是否要写两种组件呢?还是保留一个并且然后另个一并兼容另一个呢?

不管以上那种方式都不是很合理,因为组件写成2个,不仅麻烦而且维护麻烦;第二种虽然做了兼容但是页面逻辑造成混乱,必然不清晰;有没有好的方法,有那就是用vue的混合插件mixins。混合在Vue是为了提出相似的数据和功能,使代码易懂,简单、清晰。

1.场景

假设我们有几个不同的组件,它们的工作是切换状态布尔、模态和工具提示。这些提示和情态动词不有很多共同点,除了功能:他们看起来不一样,他们不习惯相同,但逻辑是相同的。

//弹框
const Modal = {
 template: '#modal',
 data() {
  return {
   isShowing: false
  }
 },
 methods: {
  toggleShow() {
   this.isShowing = !this.isShowing;
  }
 },
 components: {
  appChild: Child
 }
}

//提示框
const Tooltip = {
 template: '#tooltip',
 data() {
  return {
   isShowing: false
  }
 },
 methods: {
  toggleShow() {
   this.isShowing = !this.isShowing;
  }
 },
 components: {
  appChild: Child
 }
}

上面是一个弹框和提示框,如果考虑做2个组件,或者一个兼容另一个都不是合理方式。请看一下代码

const toggle = {
 data() {
  return {
   isShowing: false
  }
 },
 methods: {
  toggleShow() {
   this.isShowing = !this.isShowing;
  }
 }
}

const Modal = {
 template: '#modal',
 mixins: [toggle],
 components: {
  appChild: Child
 }
};

const Tooltip = {
 template: '#tooltip',
 mixins: [toggle],
 components: {
  appChild: Child
 }
};

用mixins引入toggle功能相似的js文件,进行混合使用

2.可以合并生命周期

//mixin
const hi = {
 mounted() {
  console.log('this mixin!')
 }
}

//vue组件
new Vue({
 el: '#app',
 mixins: [hi],
 mounted() {
  console.log('this Vue instance!')
 }
});

//Output in console
> this mixin!
> this Vue instance!

先输出的是mixins的数据

3、可以全局混合(类似已filter)

Vue.mixin({
 mounted() {
  console.log('hello from mixin!')
 },
 method:{
   test:function(){
   }
  }
})

new Vue({
 el: '#app',
 mounted() {
  console.log('this Vue instance!')
 }
})

会在每一个组件中答应周期中的log,同时里面的方法,类似于vue的prototype添加实例方法一样。

var install = function (Vue, options) {
 // 1. 添加全局方法或属性
 Vue.myGlobalMethod = function () {
  // 逻辑...
 }
 // 2. 添加全局资源
 Vue.directive('my-directive', {
  bind (el, binding, vnode, oldVnode) {
   // 逻辑...
  }
  ...
 })
 // 3. 注入组件
 Vue.mixin({
  created: function () {
   // 逻辑...
  }
  ...
 })
 // 4. 添加实例方法
 Vue.prototype.$myMethod = function (options) {
  // 逻辑...
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js实现的网站首页随机公告随机公告
Mar 14 Javascript
childNodes.length与children.length的区别
May 14 Javascript
css3元素简单的闪烁效果实现(html5 jquery)
Dec 28 Javascript
使用jQuery将多条数据插入模态框的实现代码
Oct 08 Javascript
jQuery trigger()方法用法介绍
Jan 13 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
May 27 Javascript
vue实现导航栏效果(选中状态刷新不消失)
Dec 13 Javascript
关于HTTP传输中gzip压缩的秘密探索分析
Jan 12 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
详解webpack4.x之搭建前端开发环境
Mar 28 Javascript
Vue+element-ui添加自定义右键菜单的方法示例
Dec 08 Vue.js
JavaScript 中Date对象的格式化代码方法汇总
Sep 06 #Javascript
jquery实现限制textarea输入字数的方法
Sep 06 #jQuery
Vue的百度地图插件尝试使用
Sep 06 #Javascript
表格展示利器 Bootstrap Table实例代码
Sep 06 #Javascript
javascript如何用递归写一个简单的树形结构示例
Sep 06 #Javascript
jquery实现用户登陆界面(示例讲解)
Sep 06 #jQuery
详谈js原型继承的一些问题
Sep 06 #Javascript
You might like
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
php-fpm重启导致的程序执行中断问题详解
2019/04/29 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
Jquery + Ajax调用webService实例代码(asp.net)
2010/08/27 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
当某个文本框成为焦点时即清除文本框内容
2014/04/28 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
2017/10/11 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
微信小程序HTTP请求从0到1封装
2019/09/09 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
js如何验证密码强度
2020/03/18 Javascript
Vue使用Three.js加载glTF模型的方法详解
2020/06/14 Javascript
解决vue页面刷新,数据丢失的问题
2020/11/24 Vue.js
[01:07:57]DOTA2-DPC中国联赛 正赛 Ehome vs Magma BO3 第二场 1月19日
2021/03/11 DOTA
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
2020/08/19 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
什么是SCM(软件配置管理)
2014/08/16 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
2014/07/27 面试题
个人近期表现材料
2014/02/11 职场文书
会计专业毕业生求职信
2014/07/04 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
高三数学教学反思
2016/02/18 职场文书