Reactjs:如何从依赖于子组件状态的父组件中的方法访问子组件的状态

森林

我需要访问handleCancelEdit()父组件中定义的方法但是,这里的问题是每个子组件都有自己的cancelEdit状态。现在,发生的事情是,如果我handleCancelEdit()从一个子组件调用,所有其他相同的子组件都会获取状态并更新自己(该方法尚未完全定义)。这就是为什么,我cancelEdit在子组件中定义了状态,认为它只属于这个子组件。

现在,如何使该handleCancelEdit()方法对调用它的唯一子组件进行更改?

家长:

function Parent() {
    const handleCancelEdit = () => {
        setCancelEdit(!cancelEdit);  // defined in child component
        setEdit(!edit);       // defined in child component
        ...
    };
    return (
    <div>
        <ChildComponent
            fieldName={"Email"}
            value={email}
            inputType={"text"}
            placeHolder={"Enter email"}
            name={"email"}
            on_change={(e)=>setEmail(e.target.value)}
            on_click={handleUserEmail}
         />
         <ChildComponent
             fieldName={"About"}
             value={about}
             inputType={"text"}
             placeHolder={"Enter some details about yourself"}
             name={"about"}
             on_change={(e)=>setAbout(e.target.value)}
             on_click={handleUserAbout}
         />
    </div>
    );
}

子组件:

function ChildComponent({fieldName, value, inputType, placeHolder, name, on_change, on_click}) {
    const [ edit, setEdit ] = useState(false);
    const [ cancelEdit, setCancelEdit ] = useState(false)
    const isEdit = edit;
    return (
        <p>{fieldName}: {value === ''? (
            <span>
                <input type={inputType} placeholder={placeHolder}
                    name={name}  onChange={on_change}
                />
                <button type="submit" onClick={on_click}>Add</button>
            </span>
            ) : ( !isEdit ? (<span> {value} <button onClick={e=>setEdit(!edit)}>Edit</button></span>) :
            (<span>
                <input type={inputType} value={value}
                        name={name}  onChange={on_change}
                />
                <button type="submit" onClick={on_click}>Save</button>
                <button type="submit" onClick={handleCancelEdit}>Cancel</button>
            </span>)                            
            )}
        </p>
    );
};

我希望它能让一个子组件不应该让其他组件更新是可以理解的。现在,在这种情况下我该怎么做?

编辑

根据 Linda Paiste 进行更改后: 错误的gif

即使父子组件中的输入字段onChange都是正确的,子组件中的输入字段也不起作用

可爱的派斯特

向下传递状态和数据总是比向上传递更合乎逻辑。如果Parent需要与edit状态交互,那么该状态应该存在于父级中。当然,我们希望edit每个孩子都有独立的状态,所以父母不能只有一个boolean. boolean每个孩子都需要一个我推荐一个objectname该字段属性键控

ChildComponent,我们移动isEditsetEdit道具。handleCancelEdit只是() => setEdit(false)(是否还需要清除由onChange?设置的状态?)。


function ChildComponent({fieldName, value, inputType, placeHolder, name, onChange, onSubmit, isEdit, setEdit}) {
    return (
        <p>{fieldName}: {value === ''? (
            <span>
                <input type={inputType} placeholder={placeHolder}
                    name={name}  onChange={onChange}
                />
                <button type="submit" onClick={onSubmit}>Add</button>
            </span>
            ) : ( !isEdit ? (<span> {value} <button onClick={() =>setEdit(true)}>Edit</button></span>) :
            (<span>
                <input type={inputType} value={value}
                        name={name}  onChange={onChange}
                />
                <button type="submit" onClick={onSubmit}>Save</button>
                <button type="submit" onClick={() => setEdit(false)}>Cancel</button>
            </span>)                            
            )}
        </p>
    );
};

在 中Parent,我们需要存储这些isEdit状态并setEdit为每个字段创建一个函数。

function Parent() {
  const [isEditFields, setIsEditFields] = useState({});

  const handleSetEdit = (name, isEdit) => {
    setIsEditFields((prev) => ({
      ...prev,
      [name]: isEdit
    }));
  };

  /* ... */

  return (
    <div>
      <ChildComponent
        fieldName={"Email"}
        value={email}
        inputType={"text"}
        placeHolder={"Enter email"}
        name={"email"}
        onChange={(e) => setEmail(e.target.value)}
        onSubmit={handleUserEmail}
        isEdit={isEditFields.email}
        setEdit={(isEdit) => handleSetEdit("email", isEdit)}
      />
      <ChildComponent
        fieldName={"About"}
        value={about}
        inputType={"text"}
        placeHolder={"Enter some details about yourself"}
        name={"about"}
        onChange={(e) => setAbout(e.target.value)}
        onSubmit={handleUserAbout}
        isEdit={isEditFields.about}
        setEdit={(isEdit) => handleSetEdit("about", isEdit)}
      />
    </div>
  );
}

您可以通过将 存储values为单个状态而不是单个useState挂钩来清理大量重复代码现在 5 个道具可以从name.

function Parent() {
  const [isEditFields, setIsEditFields] = useState({});

  const [values, setValues] = useState({
      about: '',
      email: ''
  });

  const getProps = (name) => ({
      name,
      value: values[name],
      onChange: (e) => setValues(prev => ({
          ...prev,
          [name]: e.target.value
      })),
      isEdit: isEditFields[name],
      setEdit: (isEdit) => setIsEditFields(prev => ({
          ...prev,
          [name]: isEdit
      }))
  });

  const handleUserEmail = console.log // placeholder
  const handleUserAbout = console.log // placeholder

  return (
    <div>
      <ChildComponent
        fieldName={"Email"}
        inputType={"text"}
        placeHolder={"Enter email"}
        onSubmit={handleUserEmail}
        {...getProps("email")}
      />
      <ChildComponent
        fieldName={"About"}
        inputType={"text"}
        placeHolder={"Enter some details about yourself"}
        onSubmit={handleUserAbout}
        {...getProps("about")}
      />
    </div>
  );
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将状态与父组件传递给子组件

在子组件状态之间共享父状态?

反应父组件或子组件中的状态

如何访问子组件中根组件状态的值

子组件与父组件共享状态?

测试通过子组件更新的父组件中的状态

避免父组件重置子组件状态

如何从reactJS中的子组件更新父状态

如何将子组件的状态传递给父组件?

如何在父组件中使用子组件的状态?

ReactJS:更改子组件的状态

如何从父类访问子组件的状态

处理子组件中的父状态

使用父组件将初始值传递给子组件,而无需依赖状态ReactJS

如何设置子组件的子组件的父组件状态

如何从功能组件的父级更改子状态组件

ReactJS:如何访问父组件中的所有子组件?

如何从ReactJs的子组件中跟踪父组件的状态?

正确使用组件和子组件访问父状态

如何正确设置子组件和父组件的状态?

在 React 的父组件中访问子状态值

更改 reactJs 父组件中的状态不会更改 react 子组件中的道具

如何测试功能组件中的状态更新?(父组件中的状态,子组件中的更新逻辑)

Reactjs - 当父组件状态改变时更新子组件状态

使用子组件更改父组件的状态?

我可以在子组件的父组件中设置状态吗?

如何防止依赖于记忆的父组件状态的子组件中不必要的重新渲染

函数依赖于组件状态的穷举无限循环

如何从 React 中的子组件更改父组件中的状态?