Javascript } }
有一个非常简单的解决方案。React VDOM只是一种差分算法。JSX中唯一缺少的部分是名为key的东西,它类似于diffing算法使用并渲染特定元素的id。只需用一个键标记元素,如下所示Javascript } },javascript,reactjs,redux,react-redux,Javascript,Reactjs,Redux,React Redux,有一个非常简单的解决方案。React VDOM只是一种差分算法。JSX中唯一缺少的部分是名为key的东西,它类似于diffing算法使用并渲染特定元素的id。只需用一个键标记元素,如下所示 {number} 这不是要改变状态吗?另外,数组键是DB中的固定值。它改变了redux状态,是的,但我不认为状态变化是导致问题的原因。我怀疑在您的reducer中,当接收操作并计算myList时,您会强制React重新渲染所有内容,因为数组中的第一个和所有项都发生了更改。如果要追加有效负载,而不是预先追加有
{number}
这不是要改变状态吗?另外,数组键是DB中的固定值。它改变了redux状态,是的,但我不认为状态变化是导致问题的原因。我怀疑在您的reducer中,当接收操作并计算myList
时,您会强制React重新渲染所有内容,因为数组中的第一个和所有项都发生了更改。如果要追加有效负载
,而不是预先追加有效负载
,React可能能够更好地处理新数据。最初的问题是处理redux状态的正确方法。它只是做了一个浅拷贝(即使这些值是原语,而不是引用,所以它们无论如何都会传递)您可以找到一篇关于性能优化的非常好的文章。看起来您正确地使用了密钥,这使react能够了解哪些元素是新的,因此vDOM不应该重新呈现所有项目,而应该根据需要进行更新。@Reza能否请您签出我的详细答案,如果有不清楚的地方,那么请告诉我。如果没有PureComponent
,列表中的每个项目都将在添加新项目时重新提交。你可以玩我上面的例子。所以需要PureComponent
。是的。我的错误。编辑了答案。谢谢,谢谢。我犯了一个错误,认为PureComponent
与无状态组件相同。他们不是。一个PureComponent
有额外的逻辑,它本质上包含一个更严格版本的shouldComponentUpdate
。
return {
...state,
myList: [ payload, ...state.myList.filter(item => payload.id !== item.id).slice(0, -1) ]
}
import React, { Component } from 'react';
import MyRow from './MyRow';
class MyList extends Component {
render() {
return (
<div>
{this.props.myList.map((list, index) => (
<MyRow key={list.id} data={list}/>
))}
</div>
);
}
}
function select({ myList }) {
return { myList };
}
export default connect(select)(MyList);
import { PureComponent } from 'react';
class MyRow extends PureComponent {
render() {
const data = this.props.data;
return (
<div>
{data.id} - {data.name}
</div>
);
}
}
export default MyRow;
myList: [ payload, ...state.myList.filter(item => payload.id !== item.id).slice(0, -1) ]
myList: [ payload, ...state.myList.filter(item => payload.id !== item.id)]
class MyList extends Component {
render() {
return (
<div>
{this.props.myList.map((item, index) => (
<MyRow key={item.id} id={item.id} name={data.name} />
//or it's alternative
<MyRow key={item.id} {...item} />
))}
</div>
);
}
}
//...
class MyRow extends PureComponent {
render() {
const {id, name} = this.props;
return (
<div>
{id} - {name}
</div>
);
}
}
<li key={number.toString()}>
{number} </li>