如何使用反应钩子将数据从子组件传递到父组件

mag*_*agi 2 reactjs react-hooks

我有一个父组件和几个子组件。我需要根据 ErrorComponent 禁用或启用父级中的按钮。如果出现错误,则禁用该按钮,否则启用它。我相信我们可以将回调从子级传递给父级,并让父级知道并更新按钮属性。我需要知道如何使用反应钩子来做同样的事情?我尝试了几个例子但没有成功。错误组件上没有事件。如果出现错误(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;
};
Run Code Online (Sandbox Code Playgroud)

Hyu*_*ang 5

在这种情况下,我会使用useEffect钩子来根据disabled道具设置状态message。您可以在这里看到整个工作应用程序: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;

Run Code Online (Sandbox Code Playgroud)

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

为了使这项工作有效,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;
Run Code Online (Sandbox Code Playgroud)