我在React中有一个组件,它渲染@material-ui
表(如果重要的话,可以通过React Router访问)。在表格内部,我有一个react-select
下拉菜单,但是该菜单是通过单独的组件呈现的。这是该父组件的代码:
return(
<>
<Table aria-label="customized table">
<TableHead>
<TableRow>
<StyledTableCell align="center"><GameTypeSelector onGameTypeChange={setSelectedGameType} gameTypes={gameTypes} /></StyledTableCell>
...
很显然,我将在一秒钟内到达的GameTypeSelector
会显示该下拉列表,而gameTypes
包含该选项。 setSelectedGameType
应该更新一个本地状态变量,该变量将在每次下拉列表更改时保存新值:
const [selectedGameType, setSelectedGameType] = useState(null);
所以最后一件事是其他组件本身。也很简单:
const [selected, setSelected] = useState({ value: "", label: "Please select game type" });
const [options, setOptions] = useState([]);
useEffect(() => {
//set options here
}, [props]);
useEffect(() => {
console.log("in use effect of gamte type selectedo");
props.onGameTypeChange(selected.value);
}, [selected.value, props]);
return (
<>
<Select
value={selected}
onChange={selectedOption => setSelected({ value: selectedOption.value, label: selectedOption.label })}
options={[{ value: null, label: "All" }, ...options]}
/>
</>
);
当我从下拉列表中更改值时,最奇怪的事情发生了。它更新本地selected
,然后从父控制器调用该函数。该函数会依次更新selectedGameType
,它仍然可以正常使用,并且可以按预期运行。
但是,更新之后,它再次重新分发表中的GameTypeSelector
,然后将selected
的值设置为该行useState({ value: "", label: "Please select game type" });
的默认值。之后,selectedGameType
的父值也设置为空。
在浏览器中,它看起来像这样:我从下拉列表中选择一个值,将其设置在其中,更新父组件(通过不同的控制台日志进行了很多说明),然后重置GameTypeSelector
组件,然后它会恢复为默认值。它只会重新渲染该单个部分,表格的其余部分保持不变,并且不会重新渲染,并且代码中没有任何内容触及其他任何地方的selectedGameType
。
有什么想法吗?我想我在这里错过了一些关键的东西,但我不知道是什么?