vue:
通过defineProperty或proxy对数据进行劫持,数据变化调用render函数,template模板默认会转成render函数,render函数里又通过h函数的调用。
react:
没有数据劫持,那react怎么知道数据发生更新呢?通过调用setState,render函数重新执行,来更新state中的数据,然后重新渲染页面。
渲染流程:
render函数 -> jsx -> 虚拟dom -> 真实dom
更新流程:
props/state发生改变 -> render函数重新执行 -> 产生新的dom树 -> 新旧dom数进行diff -> 计算出差异进行更新 -> 更新到真实的dom
setState:
为什么是异步的?为了提高性能,如果每一次调用setState 意味着render函数都会被执行,重新渲染新的dom,进行diff算法,效率低。最好的办法是获取多个更新,批量更新,把每一个setState都放进一个队列里,等到真正更新时,合并每一个setState,进行一次render函数。