前言

相信一说到监听,当然就离不了设计模式中鼎鼎大名的观察者模式。举个例子,你家后院着火了,可一定要等到烟雾很大火光很亮你才能发现啊,可是当你安装了一个火灾预警器,当发生火灾就立马能够通知到你了。这就是一个典型的观察者模式。当然也还有一些其他变种,比如发布/订阅(publish/subscribe)模式。
我们知道如果要将数据和视图关联起来,在数据变更的时候,同步视图,同理视图变更,数据也发生变化。vue.js是怎么实现这个的呢?下面我们来揭开它的神秘面纱。
demo:
<script src="../vue.js"> </script>
<div id="app">
<p>
{{ message }}
</p>
<input v-model="message">
</div>
<script type="text/javascript">
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
}
});
</script>
set: function reactiveSetter(newVal) {
var value = getter ? getter.call(obj) : val;
if (newVal === value) {
return;
}
if (setter) {
setter.call(obj, newVal);
} else {
val = newVal;
}
childOb = observe(newVal);
dep.notify();
}
这段代码出现在解析data属性的时候,即调用Object.defineProperty方法配置data的属性。一旦属性发生变化,就notify发送广播。
Dep.prototype.notify = function () {
// stablize the subscriber list first
var subs = toArray(this.subs);
for (var i = 0, l = subs.length; i < l; i++) {
subs[i].update();
}
};
notify 最终是周知subscribe(订阅者)更新,那么上面的数据变更就是发布者。 subscribe是Watcher这个类的实例化对象,在实例化的时候,会传入回调函数来执行update,vue弄了一个队列来执行watcher的更新函数,具体可参考源码。
Watcher.prototype.run = function () {
……
if (value !== this.value || (isObject(value) || this.deep) && !this.shallow) {
……
} else {
this.cb.call(this.vm, value, oldValue);
}
}
this.queued = this.shallow = false;
}
};
在Directive(指令)class中实例化了Watcher,_update函数负责来更新
var watcher = this._watcher = new Watcher(this.vm, this.expression, this._update, // callback
{
filters: this.filters,
twoWay: this.twoWay,
deep: this.deep,
preProcess: preProcess,
postProcess: postProcess,
scope: this._scope
});
在解析模板的时候会解析Directive,然后绑定,实例化watcher,这样模板-data就关联在一起了。
图片描述
观察者模式
林林总总的mvc或者mvvm框架基本也都是利用了观察者模式,这个也非常有用,尤其在复杂的系统之中。
利用观察者模式,在典型的ajax应用中,回调的处理逻辑可以不跟请求耦合在一块,这样逻辑上也会更加清晰。如下是一个简单的发布/订阅模式的实现
var PubSub = {};
(function (q) {
var topics = {}, subUid = -1;
q.publish = function (topic) {
if(!topics[topic]){
return false;
}
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while(len--){
var args = Array.prototype.slice.call(arguments, 1);
args.unshift(topic);
subscribers[len].callback.apply(this, args);
}
return this;
};
q.subscribe = function (topic, callback) {
if(!topics[topic]){
topics[topic] = [];
}
var subuid = (++subUid).toString();
topics[topic].push({
token: subuid,
callback: callback
});
return subuid;
};
q.unsubscribe = function (subid) {
for(var k in topics){
if(topics[k]){
for(var i = 0, j = topics[k].length; i < j; i++){
if(topics[k][i].token === subid){
topics[k].splice(i, 1);
return subid;
}
}
}
}
return this;
};
})(PubSub);
这就是一个简单的订阅发布系统,每注册一个订阅者,其实就是将其回调处理的callback保存在一个字典对象的数组中,字典对象的key值可以随意定义,只要与发布时的key对应起来就好。
怎么使用呢?
<script>
var messageLogger = function(){
console.log(JSON.stringify(arguments));
};
var subscription = PubSub.subscribe('/newMessage', messageLogger);
// {"0":"/newMessage","1":"hello world"}
PubSub.publish('/newMessage', 'hello world');
// {"0":"/newMessage","1":["test","a","b","c"]}
PubSub.publish('/newMessage', ['test', 'a', 'b', 'c']);
// {"0":"/newMessage","1":{"sender":"hello world","body":"hey man"}}
PubSub.publish('/newMessage', {
sender: 'hello world',
body: 'hey man'
});
PubSub.unsubscribe(subscription);
PubSub.publish('/newMessage', ['test', 'a', 'b', 'c'], 1);
</script>
最后一个将不会打印出来,因为已经取消订阅了。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# vue.js
# 监听
# vue
# js
# 监听数据变化
# 监听事件
# 用Vue.js实现监听属性的变化
# Vue.JS入门教程之事件监听
# 详解使用vue-router进行页面切换时滚动条位置与滚动监听事件
# vue.js 1.x与2.0中js实时监听input值的变化
# 详解Vue监听数据变化原理
# vue监听滚动事件实现滚动监听
# Vue.js实战之通过监听滚动事件实现动态锚点
# Vue监听数组变化源码解析
# vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
# Vue监听数据对象变化源码
# 是一个
# 回调
# 这就
# 周知
# 都是
# 也会
# 鼎鼎大名
# 出现在
# 是怎么
# 就好
# 当你
# 林林总总
# 说到
# 将其
# 这段
# 你了
# 要将
# 这篇文章
# 谢谢大家
# 发布系统
相关文章:
如何在服务器上三步完成建站并提升流量?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何选择CMS系统实现快速建站与SEO优化?
如何用AWS免费套餐快速搭建高效网站?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
建站之星导航如何优化提升用户体验?
无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?
自助网站制作软件,个人如何自助建网站?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
建站之星后台密码遗忘或太弱?如何重置与强化?
建站之星伪静态规则如何正确配置?
如何用PHP工具快速搭建高效网站?
巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成
微信小程序制作网站有哪些,微信小程序需要做网站吗?
想学网站制作怎么学,建立一个网站要花费多少?
微信推文制作网站有哪些,怎么做微信推文,急?
如何选择美橙互联多站合一建站方案?
专业公司网站制作公司,用什么语言做企业网站比较好?
h5在线制作网站电脑版下载,h5网页制作软件?
小型网站建站如何选择虚拟主机?
详解jQuery中基本的动画方法
小程序网站制作需要准备什么资料,如何制作小程序?
网站制作的方法有哪些,如何将自己制作的网站发布到网上?
如何选择域名并搭建高效网站?
如何快速辨别茅台真假?关键步骤解析
如何快速启动建站代理加盟业务?
安云自助建站系统如何快速提升SEO排名?
如何快速搭建二级域名独立网站?
如何在云虚拟主机上快速搭建个人网站?
招商网站制作流程,网站招商广告语?
,购物网站怎么盈利呢?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
建站主机选购指南:核心配置与性价比推荐解析
如何在万网开始建站?分步指南解析
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
网站制作多少钱一个,建一个论坛网站大约需要多少钱?
网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?
c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】
建站之星安装模板失败:服务器环境不兼容?
湖北网站制作公司有哪些,湖北清能集团官网?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
全景视频制作网站有哪些,全景图怎么做成网页?
Swift中swift中的switch 语句
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
如何用5美元大硬盘VPS安全高效搭建个人网站?
建站之星代理商如何保障技术支持与售后服务?
如何快速搭建支持数据库操作的智能建站平台?
如何零基础在云服务器搭建WordPress站点?
建站之星各版本价格是多少?
*请认真填写需求信息,我们会在24小时内与您取得联系。