目录
1.对比VUEX
2.已有功能
3.如何使用
4.demo演示
5.具体使用方式
5.1 注册接收指令
5.2 组件内注册分组
5.3 组件加入多个分组
5.4 实例中加入组件分组
5.5 实例中指定 unicomId
5.6 组件内发送指令
5.7 指令高级用法
5.8 延迟发送指令(一次性指令)
5.9 组件监听
6.简单源码解析
6.1 用ximin做插件,prototype定义全局函数(插件机制的重点)
6.1.1 prototype
6.1.2 全局混入mixin
6.1.3 自定义属性的混合策略optionMergeStrategies
6.2 为什么可以在组件上直接写‘unicomName’、‘unicom’
6.3 当前组件的一个亮点
首页 web前端 js教程 自制vue组件通信插件之用mixin写插件

自制vue组件通信插件之用mixin写插件

Jul 09, 2018 am 11:54 AM
vue.js vuex

这篇文章主要介绍了关于自制vue组件通信插件之用mixin写插件,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

这个项目虽然是szpoppy的个人项目,但是在szpoppy公司内是在大面积使用的,一直由szpoppy维护;我个人和szpoppy在一起工作接近一年,经常看他的源代码,从他身上学到非常多。

本文结构:

  • 1.对比VUEX

  • 2.插件已有功能

  • 3.插件如何使用

  • 4.demo演示

  • 5.具体使用方式

  • 6.源码解析,教你如何用mixin写vue插件(一看就会,通俗易懂)

1.对比VUEX

  • ‘vue-unicom’语法直观,使用起来基本没有学习成本;这个插件可以大大简化你的项目

  • 如果说vuex是在视图层组件树之外,创建了一个数据仓库,通过Mutaion修改的话;那么unicom就是在组件之间搭建了一个管道,可以让组件之间通过函数传递、分发数据,并且不像VUEX那样由很多语法

  • VUEX主要做的是状态管理,而‘vue-unicom’纯粹就是做一对一、一对多的组件通信

  • ‘vue-unicom’源代码仅200多行,注释清晰,使用者可以更加深入的了解vue组件如何编写,方便后续创造自己的插件

  • 如果你不确定自己要不要用vuex,就不要用,不需要为了用vuex而用vuex,会用就行,不要搞个中小型项目就直接上vuex,全家桶还是增加了比较多特定语法的;而unicom在性能和实践上完全可以承担起如火车票购票系统规模的应用。

3256260828-5b3f4175215d3_articlex[1].png

2.已有功能

  • 提供任意两个Vue组建之间的通讯问题;

  • 任意一个Vue组件向其他所有组件发送指令;

  • 任意一个Vue组件向某组Vue组件发送指令;

  • 任意一个Vue组件向特定id组件发送消息;

  • 在任意一个Vue组件内获取某组组件列表;

  • 在任意一个Vue组件内获取特定id组件;

  • 发送指令到还没初始化的组件;

  • 发送指令到还没初始化的分组组件;

  • 发送指令到还没初始化的id组件;

3.如何使用

npm install vue-unicom
登录后复制
import VueUnicom from 'vue-unicom'
// 非 cli 也必须 install一下
Vue.use(VueUnicom, {
    // 制定名称, 默认为 unicom
    unicom: 'unicom',
    // 定制分组使用名称 默认为 unicom + 'Name'
    unicomName: 'unicomName',
    // 定制id使用名称 默认为 unicom + 'Id'
    unicomId: 'unicomId'
})
登录后复制

4.demo演示

详情访问这个github的readme地址

// 1. 下载
git clone https://github.com/szpoppy/vue-unicom.git

// 2. 
cd vue-unicom

//3.运行demo,可以直接打开src目录下的index.html(推荐这种更方便的方法)也可以用gulp运行

// 4.‘vue-unicom’源代码在‘/src/lib/unicom.js’
登录后复制

5.具体使用方式

组件编写示例如下,下面进一步详细介绍

    Vue.component('ca', {
    template: '<p><p class="title">text:{{text}}#{{unicomId}}</p><p>msg: {{msg}}</p></p>',
    unicomName: 'a',
    unicom: {
        message: function(sender, text){
            this.msg = text
        }
    },
    data: function(){
        return {
            text: 'component - ca',
            msg: 'a'
        }
    },
    mounted(){
        console.log(' a component  ',this)
    }
})
登录后复制

组件调用示例如下

    <p id="app" class="app">
        <ca unicom-id="a-id1"></ca>
        <ca unicom-id="a-id2"></ca>
        <cb1></cb1>
        <cb2></cb2>
        <cc></cc>
        <hr>
        <cbtn></cbtn>
    </p>
登录后复制

5.1 注册接收指令

{
    // Vue中增加 增加unicom参数
    // 这里的unicom,指 上面传入的参数
    unicom: {
        // instruct1:通讯指令
        // sender:发送指令者($vm)
        // args:指令发出者附带参数
        // 参数如果为对象,是引用类型,如果需要设置,请深度克隆一遍
        instruct1 (sender, ...args) {
            // .... this 为当前组件
        },
        instruct2 (sender, ...args) {

        }
    }
}
登录后复制

5.2 组件内注册分组

{
    // Vue中增加 增加unicomName参数
    // 指定分组 属于 group, 所有实例,都属于这个分组
    unicomName: 'group'
}
登录后复制

5.3 组件加入多个分组

{
    // 组件可以加入多个分组
    unicomName: ['group1', 'group2']
}
登录后复制

5.4 实例中加入组件分组

<!-- 加入group分组 -->
<component unicom-name="group"></component>
登录后复制

5.5 实例中指定 unicomId

<!-- 指定$vm的 id 为 id1 -->
<component unicom-id="id1"></component>
登录后复制

5.6 组件内发送指令

{
    methods:{
        method1 () {
            // 发送 instruct1 指令,参数为 1, 2
            this.$unicom('instruct1', 1, 2)
        }
    }
}
登录后复制

5.7 指令高级用法

instruct1@group   (发送到指定分组)

instruct1#id1     (发送到指定组件)

@group            (获取指定分组组件)

#id1             (获取指定组件)

5.8 延迟发送指令(一次性指令)

指令使用 ~ 打头

~instruct1       (指令延迟发送,直到包含有instruct1指令的组件出现)

~instruct1@group (指令延迟发送,直到出现分组命名group的组件)

~instruct1#id1   (指令延迟发送,直到出现命名id1的组件)

5.9 组件监听

组件监听使用, 指令使用 ~ 打头, 第二个参数为 callback

~@group          (监听分组命名group的组件出现)

~#id1            (监听命名id1的组件出现)

~                (监听任意新出现的组件)

6.简单源码解析

只做基本的源码解析,更加详细可以咨询szpoppy

6.1 用ximin做插件,prototype定义全局函数(插件机制的重点)

建议先阅读vue插件机制https://cn.vuejs.org/v2/guide/plugins.html
拿到源码‘unicom.js’第一步,先用编译器把所有的方法都收起来,除了install函数
接下里我们重点从入口install看起,另外导入插件并app.use的过程中,第一步其实就是调用的install函数

function install(vue, {
        name = 'unicom',
        idName,
        groupName
    } = {}) {
        //简单几行代码判断是否安装过

        // 添加原型方法,全局组件调用
        vue.prototype['$' + name] = unicomQuery

        // unicomIdName = 'unicomId'        id作为唯一标识
        unicomIdName = idName || (name + 'Id')
        // unicomGroupName = 'unicomName'       分组
        unicomGroupName = groupName || (name + 'Name')

        // 全局混入
        vue.mixin({
            props:
            watch:
            beforeCreate(){}
            created(){},
            destroyed(){}
        })

        // 自定义属性合并策略
        let merge = vue.config.optionMergeStrategies
        // 改变了自定义属性unicomName和unicom的合并策略
        merge[name] = merge[unicomGroupName] = function (parentVal, childVal){ 
        //...
        }
    }
登录后复制

其实,按照这样一划分,大家很简单的就能看到这个插件的制作部分大概就分这几块:

6.1.1 prototype

利用vue原型链挂载一个全局的‘$unicom’方法,可以在全局内调用,也可以作为组件内节点click时的方法,click直接发送数据

<button @click="$unicom(&#39;message&#39;, &#39;通用Send&#39;)">发送指令 message</button>     
<button @click="$unicom(&#39;message@a&#39;, &#39;Send@a&#39;)">发送指令 message@a</button>
登录后复制
methods:{
      sendData(){
          this.$unicom('message@c', '测试数据')
      }
},
登录后复制
6.1.2 全局混入mixin

如不了解,建议阅读https://cn.vuejs.org/v2/guide/mixins.html
插件逻辑处理的重点部分:全局混入mixin
props:这个部分非常简单,就是为了让每个组件都能在组件调用时传递变量‘unicom-id’或者‘unicom-name’(一般是静态变量)
watch:这个部分主要就是当组件调用时‘unicom-id’或者‘unicom-name’传递过来的是动态变量对其进行实时监听
beforeCreate:在组件已解析但未加载时,利用‘this.$options’去获取自定义‘unicom’属性,然后在每一个组件内加入事件机制;最后利用Map集合以组件vm作为key,将该组件的分组和通信函数合并的对象作为value存起来
created:在组件已经解析和载入到dom结构之后,从Map集合中获取当前组件的分组和通信函数信息,判断是否有其它组件在当前组件未创建之前给它发送了数据,如果有,响应该延迟发送的数据
destroyed:组件销毁逻辑

6.1.3 自定义属性的混合策略optionMergeStrategies

如不了解,建议阅读vue中的optionMergeStrategies
这个部分看起来简单的几行,其实却是个插件开发过程中比较重点的部分
如何理解这个‘optionMergeStrategies’呢?该组件主要针对自定义option属性的混合;官方解释是:’当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合‘。
肯定很多人还是不明白,其实说实话我也不算明白,但是我简单解释一下:

  1. 这个东西具体的使用你其实可以仔细的看看vuex对这个的使用和‘vue-unicom’中optionMergeStrategies的使用

  2. 官网的这句‘当组件和混入对象含有同名选项时,这些选项将以恰当的方式混合’是很透彻的在讲这个东西的概念

  3. 在‘vue-unicom’插件中optionMergeStrategies有两个用处,一般情况下主要是将‘unicom-id’和‘vue-unicom’从原本数据格式变成数组;但是,如果当前组件或者vue全局被混入了和我们插件自定义option属性同名的变量,默认的合并策略是后面定义的option属性覆盖前面的,但是我们这里对合并策略进行了重写,就可以保证当前组件上所有的‘unicom-id’或者‘vue-unicom’属性都被push到一个数组中并挂载在当前组件上

简单理解它在当前插件的作用:子组件和上层组件有相同option属性时,让子组件正确合并上层组件的自定义属性

6.2 为什么可以在组件上直接写‘unicomName’、‘unicom’

我们可以很肯定一点:vue本身并没有这两个option属性,甚至很可能很多人也从来没有自己在组件声明时自定义options属性
如果你没有试过,也没有关系,看了本篇文章之后你就知道了
为什么我们要自定义option属性呢?这两个属性的作用很明确,‘unicomName’是做分组声明的,‘unicom’是做通信函数的;然后在mixin的各个声明周期再利用‘this.$options’获取自定义option属性进行进一步的逻辑处理,并声明optionMergeStrategies合并策略

6.3 当前组件的一个亮点

利用map集合以组件vm为单位存储该组件的分组和通信函数
每次存通信函数、分组的时候都会把对应的vm示例存储下来,所以要找通信函数或者对应分组就非常简单

这个组件较我一开始使用已经经过了一次对代码更加直观的改进,个人觉得非常值得大家阅读和使用

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

Vue活动创建项目之路由设计及导航栏的开发

Vue源码之文件结构与运行机制

以上是自制vue组件通信插件之用mixin写插件的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
图文详解如何在Vue项目中集成Ace代码编辑器 图文详解如何在Vue项目中集成Ace代码编辑器 Apr 24, 2023 am 10:52 AM

Ace 是一个用 JavaScript 编写的可嵌入代码编辑器。它与 Sublime、Vim 和 TextMate 等原生编辑器的功能和性能相匹配。它可以很容易地嵌入到任何网页和 JavaScript 应用程序中。Ace 被维护为Cloud9 IDE的主要编辑器 ,并且是 Mozilla Skywriter (Bespin) 项目的继承者。

探讨如何在Vue3中编写单元测试 探讨如何在Vue3中编写单元测试 Apr 25, 2023 pm 07:41 PM

当今前端开发中,Vue.js 已经成为了一个非常流行的框架。随着 Vue.js 的不断发展,单元测试变得越来越重要。今天,我们将探讨如何在 Vue.js 3 中编写单元测试,并提供一些最佳实践和常见的问题及解决方案。

聊聊vue3中怎么使用高德地图api 聊聊vue3中怎么使用高德地图api Mar 09, 2023 pm 07:22 PM

在我们使用高德地图的时候,官方给我们推荐了很多案例,demo,但是这些案例都是使用原生方法接入,并没有提供vue或者react 的demo,vue2的 接入网上也很多人都有写过,下面本篇文章就来看看 vue3怎么使用常用的高德地图api,希望对大家有所帮助!

Vue中JSX语法和模板语法的简单对比(优劣势分析) Vue中JSX语法和模板语法的简单对比(优劣势分析) Mar 23, 2023 pm 07:53 PM

在Vue.js中,开发人员可以使用两种不同的语法来创建用户界面:JSX语法和模板语法。这两种语法各有优劣,下面就来探讨一下它们的区别和优劣势。

浅析vue怎么实现文件切片上传 浅析vue怎么实现文件切片上传 Mar 24, 2023 pm 07:40 PM

在实际开发项目过程中有时候需要上传比较大的文件,然后呢,上传的时候相对来说就会慢一些,so,后台可能会要求前端进行文件切片上传,很简单哈,就是把比如说1个G的文件流切割成若干个小的文件流,然后分别请求接口传递这个小的文件流。

实例详解vue3实现chatgpt的打字机效果 实例详解vue3实现chatgpt的打字机效果 Apr 18, 2023 pm 03:40 PM

在做 chatgpt 镜像站的时候,发现有些镜像站是没做打字机的光标效果的,就只是文字输出,是他们不想做吗?反正我想做。于是我仔细研究了一下,实现了打字机效果加光标的效果,现在分享一下我的解决方案以及效果图~

手把手教你使用Vue3实现一个飘逸元素拖拽功能 手把手教你使用Vue3实现一个飘逸元素拖拽功能 Mar 30, 2023 pm 08:57 PM

怎么实现元素拖拽功能?下面本篇文章一步步带大家了解如何使用Vue3实现一个飘逸元素拖拽功能,并在实例中了解相关知识点,希望对大家有所帮助!

在Vue应用中使用vuex时出现“Error: [vuex] unknown action type: xxx”怎么解决? 在Vue应用中使用vuex时出现“Error: [vuex] unknown action type: xxx”怎么解决? Jun 25, 2023 pm 12:09 PM

在Vue.js项目中,vuex是一个非常有用的状态管理工具。它可以帮助我们在多个组件之间共享状态,并提供了一种可靠的方式来管理状态的变化。但在使用vuex时,有时会遇到“Error:[vuex]unknownactiontype:xxx”的错误。这篇文章将介绍该错误的原因及解决方法。1.错误原因在使用vuex时,我们需要定义一些actions和mu

See all articles