reactjs - 无法更新嵌套状态反应
问题描述
我有一个可重用的下拉菜单组件,我用两个不同的列表渲染它两次,它应该用第一个元素的 id 更新状态。
布局的第一个下拉菜单更新状态没有任何问题,但第二个没有(我切换了顺序,似乎第一个更新了第二个没有的状态)。
请看代码
仪表板
const initializeData = {
actionStatuses: [],
actionCategories: [],
actionGroups: [],
actionEvents: [],
actionEventsWithFilter: [],
selectedFilters: {actionStatusId: "", actionCategoryId:""},
};
const Dashboard = ({ selectedPracticeAndFy }) => {
const [data, setData] = useState(initializeData);
const getSelectedStatus = ({ key }) => {
const actionStatusId = key;
const selectedFilters = { ...data.selectedFilters, actionStatusId };
setData((prevState) => {
return { ...prevState, selectedFilters }
});
};
const getSelectedCategory = ({ key }) => {
const actionCategoryId = key;
const selectedFilters = { ...data.selectedFilters, actionCategoryId };
setData((prevState) => {
return { ...prevState, selectedFilters }
});
};
}
结果过滤器:
const ResultFilter = ({actionStatuses, actionCategories, getSelectedStatus, getSelectedCategory}) => {
return (
<Grid
justify="flex-start"
container
>
<Grid item >
<Typography component="div" style={{padding:"3px 9px 0px 0px"}}>
<Box fontWeight="fontWeightBold" m={1}>
Result Filter:
</Box>
</Typography>
</Grid>
<Grid >
<DropdownList payload={actionCategories} onChange={getSelectedCategory} widthSize= {dropdownStyle.medium}/>
<DropdownList payload={actionStatuses} onChange={getSelectedStatus} widthSize= {dropdownStyle.medium}/>
</Grid>
</Grid>
);
}
下拉列表:
const DropdownList = ({ label, payload, onChange, widthSize, heightSize, withBorders, initialData }) => {
const { selectedData, setSelectedData, handelInputChange } = useForm(
payload
);
useEffect(() => {
if (Object.entries(selectedData).length === 0 && payload.length !== 0) {
setSelectedData(payload[0]);
}
}, [payload]);
useEffect(() => {
if (Object.entries(selectedData).length !== 0) {
onChange(selectedData);
}
}, [selectedData]);
return (
<div style={widthSize}>
<div className="ct-select-group ct-js-select-group" style={heightSize}>
<select
className="ct-select ct-js-select"
id={label}
value={JSON.stringify(selectedData)}
onChange={handelInputChange}
style={withBorders}
>
{label && <option value={JSON.stringify({key: "", value: ""})}>{label}</option>}
{payload.map((item, i) => (
<option key={i} value={JSON.stringify(item)} title={item.value}>
{item.value}
</option>
))}
</select>
</div>
</div>
);
};
解决方案
这可能是一个过时的关闭问题,您可以尝试以下方法:
const getSelectedStatus = ({ key }) => {
setData((data) => {
const actionStatusId = key;
const selectedFilters = {
...data.selectedFilters,
actionStatusId,
};
return { ...data, selectedFilters };
});
};
const getSelectedCategory = ({ key }) => {
setData((data) => {
const actionCategoryId = key;
const selectedFilters = {
...data.selectedFilters,
actionCategoryId,
};
return { ...data, selectedFilters };
});
};
推荐阅读
- ruby-on-rails - 章鱼rails gem中的模型特定数据库分片
- python - 在 Flask 应用程序中的 IntegrityError 之后,数据库中的 ID 不按顺序排列
- .net - 我想安装一些像“microsoft.aspnet.webapi.cors”这样的nuget包,但有如下错误
- angular - 如何从 iframe 向 Angular 应用程序传递值
- google-sheets - SUMPRODUCT 中的 ArrayFormula 和扩展范围
- javascript - KNEX / SQLite 处理日期
- flutter - 启动应用程序时初始化 CupertinoPicker (flutter)
- latex - 整个文档的字体大小都在减小 - LaTeX
- python - 在 tensorflow 中加载 tiff 图像来抑制警告似乎不起作用?
- android - 我应该独立于 Fragment 的生命周期使用 ViewModelScope 吗?