React Hook:将数据从子组件发送到父组件

新手上路,请多包涵

我正在寻找将数据从子组件传递给其父组件的最简单解决方案。

我听说过使用 Context、传递槽属性或更新道具,但我不知道哪一个是最好的解决方案。

我正在构建一个管理界面,其中一个 PageComponent 包含一个 ChildComponent 和一个表格,我可以在其中选择多行。我想将我在 ChildComponent 中选择的行号发送给我的父 PageComponent。

类似的东西:

页面组件:

 <div className="App">
  <EnhancedTable />
  <h2>count 0</h2>
  (count should be updated from child)
</div>

子组件:

  const EnhancedTable = () => {
     const [count, setCount] = useState(0);
     return (
       <button onClick={() => setCount(count + 1)}>
          Click me {count}
       </button>
     )
  };

我确信这是一件非常简单的事情,我不想为此使用 redux。

原文由 Kaherdin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您可以在父组件中创建一个方法,将其传递给子组件,并在每次子组件的状态更改时从 props 调用它,从而将状态保留在子组件中。

     const EnhancedTable = ({ parentCallback }) => {
        const [count, setCount] = useState(0);

        return (
            <button onClick={() => {
                const newValue = count + 1;
                setCount(newValue);
                parentCallback(newValue);
            }}>
                 Click me {count}
            </button>
        )
    };

    class PageComponent extends React.Component {
        callback = (count) => {
            // do something with value in parent component, like save to state
        }

        render() {
            return (
                <div className="App">
                    <EnhancedTable parentCallback={this.callback} />
                    <h2>count 0</h2>
                    (count should be updated from child)
                </div>
            )
        }
    }

原文由 maktel 发布,翻译遵循 CC BY-SA 4.0 许可协议

这些情况的常用技术是 将状态提升 到需要使用状态的所有组件的第一个共同祖先(即 PageComponent 在这种情况下)并向下传递状态和状态更改作为 props 传递给子组件的函数。

例子

 const { useState } = React;

function PageComponent() {
  const [count, setCount] = useState(0);
  const increment = () => {
    setCount(count + 1)
  }

  return (
    <div className="App">
      <ChildComponent onClick={increment} count={count} />
      <h2>count {count}</h2>
      (count should be updated from child)
    </div>
  );
}

const ChildComponent = ({ onClick, count }) => {
  return (
    <button onClick={onClick}>
       Click me {count}
    </button>
  )
};

ReactDOM.render(<PageComponent />, document.getElementById("root"));
 <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>

原文由 Tholle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进