Omi框架学习之旅 - 生命周期 及原理说明
生命周期
| name | avatars | company |
|---|---|---|
| constructor | 构造函数 | new的时候 |
| install | 初始化安装,这可以拿到用户传进的data进行处理 | 实例化 |
| installed | 安装完成,HTML已经插入页面之后执行 | 实例化 |
| uninstall | 卸载组件。执行remove方法会触发该事件 | 销毁时 |
| beforeUpdate | 更新前 | 存在期 |
| afterUpdate | 更新后 | 存在期 |
示意图

以上是官网的,看着让人还是挺明白的。但是我还是喜欢用我的理解解说一把。
生命周期指一个对象的生老病死。具体来说是继承Omi.Component类的子类的实例的生命周期。
1. 当我们 new 子类的时候, 子类的实例会得到Omi.Component类的所以属性和方法。
2. 当我们使用Omi.render方法时,其实调用的是Component类上的_render方法,在这个方法前后会分别调用install和installed方法,就如上图的左边部分。
3. 实例的存在期呢,我们经常会调用updade方法更新dom节点,那在这个update方法之前会分别调用beforeUpdate和afterUpdate,就如上图的右边部分。
4. 实例销毁期,就是就是调用实例的remove方法,期间也会调用update方法(那么必然会调用beforeUpdate,afterUpdate方法),之后呢会调用uninstall方法。就如上图的右下角部分。
老规矩:先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明。
class Timer extends Omi.Component {
constructor(data) {
super(data);
}
install() {
console.log('install');
this.data = {
secondsElapsed: 0
};
}
tick() {
this.data.secondsElapsed ++;
this.update();
}
installed() {
console.log('installed');
this.interval = setInterval(() => {
this.tick();
}, 1000);
}
uninstall() {
console.log('uninstall');
clearInterval(this.interval);
}
style() {
return `
.num {
color: red;
}
`;
}
beforeUpdate() {
console.log('beforeUpdata');
}
render() {
console.log('render');
return `
<div>
Seconds Elapsed:
<span class="num">
{{secondsElapsed}}
</span>
</div>
`;
}
afterUpdate() {
console.log('afterUpdate');
}
};
var time = new Timer();
Omi.render(time, '#app');
setTimeout(() => {
time.remove();
console.log('已卸载!');
}, 10000);
demo的疑问和疑问的说明:
疑问1:
Omi.render(time, '#app');的時候是不是就执行了install 和 installed 方法 啊? 答:是的,一般可以在install方法中给实例设置数据, installed方法中update设置好的数据。怎么实现的如下:上图中的2那个方法主要用来遍历实例是否还有孩子,有的话就遍历孩子,调用孩子的installed方法。如果孩子还有孩子就递归
_childrenInstalled(root){ // 实例
root.children.forEach((child) => { // 遍历实例的每一个孩子
this._childrenInstalled(child); // 递归(看看自己的孩子还有没有孩子children)
child.installed(); // 调用孩子实例installed方法
});
}
3那边的代码就执行installed方法。
这就是使用omi.render方法时要走的过程。
疑问2:
更新节点使用update方法,这个update到底做了什么? 答:
这个的要细细看来了,如下1 这里调用了beforeUpdate方法。
2 这里上面有解释,看代码,如下:
_childrenBeforeUpdate(root) { // 实例的孩子render方法前的回调
root.children.forEach((child)=>{
child.beforeUpdate(); // 跟新孩子的beforeUpdate方法回调
this._childrenBeforeUpdate(child); // 孩子的孩子
});
}
3 这里就是重新生成html css 事件转换,但是并不是无脑innerHTML,而是通过morphdom(this.node, this.HTML);来跟新节点的,这个morphdom不是虚拟dom,只是局部跟新dom节点,感兴趣的可以看看他的源码。
4 这里看看代码
_childrenAfterUpdate(root){
root.children.forEach((child)=>{
this._childrenAfterUpdate(child); // 孩子的孩子的afterUpdate方法
child.afterUpdate(); // 孩子的afterUpdate方法
});
}
5 那里就是调用自身的afterUpdate()方法,至此结束了。
疑问3:
实例的remove方法帮我们做了啥啊? 答:帮我们update了节点,只不过把节点改成了input节点影藏节点,然后调用了uninstall方法。如下:咋们直接进入1方法去看看
1 和 3 就是所谓生命周期的方法调用,我们进入2看看去,
其实要看的代码只是画圈的那个,我们进1看看,怎么帮我们生成一个影藏节点的,代码如下
之后就把以前的this.node节点直接换成这个创建好的节点。然后回到remove方法中的uninstall方法,就完了。 ps:
了解omi.Component实例的生命周期,当和子组件搭配时,可以很清楚了自己干了啥。
Omi框架学习之旅 - 生命周期 及原理说明的更多相关文章
- Omi框架学习之旅 - Hello World 及原理说明
学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...
- Omi框架学习之旅 - 之开篇扯蛋
说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...
- Omi框架学习之旅 - 通过对象实例来实现组件通讯 及原理说明
组件通讯不是讲完了吗(上帝模式还没讲哈),怎么又多了种方式啊. 你484傻,多一种选择不好吗? 其实这个不属于组件通讯啦,只是当父组件实例安装和渲染完毕后,可以执行installed这个方法(默认是空 ...
- Omi框架学习之旅 - 组件通讯(group-data通讯) 及原理说明
childrenData的方式可以批量传递数据给组件,但是有很多场景下data的来源不一定非要都从childrenData来, childrenData是个数组,会和组件的顺序一一对应,这就给不同传递 ...
- Omi框架学习之旅 - 组件 及原理说明
hello world demo看完后其实基本的写法就会了. 但是omi中的组件是神马鬼?其实我也不知道组件是啥. 百度百科是这么说的: 是对数据和方法的简单封装.es6中,一个类其实也可以做到对方法 ...
- Omi框架学习之旅 - 插件机制之omi-touch 及原理说明
这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...
- Omi框架学习之旅 - 插件机制之omi-router及原理说明
先来看看官网的介绍吧:https://github.com/AlloyTeam/omi/tree/master/plugins/omi-router 其实我推荐直接看官网的介绍.我所写的,主要给个人做 ...
- Omi框架学习之旅 - 插件机制之omi-transform及原理说明
给omi-transform插件做个笔记,使用起来也很爽. transform.js这个库,一直想写一篇帖子的,可是,数学不好,三维矩阵和二位矩阵理解的不好,所以迟迟没写了, 这也是一个神库,反正我很 ...
- Omi框架学习之旅 - 插件机制之omi-finger 及原理说明
以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...
随机推荐
- 【作业三】结队任务二-----CourseManagement
031302517 031302319 ps:共同完成一篇随笔,文章中的第一人称我(517),队友(319) 一.功能分析+实现思路+结队讨论 这里我将功能分析和实现思路还有结对过程中的一些讨论结合在 ...
- Django Rest framework 之 版本
RESTful 规范 django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) ...
- JS之iscroll.js的使用详解
入门 Scroll是一个类,每个需要使用滚动功能的区域均要进行初始化.每个页面上的iScroll实例数目在设备的CPU和内存能承受的范围内是没有限制的. 尽可能保持DOM结构的简洁.iScroll使用 ...
- 关于wsgi协议的理解
基础概念 首先要了解 WSGI 规范的概念,WSGI(Web Server Gateway Interface)规范描述了web server(Gunicorn,uWSGI等)如何与web appli ...
- fetch发送Form Data请求并携带cookie
今天我们来说说如何fetch发送Form Data请求并携带cookie,直接进入正题好吧,别问我今天为啥不在开始吹两句了,累到一句牛逼不想吹...... 步骤1: 设置头部,"Conten ...
- css中元素border属性的构成以及配合属性值transparent可得到一些特殊形状1.0
css中我们经常使用到元素的border属性和属性值transparent,可能好多人还不太了解border的构成以及配合transparent的一些效果: 1.border的构成如下所示: ht ...
- JavaScript异步和单线程
一,同步和异步的区别: 同步会阻塞代码执行,而异步不会.(比如alert是同步,setTimeout是异步) 二,前端使用异步的场景: 1,定时任务:setTimeout,setInterval 2, ...
- VUE组件 之 倒计时(防刷新)
思路: 一.效果图: 二.CSS代码 .box{ width: 300px; height: 100px; line-height: 100px; margin: 100px auto; backgr ...
- Salesforce的报表和仪表板
报表是现代企业中最常用到的功能之一.Salesforce中提供了强大的报表和仪表板功能. 报表和仪表板简介 报表是一组数据展示,用户可以自定义规则,只有符合相应规则的数据才会显示出来. Salesfo ...
- 配置Synwrite作为Python的IDE
先建立批处理 建立SynPython.bat ::Synwrite call Python to compile file ::Set Path @ set PATH=H:\XPprogram\Cod ...
上图中的2那个方法主要用来遍历实例是否还有孩子,有的话就遍历孩子,调用孩子的installed方法。如果孩子还有孩子就递归
1 这里调用了beforeUpdate方法。
咋们直接进入1方法去看看
1 和 3 就是所谓生命周期的方法调用,我们进入2看看去,
其实要看的代码只是画圈的那个,我们进1看看,怎么帮我们生成一个影藏节点的,代码如下
之后就把以前的this.node节点直接换成这个创建好的节点。然后回到remove方法中的uninstall方法,就完了。
ps: