我很好奇,如果将setState
作为道具传递给孩子(愚蠢的组件)是否违反了任何“最佳做法”或会影响优化。
这里是一个示例,其中我的父容器将state
和setState
传递给两个子组件,其中子组件将调用setState
函数。
我没有在子级中显式调用setState
,它们引用了服务来处理状态属性的正确设置。
export default function Dashboard() {
const [state, setState] = useState({
events: {},
filters: [],
allEvents: [],
historical: false,
});
return (
<Grid>
<Row>
<Col>
<EventsFilter
state={state}
setState={setState}
/>
<EventsTable
state={state}
setState={setState}
/>
</Col>
</Row>
</Grid>
)
}
仪表板setState服务示例
function actions(setState) {
const set = setState;
return function () {
return ({
setEvents: (events) => set((prev) => ({
...prev,
events,
})),
setAllEvents: (allEvents) => set((prev) => ({
...prev,
allEvents,
})),
setFilters: (name, value) => set((prev) =>
({
...prev,
filters
})
),
})
}
}
到目前为止,我还没有发现任何状态问题。
答案 0 :(得分:1)
可以从子级调用函数来设置父级的状态,但是在执行此操作时要牢记一些事情
1)我希望从纯粹的语法角度来看,您实际上并不想像通常那样使用“ setState”来调用函数
2)意识到从子级内部调用函数时,您正在影响父级而不是子级的状态。如果您无法掌握要处理的数据以及从何处操作,则可能会导致一些时髦的结果。
答案 1 :(得分:0)
一种好的做法是创建一个处理程序函数,该处理函数委派给setState
函数,然后将此函数传递给子组件。
答案 2 :(得分:-3)
您可以使用函数包装此setState。将其传递给孩子不是一个好习惯。只需在组件上进行更新即可。
<Child
updatestate={(childInfo) => {
setState(childInfo);
}}
/>