什么是动态插入节点
在web端加入我们需要实现一个可以通过API调用的 Toast,我们可以这样实现:
我们依赖的就是浏览器Document对象,提供的可以操作dom的方法。但是我们都知道小程序没有提供Document对象,那么我们该如何去实现类似的功能呢?
在taro中动态插入节点的实现
为什么可以这样实现?
引文
在使用 React 时,我们会引用 react 和 react-dom 。而在 react-dom 中依赖 react-reconciler。
那么三者各自负责什么部分,又有什么联系呢?推荐阅读 react-dom 与 react 之间的关系
总结来说:react 负责描述特性,提供React API,react-dom 负责实现特性操作真实的 dom 节点。
taro 中的 react-dom
我们知道 web端 有 react-dom, 移动端 有 react-native。那么 taro 又是通过什么操作小程序 dom 的呢? 答案是 @tarojs/react,与 web端、移动端一样 @tarojs/react依赖 react-reconciler。
但我们都知道小程序并没有提供像 web端 一样的操作 dom 的方法。那么@tarojs/react又是怎么实现对小程序 dom 的操作的呢? 答案是@tarojs/runtime。
源码
TaroDocument
就是上述
demo中所引入的document对象
TaroElement
TaroNode
通过层层继承关系最终 document.appendChild()方法调用的是 TaroNode 类中的 appendChild。而TaroNode 类中的 appendChild方法通过层层逻辑调用最终调用了this._root?.enqueueUpdate(payload)即根节点中的enqueueUpdate方法,也就是TaroRootElement类中的enqueueUpdate方法
TaroRootElement
通过层层调用 enqueueUpdate 方法最终调用 performUpdate 方法。而 performUpdate 方法的核心是 ctx.setData() 是不是感觉和微信页面的 setData 很像?其实不止是像,他调用的就是微信的setData。
createPageConfig
仔细阅读以下源码可知
- 获取页面根节点的方法为
document.getElementById<TaroRootElement>($taroPath)。 TaroRootElement中ctx的值为页面this,所以TaroRootElement中ctx.setState其实就是微信页面的this.setState
总结
最后我们可以看看我们的小程序编译结果,其中有一个base.wxml是每一个页面的index.wxml依赖的,而每一个页面的index.wxml都和上面列出的代码一致。所以taro渲染的真相就是通过对小程序的data进行循环得出而dom更新的真相就是setState。那么我们同样可以通过@tarojs/react和@tarojs/runtime动态操作小程序dom与web端的体验一致。
评论
发表评论