状态更改后的React Rerenders子组件

时间:2019-12-13 16:40:40

标签: reactjs react-hooks react-functional-component

我在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

有什么想法吗?我想我在这里错过了一些关键的东西,但我不知道是什么?

1 个答案:

答案 0 :(得分:0)

这就是React应该如何工作的方式,如果将组件设置为一个状态,那么它将始终显示该状态,您需要实现一些方法来处理更改并根据需要更新状态。参见this链接