【发布时间】:2019-01-21 17:47:50
【问题描述】:
我正在制作一个返回搜索结果的简单字典应用程序。使用字典的内存数据库lokiJS 对搜索字段的每个onChange 进行查询,因此结果非常很快。
优化结果的呈现对我来说很重要,这样大约 50 个过滤后的搜索结果会随着用户键入和每次击键时发生的查询而持续流动。
这是我到目前为止一直在做的事情:(这可行,但它是最好/最快的方法吗?)
数据库的每个(同步)查询都返回一个对象数组,然后我将其映射为如下所示:
queryDB(query) {
const results = queryLokiJsDB(query);
const resultsMapped = results.map((mpd) =>
<dl key={mpd["$loki"]} onClick={() => this.clickFunction(mpd.p, mpd.f)}>
<dt>{mpd.p} - {mpd.f}</dt> <dd>{mpd.e} <em>{mpd.c}</em></dd>
</dl>);
this.setState({ results: (
<div>
{resultsMapped}
</div>
)});
}
然后,一旦我有这样映射的结果,我将映射的组件添加到状态,然后屏幕会用新的结果呈现。
render() {
return (
<div>
<SearchBarStuff />
<div className="results-container">
{this.state.results}
</div>
</div>
);
}
我在学习 React 的时候做了这个,我知道人们认为将组件存储在状态中是 非常糟糕的做法。
我想知道在性能优化(和代码清洁度)方面的最佳实践是什么。 我应该将结果数组存储在 state 中然后渲染然后将它们映射到渲染函数中的组件中吗?这会导致性能下降吗?
Another answer 表示“每次渲染都会创建一个 render 方法中的函数,这对性能有轻微影响。”
为什么在状态中存储组件如此糟糕?仅仅是为了代码清晰吗?保持国家小?感谢您的帮助和耐心。
【问题讨论】:
-
如果我猜的话,我认为将组件存储在 state 中是不好的做法,因为 React 必须将以前的 state 与新 state 进行比较,看看它是否需要重新渲染,如果它有要爬过如此庞大的组件数组而不是对象数组,您正在让它做更多的工作。最好的做法是将对象数组存储在 state 中,然后在组件中处理它们的映射和渲染。
-
@larz 但是 React 文档说它以浅层的方式比较状态,这意味着对于对象,它只会检查引用是否发生了变化。在 OP 的示例中,每次调用
setState({results})时,React 都会立即看到results已更改,因为新组件实例将是不同的对象引用。因此,我会说这种情况下的性能不会受到影响。
标签: javascript reactjs