我有一个react项目,我使用上下文api来管理应用程序的状态。
我有一个具有onClick事件的项列表,该事件在上下文中更新状态。
问题是,当状态更改时,所有项都会重新呈现,这会导致延迟。
我的问题是,如果没有点击,如何阻止其他项目重新呈现。
item.jsx
import React, { useContext } from "react";
import { MainContext } from "../../_context/PresentContext";
const Item = ({item}) => (
<MainContext.Consumer>
{({handleSelectItem}) => (
<div>
<button onClick={() => handleSelectItem(item)}>{item.name}</button>
</div>
)
}
</MainContext.Consumer>
)items.jsx
import React from "react";
import Item from "./Item";
const itemsList = [
{id: 1, name: 'a'},
{id: 2, name: 'b'},
{id: 3, name: 'c'},
{id: 4, name: 'd'}
]
const Items = () => (
<div>
{itemsList.map(i => (
<Item item={item}/>
)
)}
</div>
)handleSelectItem函数只更新上下文状态上的selectedItem,然后在不同的组合中使用它
这只是一个简单的例子,说明了这个问题。真正的itemsList大约有200个项目。
发布于 2019-08-16 13:44:13
如果您的React.PureComponent都是可序列化的,则可以扩展Item component props,或者扩展React.Component并实现shouldComponentUpdate。
备选案文1。
import React, { Component } from "react";
import isEqual from 'lodash.isequal';
export class Item extends Component {
shouldComponentUpdate(nextProps){
return !isEqual(this.props.item, nextProps.item);
}
render() {
const { item } = this.props;
return (
<MainContext.Consumer>
{({ handleSelectItem }) => (
<div>
<button onClick={() => handleSelectItem(item)}>{item.name}</button>
</div>
)}
</MainContext.Consumer>
);
}
}选项2
export class Item extends PureComponent {
render() {
const { item } = this.props;
return (
<MainContext.Consumer>
{({ handleSelectItem }) => (
<div>
<button onClick={() => handleSelectItem(item)}>{item.name}</button>
</div>
)}
</MainContext.Consumer>
);
}
}发布于 2019-08-16 12:41:54
如何使用纯组分和在生命周期方法shouldComponentUpdate中进行决策?
如果您更喜欢使用钩子,这是一份正式文件如何使用钩子方法实现上述生命周期方法。
发布于 2019-08-16 14:03:41
key属性,这样可以在DOM元素之间进行映射,并且只有在键的值发生变化时才重新呈现它们,而不是每次呈现组件时都重新呈现整个列表。useCallback或useMemo挂钩来回溯它们。这样他们就不会破坏你的PureComponentitem.jsx
import React, {memo, useContext } from "react";
import { MainContext } from "../../_context/PresentContext";
const Item = memo(({item}) => (
const handleClick => useCallback(handleSelectItem(item), [item])
const renderConsumer = ({handleSelectItem}) => (
<div>
<button onClick={handleClick}>{item.name}</button>
</div>
)
<MainContext.Consumer>
{renderConsumer()}
</MainContext.Consumer>
))items.jsx
import React, {memo} from "react";
import Item from "./Item";
const Items = memo(() => (
<div>
{itemsList.map(i => (
<Item key={i} item={item}/>
)
)}
</div>
))https://stackoverflow.com/questions/57524811
复制相似问题