生命周期

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框架学习之旅 - 生命周期 及原理说明的更多相关文章

  1. Omi框架学习之旅 - Hello World 及原理说明

    学什么东西都从hello world开始, 我也不知道为啥. 恩,先上demo代码, 然后提出问题, 之后解答问题, 最后源码说明. hello world - demo: class Hello e ...

  2. Omi框架学习之旅 - 之开篇扯蛋

    说实话, 我也不知道Omi是干啥的, 只因此框架是alloyTeam出的, dntzhang写的, 也有其他腾讯大神参与了, 还有一些其他贡献者, 以上我也不太清楚, 当我胡说八嘎. 因其写法有人说好 ...

  3. Omi框架学习之旅 - 通过对象实例来实现组件通讯 及原理说明

    组件通讯不是讲完了吗(上帝模式还没讲哈),怎么又多了种方式啊. 你484傻,多一种选择不好吗? 其实这个不属于组件通讯啦,只是当父组件实例安装和渲染完毕后,可以执行installed这个方法(默认是空 ...

  4. Omi框架学习之旅 - 组件通讯(group-data通讯) 及原理说明

    childrenData的方式可以批量传递数据给组件,但是有很多场景下data的来源不一定非要都从childrenData来, childrenData是个数组,会和组件的顺序一一对应,这就给不同传递 ...

  5. Omi框架学习之旅 - 组件 及原理说明

    hello world demo看完后其实基本的写法就会了. 但是omi中的组件是神马鬼?其实我也不知道组件是啥. 百度百科是这么说的: 是对数据和方法的简单封装.es6中,一个类其实也可以做到对方法 ...

  6. Omi框架学习之旅 - 插件机制之omi-touch 及原理说明

    这个插件也能做好多好多的事,比如上拉下拉加载数据,轮播,等一切和运动有关的特效. 具体看我的allowTouch这篇博客,掌握了其用法,在来看它是怎么和omi结合的.就会很简单. 当然使用起来也比较方 ...

  7. Omi框架学习之旅 - 插件机制之omi-router及原理说明

    先来看看官网的介绍吧:https://github.com/AlloyTeam/omi/tree/master/plugins/omi-router 其实我推荐直接看官网的介绍.我所写的,主要给个人做 ...

  8. Omi框架学习之旅 - 插件机制之omi-transform及原理说明

    给omi-transform插件做个笔记,使用起来也很爽. transform.js这个库,一直想写一篇帖子的,可是,数学不好,三维矩阵和二位矩阵理解的不好,所以迟迟没写了, 这也是一个神库,反正我很 ...

  9. Omi框架学习之旅 - 插件机制之omi-finger 及原理说明

    以前那篇我写的alloyfinger源码解读那篇帖子,就说过这是一个很好用的手势库,hammer能做的,他都能做到, 而且源码只有350来行代码,很容易看懂. 那么怎么把这么好的库作为omi库的一个插 ...

随机推荐

  1. linux -bash . startup.sh Permission denied

    在执行./startup.sh,或者./shutdown.sh的时候,爆出了Permission denied, 其实很简单,就是今天在执行tomcat的时候,用户没有权限,而导致无法执行, 用命令c ...

  2. 洛谷P4563 [JXOI2018]守卫(dp)

    题意 题目链接 Sol 非常有意思的题目. 我们设\(f[l][r]\)表示区间\([l,r]\)的答案. 显然\(r\)位置一定有一个保镖 同时不难观察到一个性质:拿\([1, n]\)来说,设其观 ...

  3. 将Windows下的InfluxDB、Grafana做成Windows服务

    从网上下载的Windows下的InfluxDB.Grafana,都是控制台程序,打开窗口后,很容易被别人给关掉,因此考虑做成Windows服务,nssm正是解决该问题的利器. 1.下载nssm htt ...

  4. 【转】对cocos2d 之autorelease\ratain\release的理解

    原文链接:http://blog.sina.com.cn/s/blog_4057ab6201018y4y.html Objective C内存管理进阶(二):理解autorelease: http:/ ...

  5. python中关于类隐藏属性的三种处理方法

    关于隐藏属性 引子: 当类的属性或者类实例对象的属性隐藏的时候必须通过存取器方法来获取和设置这些隐藏的属性. 例如: def get_name(self,name):     #存取器方法 self. ...

  6. Fiddler抓包使用教程-Https

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72956016 本文出自[赵彦军的博客] 开启 Https 抓包 Fiddler 默 ...

  7. (网页)Http状态码大全(200、404、500等)(转CSDN)

    当我们从客户端向服务器发送请求时 服务器向我们返回状态码 状态码就是告诉我们服务器响应的状态 通过它,我们就可以知道当前请求是成功了还是出现了什么问题 状态码是由3位数字和原因短语组成的(比如最常见的 ...

  8. jmeter利用自身代理录制脚本

    在利用代理录制脚本时一定要安装java jdk,不然不能录制的. 没有安装过java jdk安装jmeter后打开时会提示安装jdk,但是mac系统中直接打开提示安装jdk页面后下载的java并不是j ...

  9. scp 实现远程异地备份

    1.先做好脚本 2.再使用crontab 定时执行计划任务 0 1 * * * /usr/bin/expect /root/script/scpautodown.sh  #执行,也可先定义环境变量 0 ...

  10. Python实例---模拟微信网页登录(day5)

    第六步: 实现发送/接受消息---day5代码 settings.py """ Django settings for weixin project. Generated ...