【发布时间】:2021-07-06 07:53:09
【问题描述】:
我需要访问父组件中定义的方法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>
);
};
我希望它可以理解一个子组件不应该让其他组件更新。现在,在这种情况下我该怎么做?
编辑
即使父子组件中的onChange 正确,子组件中的输入字段也不起作用!
【问题讨论】:
-
为什么
handleCancelEdit不能只存在于子组件中? -
你是否试图将状态从孩子传递给父母?如果是这样,您需要将对父级中的函数的引用作为道具传递给子级。然后,孩子可以根据需要调用该函数,并且可以将自己与其他子组件区分开来。另一种选择是使用像 redux 这样的状态管理库。
-
@Denno 我想我需要使用
ref,就像我在其他问题中看到的那样,但我不知道如何使用它。 -
@Ezra 我是不是在做同样的事情,即 在我的代码中将父级中的引用作为道具传递给子级?如果没有,我该怎么做?
-
父级在哪里调用
handleCancelEdit?它是试图取消所有孩子还是只取消特定孩子?
标签: javascript reactjs react-hooks react-component