【发布时间】:2018-03-16 04:51:36
【问题描述】:
我已经使用 react 大约 6 个月了,一直困扰我的是重新渲染的工作方式。
下面是一个传统的组件,它有一个输入框并将数据发送到服务器,其值被一些其他表单使用,以及多个几乎静态的 HTML 元素,这些元素从不使用或很少更改。我说的很少,因为静态元素可以构建并存储在componentWillMount() 方法中的变量中。但如果这个问题不止于此,render 应该包含对buildComplexHTMLFromData 方法的调用。
buildComplexHTMLFromData = (data) => {
// Lot of javascript to build the boxes based on the initial or data
// that changes so rarely
// array.map.filter.find etc.
return (
<div>
//Complex HTML element 1
//Complex HTML element 2
//....
//....
//Complex HTML element n
</div>
)
}
sendDataToBackend = (event) => {
this.setState(
{ value: event.target.value },
() => this.functionThatSendsDataToBackend()
)
}
render() {
<div>
// Active input that sends data to the backend
<input
value={this.state.value}
onChange={this.sendDataToBackend}
/>
{this.buildComplexHTMLFromData()}
</div>
}
现在在输入框更改时设置状态甚至会触发 buildComplexHTMLFromData 方法,该方法会再次执行复杂的 javascript。我听说 React 通过区分 DOM 来有效地重新渲染做了一些聪明的事情,但是这个 javascript 无论如何都会执行。
另一方面,使用两种sendDataToBackend 方法可以实现相同的功能,如下面的sn-p 所示。然而,这确保了只有目标输入元素被更改,而不会触及已经呈现的元素或在 buildComplexHTMLFromData 方法上执行任何 javascript。
buildComplexHTMLFromData = (data) => {
// Lot of javascript to build the boxes based on the initial or data
// that changes so rarely
// array.map.filter.find etc.
return (
<div>
//Complex input box 1
//Complex input box 2
//....
//....
//Complex input box n
</div>
)
}
sendDataToBackend = (event) => {
//First strategy
var element = document.getElementById("persistable-input");
element && element.value = event.target.value
//Second strategy
this.persistableInput.value = event.target.value
}
render() {
<div>
// Active input that sends data to the backend or for other forms
<input
id="persistable-input"
ref={(elem) => { this.persistableInput = elem }}
value={this.state.value}
onChange={this.props.persistedValue}
/>
{this.buildComplexHTMLFromData()}
</div>
}
我不知道我是否遗漏了某些东西,或者这对性能的影响是否很小,但我觉得对于复杂的组件来说可能会很费力。我查看了多篇关于 React 的协调范式的文章,但似乎没有解决这个问题。
如果有人能对 React 的这一领域有所了解,我将不胜感激,因为我正在寻找一些关于在大多数情况下在 React 中进行性能协调的很酷的提示和输入。
提前致谢。
【问题讨论】:
-
React 不使用 shadow DOM 而不是直接操作 DOM?
-
Shadow DOM 与否,普通的 DOM 操作不会重新渲染所有非目标元素,对吧?树中只会修改目标元素。
标签: javascript reactjs dom-manipulation