reactjs - 高效更新 React useState 对象
问题描述
我正在使用 Material UI Accordian(文档中的受控示例),我希望所有面板默认打开。我已经能够通过创建如下状态对象来实现这一点。但是,我认为我在 handleChange 上更新状态的方法很笨拙。
有没有更好的方法来写这个?
const [state, setstate] = useState({
panel1: true,
panel2: true,
panel3: true,
panel4: true,
});
const handleChange = (panel: string) => (event: React.ChangeEvent<{}>, isExpanded: boolean) => {
switch (panel) {
case "panel1":
setstate({ ...state, panel1: state.panel1 ? false : true });
break;
case "panel2":
setstate({ ...state, panel2: state.panel2 ? false : true });
break;
case "panel3":
setstate({ ...state, panel3: state.panel3 ? false : true });
break;
case "panel4":
setstate({ ...state, panel4: state.panel4 ? false : true });
break;
default:
break;
}
};
解决方案
改用数组:
const [panels, setPanels] = useState(new Array(4).fill(true));
const handleChange = (panelIndex: number) => () => {
const newPanels = [...panels];
newPanels[panelIndex] = !newPanels[panelIndex];
setPanels(newPanels);
};
然后使用,例如,handleChange(0)
和,handleChange(2)
而不是handleChange('panel1')
和handleChange('panel3')
。
推荐阅读
- javascript - 如何编写以 if 条件作为第一条语句的 Promise 链?
- android - 房间查询返回父类类型的 LiveData
- javascript - 如何调试 nextjs 导出
- graphviz - Graphviz 布局从左到右,然后从上到下
- javascript - Javascript 滚动文本函数 - array.shift() 不是函数
- google-cloud-functions - 如何从 firebase 函数发送图像文件?
- swift - 如果 String 是可选的,如何将 String 转换为 Double?
- excel - Autifil 列基于另一列数据
- java - 当二叉树中的一个节点被触发时,Java 程序查找所有未燃烧的节点
- c# - 正确执行工厂