【问题标题】:Passing setState to child component using React hooks使用 React 钩子将 setState 传递给子组件
【发布时间】:2020-05-08 02:08:37
【问题描述】:

我很好奇将setState 作为道具传递给孩子(愚蠢的组件)是否违反任何“最佳实践”或会影响优化。

这是一个示例,其中我让父容器将statesetState 传递给两个子组件,其中子组件将调用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
                })
            ),
        })
    }
}

到目前为止,我还没有注意到任何状态问题。

【问题讨论】:

  • 我觉得从孩子的角度把setState叫做道具也没有错。如果孩子从 prop 设置自己的状态然后更新它(这是迄今为止通常的 React 流程),那么那个孩子就不再愚蠢了。它可能会使编码更快,但会降低可读性。

标签: javascript reactjs react-hooks react-component react-state-management


【解决方案1】:

一个好的做法是创建一个处理函数,该函数代表setState 函数并将该函数传递给子组件。

【讨论】:

  • 为什么这是一个好习惯?它有什么改进?
【解决方案2】:

可以从子级调用一个函数来设置父级的状态,但是在执行此操作时需要记住几件事

1) 我希望您实际上并没有将函数称为“setState”,因为从纯语法的角度来看,您通常不希望这样做

2) 意识到从子级调用函数时,您正在影响父级而不是子级的状态。如果您忘记要操作哪些数据以及从何处操作,这可能会导致一些奇怪的结果。

【讨论】:

  • 谢谢!是的,我应该补充一点,因为我没有直接调用 setState。我创建了一个服务来区分要设置的状态属性。
猜你喜欢
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
  • 1970-01-01
  • 2019-01-20
  • 2022-01-18
  • 2017-03-18
  • 1970-01-01
相关资源
最近更新 更多