应用场景:

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组件之间的通信的更多相关文章

  1. Vue.js组件之间的通信

    导语:组件之间的关系不外乎两种, 父子组件和非父子组件,本文将对两类组件之间的通信方式进行详细阐述. 父子组件间的通信 通信方式1(单向绑定): Props down, Events up (建议使用 ...

  2. 使用reflux进行react组件之间的通信

    前言 组件之间为什么要通信?因为有依赖. 那么,作为React组件,怎么通信? React官网说, 进行 父-子 通信,可以直接pass props. 进行 子-父 通信,往父组件传给子组件的函数注入 ...

  3. react8 组件之间的通信

    <body><!-- React 真实 DOM 将会插入到这里 --><div id="example"></div> <!- ...

  4. vue 基础-->进阶 教程(3):组件嵌套、组件之间的通信、路由机制

    前面的nodejs教程并没有停止更新,因为node项目需要用vue来实现界面部分,所以先插入一个vue教程,以免不会的同学不能很好的完成项目. 本教程,将从零开始,教给大家vue的基础.高级操作.组件 ...

  5. Vue组件以及组件之间的通信

    一.组件的注册 1. 全局组件注册 1. 注册基本语法Vue.component Vue.component("my_header", { template: `<div&g ...

  6. Vue 组件&组件之间的通信 之 非父子关系组件之间的通信

    Vue中不同的组件,即使不存在父子关系也可以相互通信,我们称为非父子关系通信: 我们需要借助一个空Vue实例,在不同的组件中,使用相同的Vue实例来发送/监听事件,达到数据通信的目的: 实例: 初始加 ...

  7. Vue 组件&组件之间的通信 父子组件的通信

    在Vue的组件内也可以定义组件,这种关系成为父子组件的关系: 如果在一个Vue实例中定义了component-a,然后在component-a中定义了component-b,那他们的关系就是: Vue ...

  8. vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制)

    vuex-- Vue.的中心化状态管理方案(vue 组件之间的通信简化机制) 如果你在使用 vue.js , 那么我想你可能会对 vue 组件之间的通信感到崩溃 .vuex就是为了解决组件通信问题的. ...

  9. 使用EventBus实现兄弟组件之间的通信

    使用EventBus实现兄弟组件之间的通信 需求:为了实现菜单折叠的效果,例如http://blog.gdfengshuo.com/example/work/#/dashboard header组件和 ...

随机推荐

  1. app跳转openURL,兼容方法

    - (void)openScheme:(NSString *)scheme {   UIApplication *application = [UIApplication sharedApplicat ...

  2. c#FileStream文件读写(转)

    FileStream对象表示在磁盘或网络路径上指向文件的流.这个类提供了在文件中读写字节的方法,但经常使用StreamReader或StreamWriter执行这些功能.这是因为FileStream类 ...

  3. JS逻辑运算符&&与||的短路运算

    最近看到一个360面试题,题目如下: 下面代码的输出值是? alert(1&&2); 正确的结果是 2. 1.后来仔细研究了一下JS逻辑运算的相关内容,在MDN上面找到相应描述: 下面 ...

  4. 第一次到IT公司上班!

    今日是自个的首次正式到IT公司进行作业,感触也是别有一番兴趣!如今就让自个回味下第一天的作业经历吧! 我上班的公司叫西安西科软件技术有限公司,第一天上班的缘故,早上起得很早,差不多六点半还没到就起床洗 ...

  5. 背包九讲 && 题目

    ★.背包求方案数的时候,多重背包是不行的,因为产生重复的背包会有多种情况. ★.背包记录路径的时候,其实是不行的,因为更新了12的最优解,如果它依赖于6这个背包,然后你后面改变了6这个背包,就GG 1 ...

  6. (转载)python2+selenium自动化测试系列(一)

    1.Selenium2+python自动化1-环境搭建 2.Selenium2+python自动化2-pip降级selenium3.0 3.Selenium2+python自动化3-解决pip使用异常 ...

  7. NGUI 新手引导

    现在我们的游戏已到了开发后期,这个时候需要做新手引导这一块(恶心的新手引导,真想说游戏行业究竟哪个2B最先想出来要引导的???代码搞的到处都是,改了一次又改!) 吐槽过后进入正题:主要还是UI相关的操 ...

  8. 使用re-sign.jar对apk进行重签名

    准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 待重签名的apk:      重签名步骤: ① 右键re ...

  9. Jquery div展开收缩

    <html> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...

  10. hash 表 | | jzoj 1335 | | 脑残+手残 | | 集合的关系

    给定两个集合A.B,集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5.我们希望求出A.B之间的关系. 给定两个集合的描述,判断它们满足下列关系的哪一种:A是B的一个 ...