gpt4 book ai didi

reactjs - 如何使用 react 钩子(Hook)将数据从子组件传递到父组件

转载 作者:行者123 更新时间:2023-12-02 19:26:47 25 4
gpt4 key购买 nike

我有一个父组件和几个子组件。我需要根据 ErrorComponent 禁用或启用父级中的按钮。如果出现错误,则禁用该按钮,否则启用它。我相信我们可以将回调从子级传递给父级,并让父级知道并更新按钮属性。我需要知道如何使用 react 钩子(Hook)来做同样的事情?我尝试了几个例子但没有成功。错误组件上没有事件。如果出现错误(props.errorMessage),那么我需要将一些数据传递给父级,以便我可以禁用该按钮。非常感谢任何帮助

export const Parent: React.FC<Props> = (props) => {
....
const createContent = (): JSX.Element => {
return (
{<ErrorPanel message={props.errorMessage}/>}
<AnotherComponent/>
);
}
return (
<Button onClick={onSubmit} disabled={}>My Button</Button>
{createContent()}
);
};
export const ErrorPanel: React.FC<Props> = (props) => {
if (props.message) {
return (
<div>{props.message}</div>
);
}
return null;
};

最佳答案

在这种情况下,我将使用 useEffect Hook ,根据 message 属性设置 disabled 状态。您可以在这里看到整个工作应用程序:codesandbox

ErrorPanel 组件将如下所示:

import React, { useEffect } from "react";

interface IPropTypes {
setDisabled(disabled:boolean): void;
message?: string;
}

const ErrorPanel = ({ setDisabled, message }: IPropTypes) => {

useEffect(() => {
if (message) {
setDisabled(true);
} else {
setDisabled(false);
}
}, [message, setDisabled]);

if (message) {
return <div>Error: {message}</div>;
}
return null;
};

export default ErrorPanel;

因此,根据 message 属性,每当它“存在”时,我都会通过操作传递的 setDisabled 函数将 disabled 属性设置为 true通过 Prop 。

为了实现此功能,Parent 组件如下所示:

import React, { MouseEvent, useState } from "react";

import ErrorPanel from "./ErrorPanel";

interface IPropTypes {
errorMessage?: string;
}

const Parent = ({ errorMessage }: IPropTypes) => {
const [disabled, setDisabled] = useState(false);

const createContent = () => {
return <ErrorPanel setDisabled={setDisabled} message={errorMessage} />;
};

const handleSubmit = (e: MouseEvent) => {
e.preventDefault();
alert("Submit");
};

return (
<>
<button onClick={handleSubmit} disabled={disabled}>
My Button
</button>
<br />
<br />
{createContent()}
</>
);
};

export default Parent;

关于reactjs - 如何使用 react 钩子(Hook)将数据从子组件传递到父组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62315572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com