js组件之间的通信
应用场景:
1.在刷微博的时候,滑到某个头像上,会出现一张usercard(用户名片), 微博列表区有这个usercard, 推荐列表也有这个usercard,评论区也有。
2.在网上购物时,购物车安静的停留在页面的角落里,不声不响。你在页面上买了零食买了书,购物车还是安静的呆着,猛然间点开一看,安静的购物车已经躺满了。
以上两种,在模块化满天飞的今天,当然不可能面向过程的一一开发,你不能在微博列表,微博推荐和评论中逐一把用户名片功能开发一遍。实际上,常见
的做法是将usercard作为一个组件,当然,comment也是一个组件。购物车也是一个组件。怎么可以做到鼠标放到评论和回复的用户头像上显示名片呢?这里就涉及到了组件之间互相通信的机制。
组件的通信方法有多种,API 观察者 都可以。最好的方案我认为是使用事件机制。
所有组件之间可以通过一个叫eventbus通用组件进行信息的交互。
1. 在usercard组件中,可以监听 eventbus 的一个 usercard:show 事件。
2. 在需要展示usercard的组件中,可以触发eventbus的这个事件,必要的话传入对应的参数。
其实之前的时候也经常接触这样的用法,这次从一个博客中看到,就有了自己动手写的想法,一写之下发现也很简单,不知道是不是还有很多自己目前没想到的,先记录下来。
先看下这个事件机制组件(AMD规范下的代码)
define(function (require) {
    var config = {};
    // 用于事件的存储;
    config.eventList = {};
    /*
    * 事件定义
    * @param {string} 事件的名称;
    * @param {function} function
     */
    config.on = function (name, func) {
        var me = this;
        if (!me.eventList[name]) {
            me.eventList[name] = func;
        }
        else {
            alert('这个方法名已经被用过了,请换一个名字');
        }
    };
    /*
    * 事件触发
    *@param {string} 事件名称;
    *@param {obj} 事件中的参数
     */
    config.emit = function (name, data) {
        var me = this;
        if (me.eventList[name]) {
            me.eventList[name](data);
        }
        else {
            alert('没有找到对应的方法');
        }
    };
    return config;
});
一个是定义,一个是触发。看起来很简单的样子。现在写两个组件来试一下吧
第一个组件,usercard,需要在这里定义 usercard:show事件。
define(function (require) {
    var eventBus = require('eventBus');
    var config = {};
    config.add = function () {
        var obj = {
            name: 'usercard',
            type: 'mouseover'
        };
       // 这里定义eventbus的事件
        eventBus.on('usercard:show', function (data) {
            obj = $.extend(obj, data);
            data.node.title = data.sid;
            data.node.style.backgroundColor = 'red';
        });
    };
    return config;
})
再写一个组件 comment 用于触发eventbus的
define(function (require) {
    var eventBut = require('eventBut');
    var config = {};
    var DomEvent = {
    };
    function domEvents() {
        $("#commentList").delegate('dt', 'click', function (e) {
            var target = e.target;
            var sid = target.getAttribute('sid');
           // 触发事件
            eventBut.emit('usercard:show',{
                sid: sid,
                node: target
            });
        });
    }
    config.init = function () {
        domEvents();
    }
    return config;
});
写一个页面 来加载
<script>
require(['comment', 'userCard'], function (comment, usercard) {
usercard.add();
comment.init();
})
</script>
测试了一下 是可以的~~
js组件之间的通信的更多相关文章
- Vue.js组件之间的通信
		导语:组件之间的关系不外乎两种, 父子组件和非父子组件,本文将对两类组件之间的通信方式进行详细阐述. 父子组件间的通信 通信方式1(单向绑定): Props down, Events up (建议使用 ... 
- 使用reflux进行react组件之间的通信
		前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ... 
- react8 组件之间的通信
		<body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ... 
- vue 基础-->进阶 教程(3):组件嵌套、组件之间的通信、路由机制
		前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零开始,教给大家vue的基础.高级操作.组件 ... 
- Vue组件以及组件之间的通信
		一.组件的注册 1. 全局组件注册 1. 注册基本语法Vue.component Vue.component("my_header", { template: `<div&g ... 
- Vue 组件&组件之间的通信 之 非父子关系组件之间的通信
		Vue中不同的组件,即使不存在父子关系也可以相互通信,我们称为非父子关系通信: 我们需要借助一个空Vue实例,在不同的组件中,使用相同的Vue实例来发送/监听事件,达到数据通信的目的: 实例: 初始加 ... 
- Vue 组件&组件之间的通信  父子组件的通信
		在Vue的组件内也可以定义组件,这种关系成为父子组件的关系: 如果在一个Vue实例中定义了component-a,然后在component-a中定义了component-b,那他们的关系就是: Vue ... 
- vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)
		vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ... 
- 使用EventBus实现兄弟组件之间的通信
		使用EventBus实现兄弟组件之间的通信 需求:为了实现菜单折叠的效果,例如http://blog.gdfengshuo.com/example/work/#/dashboard header组件和 ... 
随机推荐
- Vim命令合集
			1.模式切换 三种模式:命令模式,输入模式,底行模式 命令模式与输入模式之间的切换:i esc 命令模式与底行模式的切换:shift + : esc 2. 插入 i:在当前字符的左边插入 I:在当前 ... 
- oracle合并版本
			1) 添加字段,并自增 第一步:alter table TOWN add ID int 第二步:Update TOWN set id=rownum; Commit; 2) 更新表(另一张表) ... 
- VBA Excel 对比两列数据
			Sub Md() ' ' Macro1 Macro ' 宏由 BX 录制,时间: 2012-6-8 ' 宏中的列数可以输入 A - IV 也可以输入 1-256 ' Dim i%, j%, i1%, ... 
- C#获取程序集自动增加的版本号和编译时间
			1. 首先找到文件AssemblyInfo.cs, 路径如下: 2. 修改版本的格式,修改后,程序每次编译,程序集的版本号都会自增. 修改前: [assembly: AssemblyVersion(& ... 
- asp.net程序集冲突解决笔记(未能加载文件或程序集"XXXXXXXXX")
			先来看张截图.(未能加载文件或程序集”System.Web.Razor“) 先说一下我的情况.(扯蛋的,解决方法还在下面 —> _ < ) 这是 ASP.NET MVC 的东西.老大写了一 ... 
- C#实现MS-Office文档转Pdf(Word、Execel、PowerPoint、Visio、Project)
			using System; using Microsoft.Office.Core; namespace Office { class Util { private Util() { } /// &l ... 
- makfile
			1. Makefile 简介 Makefile 是和 make 命令一起配合使用的. 很多大型项目的编译都是通过 Makefile 来组织的, 如果没有 Makefile, 那很多项目中各种库和代码之 ... 
- QT5.2.1大BUG
			本来以为5.2.1是release版本 谁知道编译某个程序,执行老是crash 换5.3.2就ok了. 坑啊 
- H5学习系列之文件读取API--本文转自http://blog.csdn.net/jackfrued/article/details/8967667
			HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简 ... 
- python课程第三周重点记录
			1.关于set,set是一个无序且不重复的元素集合 s = set(["ss","dd","pp"]) #创建set s1 = set([& ... 
