You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 原来的 _render 函数,为了将职责拆分得更细,将 virtual dom 转为 real dom 的函数单独抽离出来functionvdomToDom(vdom){if(_.isFunction(vdom.nodeName)){// 为了更加方便地书写生命周期逻辑,将解析自定义组件逻辑和一般 html 标签的逻辑分离开constcomponent=createComponent(vdom)// 构造组件setProps(component)// 更改组件 propsrenderComponent(component)// 渲染组件,将 dom 节点赋值到 componentreturncomponent.base// 返回真实 dom}
...
}
该系列文章在实现 cpreact 的同时理顺 React 框架的核心内容
生命周期
先来回顾 React 的生命周期,用流程图表示如下:
该流程图比较清晰地呈现了 react 的生命周期。其分为 3 个阶段 —— 生成期,存在期,销毁期。
因为生命周期钩子函数存在于自定义组件中,将之前 _render 函数作些调整如下:
我们可以在 setProps 函数内(渲染前)加入
componentWillMount
,componentWillReceiveProps
方法,setProps 函数如下:而后我们在 renderComponent 函数内加入
componentDidMount
、shouldComponentUpdate
、componentWillUpdate
、componentDidUpdate
方法测试生命周期
测试如下用例:
页面加载时输出结果如下:
点击按钮时输出结果如下:
diff 的实现
在 react 中,diff 实现的思路是将新老 virtual dom 进行比较,将比较后的 patch(补丁)渲染到页面上,从而实现局部刷新;本文借鉴了 preact 和 simple-react 中的 diff 实现,总体思路是将旧的 dom 节点和新的 virtual dom 节点进行了比较,根据不同的比较类型(文本节点、非文本节点、自定义组件)调用相应的逻辑,从而实现页面的局部渲染。代码总体结构如下:
下面根据不同比较类型实现相应逻辑。
对比文本节点
首先进行较为简单的文本节点的比较,代码如下:
对比非文本节点
对比非文本节点,其思路为将同层级的旧节点替换为新节点,代码如下:
对比自定义组件
对比自定义组件的思路为:如果新老组件不同,则直接将新组件替换老组件;如果新老组件相同,则将新组件的 props 赋到老组件上,然后再对获得新 props 前后的老组件做 diff 比较。代码如下:
遍历对比子节点
遍历对比子节点的策略如下:
代码如下:
测试
在生命周期的小节中,componentWillReceiveProps 方法还未跑通,稍加修改 setProps 函数即可:
来测试下生命周期小节中最后的测试用例:
鸣谢
Especially thank simple-react for the guidance function of this library. At the meantime,respect for preact and react
The text was updated successfully, but these errors were encountered: