专栏名称: CSDN
CSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。
目录
相关文章推荐
36氪  ·  一位县城「贵妇」的春节消费记录 ·  昨天  
冷眼局中人  ·  解构DeepSeek-R1:一场AI效率革命 ... ·  2 天前  
冷眼局中人  ·  解构DeepSeek-R1:一场AI效率革命 ... ·  2 天前  
硅星人Pro  ·  DeepSeek爆火后,它的研究员们怎么样了 ·  2 天前  
36氪  ·  连微商都嫌弃玛莎拉蒂了 ·  2 天前  
51好读  ›  专栏  ›  CSDN

巧用React Fiber中的渲染字符串新功能

CSDN  · 公众号  · 科技媒体  · 2017-05-22 10:48

正文

虽然React Fiber还没有正式发布,但是我们已经可以预先领教其带来的新的编程模式了。


在React Fiber中,render函数可以直接返回一个字符串了,换言之,一个组件可以直接渲染为一个字符串,而不是必须渲染为一个HTML模样的物体。


举个例子,下面这个控件LongString,显示一个input和一个p,p中文字可以是很长的字符串,相当于一个模板,在input中输入的字符串会用来填补p中的模板。



代码如下:



上面组件的工作原理是通过事件处理函数onInputChange来更新组件的state,引发组件重新渲染,这样this.state.str才能在渲染过程中被显示。


上面的组件工作完全正确,但是有个问题,就是每一次在input中更新内容,都会引发LongString的更新过程,在浏览器的console中,可以看到render函数被反复调用的痕迹。



想想看,其实LongString组件渲染了很长的字符串,每次更新的只有一小部分,却依然走整个渲染过程,实在有那么一点点浪费,有没有更好的办法呢?


在以前,也有办法,就是把更新的子串让另一个子组件来渲染,可以做到只更新那一个子组件,但是子组件必须把更新的子串放在某个HTML元素中,比如,这样就污染了LongString渲染的长字符串。假如input中是hello,产生的HTML就像下面这样。



而我们实际想要的是这样。



有了React Fiber之后,一个组件可以直接返回一个字符串了,这样我们就可以既保持字符串局部更新,又避免被HTML标签污染。


代码如下:



我们用LongStringChunked代替LongChunk,在render函数中用Chunk这个组件实例代替this.state.str,传递给Chunk的listen这个prop是一个EventEmitter,当input变化的时候,通过这个EventEmitter发出一个信号让Chunk去更新自己,而不是让LongStringChunked重新绘制。



重新尝试在input里写点啥,在浏览器console中可以看到,LongStringChunked的render函数没有被反复调用,只有Chunk组件被反复渲染,因为Chunk组件渲染的内容要比LongStringChunked少得多,所以(理论上)要节省得多。








请到「今天看啥」查看全文