能够在React Class组件上使用shouldComponentUpdate
的好处之一是能够基于条件而不是仅更改状态/ prop值来控制渲染。
使用功能组件中的react钩子进行此优化的首选方法是什么?
在下面的示例中,即使类组件处于(或保持)关闭状态,即使它具有新的子代,也不会重新呈现。
class DrawerComponent extends React.Component {
static propTypes = {
children: PropTypes.any,
}
state = {
isOpen: false,
}
// only re-render if the drawer is open or is about to be open.
shouldComponentUpdate(nextProps, nextState) {
return this.state.isOpen || nextState.isOpen;
}
toggleDrawer = () => {
this.setState({isOpen: !this.state.isOpen});
};
render() {
return (
<>
<div onClick={this.toggleDrawer}>
Drawer Title
</div>
<div>
{this.state.isOpen ? this.props.children : null}
</div>
</>
)
}
}
功能组件对应项(无优化):
function DrawerComponent({ children }) {
const [isOpen, setIsOpen] = useState(false);
function toggle() {
setIsOpen(!isOpen);
}
return (
<>
<div onClick={toggle}>
Drawer Title
</div>
<div>{isOpen ? children : null}</div>
</>
);
}
答案 0 :(得分:2)
在本例中,我认为不需要进行shouldComponentUpdate
优化。由于您在关闭抽屉时不呈现children
,因此已经非常快了。运行功能组件的成本可以忽略不计。
也就是说,如果您确实想在功能组件中实现等效行为,则可以使用React.memo
并提供自定义areEqual
函数:https://reactjs.org/docs/react-api.html#reactmemo。