我可以在 Child 组件的 Parent 中设置状态吗?

Can I setState in Parent from Child component?

我想稍微清理一下我的代码,所以我不想创建一个长组件,而是创建 child 组件。

在我的 Parent 中,我有一些状态想在 Child 中更新 onClick

Parent:

const [plan, setPlan] = useState('myPlan');
const [months, setMonths] = useState('2');
const [price, setPrice] = useState(200);

<PlanSelection props={props}
               item={selectedData}
               itemPlan={plan}
 />

Child

const PlanSelection = ({ props, item, itemPlan }) => {

    function handleSubsribe() {
        props.setPlan('Subsribe Only');
        props.setPrice(item.price);
        props.setMonths('24+');
    }

    function handlePay() {
        props.setPlan('Pay to Own');
        props.setPrice(item.pay);
        props.setMonths('12-24');
    }

并且只是尝试调用函数(在 Child 组件中)

<button onClick={handleSubscribe} />
<button onClick={handlePay} />

使用上面的代码在单击其中一个按钮后会引发错误:

TypeError: props.setPlan 不是函数

但如果我不传递 props,setPlan、setPrice、.... 将是未定义的。有什么办法可以处理吗?

问题

<PlanSelection props={props}
               item={selectedData}
               itemPlan={plan}
 />

你没有把setPlan传给child,你只传了propspropsstate没有关系,selectedData,我不确定那是什么,plan,也就是 state。总之,您没有将有关 setState 的任何信息传递给 child component


解决方案

Parent

const [plan, setPlan] = useState('myPlan');

<PlanSelection 
  setPlan={setPlan}
 />

Child

const PlanSelection = ({ setPlan }) => {

    function handleSubsribe() {
        setPlan('Subsribe Only');
    }

    function handlePay() {
        setPlan('Pay to Own');
    }

在上面的代码中,我仅使用 setPlan 作为示例向您展示如何从 child 组件 setState,您可以对其余部分应用相同的逻辑。

更新 刚刚意识到我犯了一个你应该注意的错误。在你的 child 组件中你有 ({ setPlan }),这被称为解构,也就是你从 props 中提取 setPlan,因此在你的 child 组件中,您不应该访问 props.setPlan,而应该访问 setPlan。再看看上面的答案

您可以简单地将您的 setState 函数作为 props 传递给您的子组件。一种简单的方法是:

const [plan, setPlan] = useState('myPlan');
const [months, setMonths] = useState('2');
const [price, setPrice] = useState(200);

<PlanSelection setPlan={setPlan}
               item={selectedData}
               itemPlan={plan}
 />

在这里您将能够从子组件更新计划状态。

如果您想将所有 setState 传递给 child,试试这个。

const handlers = {setPlan, setMonths, setPrice}
    <PlanSelection handlers={handlers}
                   item={selectedData}
                   itemPlan={plan}
     />

const PlanSelection = ({ handlers, item, itemPlan }) => {

您可以将 setPlan 用作 handlers.setPlan 而不是 props.setPlan