博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React as a UI Runtime(四、条件)
阅读量:6266 次
发布时间:2019-06-22

本文共 2249 字,大约阅读时间需要 7 分钟。

如果React在更新中只重用与元素类型相匹配的宿主实例,那按渲染条件选择的内容怎么办呢?
正如下面的代码,假如我们开始至需要一个
input,但稍后需要在它之前渲染一个
message
// 第一次渲染ReactDOM.render(  
, domContainer);// 第二次渲染ReactDOM.render(

I was just added here!

, domContainer);

在这个例子中,<input>宿主实例将会被重建。React会遍历元素树,并与之前的版本比较:

  • dialog → dialog: 可以重复使用吗? 可以-type匹配。
  • input → p:可以重复使用吗?不行,type已经改变了!需要删除存在的input,并创建新的p宿主实例。
  • (nothing) → input: 需要新建一个input宿主实例。

React这样的代码是如下的:

let oldInputNode = dialogNode.firstChild;dialogNode.removeChild(oldInputNode);let pNode = document.createElement('p');pNode.textContent = 'I was just added here!';dialogNode.appendChild(pNode);let newInputNode = document.createElement('input');dialogNode.appendChild(newInputNode);

这不是一种好的更新方式,因为原则上input并没有被p替代-它仅仅是移动了。我们不想要因为重新创建Dom元素而失去它的选中状态,聚焦状态和显示内容。

幸好这个问题有一个简单的修复方式,他并不在React应用中常见。
在实践中,你很少会直接调用ReactDOM.render,实际上,React app常常会拆分成像下面这样的函数:

function Form({ showMessage }) {  let message = null;  if (showMessage) {    message = 

I was just added here!

; } return (
{message}
);}

This example doesn’t suffer from the problem we just described. It might be easier to see why if we use object notation instead of JSX. Look at the dialog child element tree:

这个例子并不会有我们之前描述的那个问题,如果我们使用对象来代替JSX描述会更加明显,下面是dialog子元素树:

function Form({ showMessage }) {  let message = null;  if (showMessage) {    message = {      type: 'p',      props: { children: 'I was just added here!' }    };  }  return {    type: 'dialog',    props: {      children: [        message,        { type: 'input', props: {} }      ]    }  };}

function Form({ showMessage }) {

let message = null;
if (showMessage) {

message = {  type: 'p',  props: { children: 'I was just added here!' }};

}

return {

type: 'dialog',props: {  children: [    message,    { type: 'input', props: {} }  ]}

};

}

不管showMessage 是true的还是false,<input>是第二个子元素,并且在render中不会改变它的位置。

如果showMessage 从false变为true,React会遍历元素树,并与之前的版本相比较:

  • dialog → dialog:可以重复使用吗? 可以-type匹配。
  • (null) → p:需要插入一个新的p宿主实例。
  • input → input: 可以重复使用吗? 可以-type匹配。

那么React会执行类似于下面的代码:

let inputNode = dialogNode.firstChild;let pNode = document.createElement('p');pNode.textContent = 'I was just added here!';dialogNode.insertBefore(pNode, inputNode);

input的状态并不会改变

转载地址:http://qzvpa.baihongyu.com/

你可能感兴趣的文章
ES6 Module export与import复合使用
查看>>
第三篇、image 设置圆角的几种方式
查看>>
关于Vs2010 C#使用DirectX的问题
查看>>
EPP(Eclipse PHP)语法高亮仿EditPlus配置
查看>>
OA账号架构权限的问题
查看>>
030——VUE中鼠标语义修饰符
查看>>
python编辑csv
查看>>
sql游标的使用与exec的两种用法
查看>>
数据结构
查看>>
78/90 Subsets --back tracking
查看>>
非托管资源的释放
查看>>
开篇寄语
查看>>
Dijkstra算法的C++实现
查看>>
phpstorm psr2样式.xml
查看>>
js 无限级分类
查看>>
umask值与Linux中文件和目录权限的关系
查看>>
python自动化开发-8
查看>>
bzoj 2127: happiness
查看>>
Python 3.5 之路 day1
查看>>
selenium使用chrome抓取自动消失弹框的方法
查看>>