This repository was archived by the owner on Nov 12, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
如何开发一个view #47
Comments
更高效的view更新
let Magix = require('magix');
module.exports = Magix.View.extend({
tmpl: '@view.html',
init(extra) {
//初始化时保存一份当前数据的快照
this.updater.snapshot();
//该处是否可以由magix自动调用
this.assign(extra);
},
assign(data) {
let me = this;
//赋值前先进行数据变化的检测,首次assign是在init方法中调用,后续的调用是magix自动调用,这个检测主要用于在首次调用后,magix自动调用前有没有进行数据的更新
let altered = me.updater.altered();
//你可以在这里对数据data进行加工,然后通过set方法放入到updater中
me.updater.set(data);
//如果数据没变化,则设置新的数据后再次检测
if (!altered) altered = me.updater.altered();
if (altered) {//如果有变化,则再保存当前的快照,然后返回true告诉magix当前view需要更新
me.updater.snapshot();
return true;
}
return false;//如果数据没变化,则告诉magix当前view不用更新
},
render() {
//view首次渲染及后续数据有变化时进行更新
console.log('render');
this.updater.digest();
}
}); |
代码改善
let Magix = require('magix');
module.exports = Magix.View.extend({
tmpl: '@view.html',
init(extra) {
this.assign(extra);
},
assign(data) {
let me = this;
//你可以在这里对数据data进行加工,然后通过set方法放入到updater中
me.updater.set(data);
//不管数据有没有变化都更新当前view
return true;
},
render() {
console.log('render');
this.updater.digest();
}
}); |
nb啊 |
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
通过Magix.View.extend方法来实现
view的生命周期
显式的init、render方法
隐式的destroy,domready等事件接口
全局的htmlchanged事件
view的使用及分类
自身完整型
在外部来看要想改变calendar组件,只能通过参数,没有其它的途径
内部必有js及html,且只接收参数控制显示的我们把它定义为自身完整型组件
附加行为型
内部没有html,且对现有dom节点做增强的组件,我们把它定义为附加行为型组件
混合型
或
差异化更新
html片断拆分的形式
该方式需要配合magix-combine工具对开发者编写的html模板做线下分析,自动把模板拆分成n多子模板片断,每个片断关联着对应的数据key,当数据有变化时,会找到相应的子模板片断,最小化的更新界面
如模板
会被处理成这样的片断对象
这样如果只有list这个数据发生变化时,只有第一个div会被重新渲染
这种方式受dom结构的影响,无法再做进一步的细粒度的拆分,有时候刷新区域仍然较大
真实dom节点比对更新
因为magix一直使用的是字符串模板,如果直接转成虚拟dom的形式,要想性能最优,jsx是最理想的方式(通过工具直接把类似字符串的形式转成方法的调用)。这样一来开发者需要做很大的转变,再一个目前也没有人和精力来做这个事情。
关于dom diff网上的方案非常多,虚拟和虚拟的,虚拟和真实的,真实和真实等。考虑到成本问题,目前采用的是真实dom与真实dom的对比(1.不需要考虑浏览器兼容2.不需要做转换3.不需要自己实现),只做好diff即可。https://github.com/patrick-steele-idem/morphdom
差异化更新与组件的问题
组件销毁、重建问题
考虑这样的html代码
mx-calendar组件的日期选中受currentDate的控制,如果第一次currentDate是2018-01-01,数据变化后currentDate是2018-04-01
magix在差异化更新时,由于组件所在的节点是一个特殊节点,比较到该节点时,因为不知道组件会如何变化,所以会销毁旧组件,更新完dom节点后,再实例化新组件。
这样一来因为一个小小的数据变化,需要销毁旧组件,再渲染新组件,显得比较笨重了。
magix中节点diff的步骤如下:
流程中重要的一点是组件即view有没有assign方法,如果有该方法,则调用该方法把数据传递进去,组件在该方法内完成数据的更新,如果该方法的返回值是true,则再调用组件的render方法完成更新,从而不需要销毁组件
自己添加的属性被删除问题
其它问题
dom比对的方式千万不要自己创建、删除任何节点!!!
The text was updated successfully, but these errors were encountered: