如何使用反应挂钩将父组件中声明的状态更新到子组件

How to update the state declared in parent component to a child component using react hook

我的 React 项目包含两个组件:一个是父组件,另一个是子组件。我的父组件如下所示:

import React, {useState } from 'react';
import AddNewModal from './AddNewModal';

const MouseContainer = (props) =>{
const [show,setShow] = useState(false);
const toggle = () => setShow(!show);
return (
    <div>
        <button onClick={()=>setShow(!show)}>Toggle</button>
        <p>{show && <AddNewModal show={props.show} setShow={props.setShow}/>}</p>
    </div>
     )
}export default MouseContainer;

还有一个像这样呈现模态的子组件:

import React, {useState} from 'react';
import { Modal, Button } from 'react-bootstrap';
import AddNewForm from './AddNewForm';

const AddNewModal = (show,setShow) => {
return(
    <div>
    <Modal show={show} setShow={setShow}> 
    <Modal.Header>
      <Modal.Title>Modal heading</Modal.Title>
    </Modal.Header>
    <Modal.Body><AddNewForm/></Modal.Body>
    <Modal.Footer>
      <Button variant="secondary" onClick={(props)=>props.setShow(!show)}>
        Cancel
      </Button>
    </Modal.Footer>
  </Modal>
    </div>
  )
}export default AddNewModal;

如何更新统计数据,以便 "cancel" 按钮在单击时关闭模式?

我认为您几乎已经完成了以下更改

import React, {useState} from 'react';
import { Modal, Button } from 'react-bootstrap';
import AddNewForm from './AddNewForm';

const AddNewModal = ({show,setShow}) => {
return(
    <div>
    <Modal show={show}> 
    <Modal.Header>
      <Modal.Title>Modal heading</Modal.Title>
    </Modal.Header>
    <Modal.Body><AddNewForm/></Modal.Body>
    <Modal.Footer>
      <Button variant="secondary" onClick={()=>setShow(!show)}>
        Cancel
      </Button>
    </Modal.Footer>
  </Modal>
    </div>
  )
}

如果我没理解错的话,你是在用 useState 钩子控制模态框。如果是这样,您的问题是关于您将哪些道具传递给 AddNewModal 组件。

您正在正确创建挂钩:

const [show, setShow] = useState(false);

但是,您向 AddNewModal 组件传递了错误的道具。您正在传递一个 setShow 和一个 show 来自 MouseContainer 组件中的道具,这里:

<p>{show && <AddNewModal show={props.show} setShow={props.setShow} />}</p>

但是,要使用钩子,您应该传递您声明的变量:

<p>{show && <AddNewModal show={show} setShow={setShow} />}</p>

我不熟悉 bootstrap 框架,但我认为模态组件的属性 show 正在控制是否显示模态。如果是这种情况,您也可以删除条件渲染,从而导致:

<AddNewModal show={show} setShow={setShow} />

这是 MouseContainer 组件的更新代码:

import React, { useState } from 'react';
import AddNewModal from './AddNewModal';

const MouseContainer = (props) => {
  const [show,setShow] = useState(false);
  const toggle = () => setShow(!show);

  return (
    <div>
        <button onClick={()=>setShow(!show)}>Toggle</button>
        <AddNewModal show={show} setShow={setShow} />
    </div>
  )
}

此外,您在 AddNewModal 上有一个小字体:

要立即在功能组件声明中获得所需的道具字段,必须使用对象解构 [1],为此使用大括号:

const AddNewModal = ({ show, setShow }) => {

这样做,您并没有像在 MouseContainer 组件中那样声明 props 对象。所以你不能在函数中使用它。

这是你更新的AddNewModal

import React, {useState} from 'react';
import { Modal, Button } from 'react-bootstrap';
import AddNewForm from './AddNewForm';

const AddNewModal = ({ show, setShow }) => {
  return (
    <div>
      <Modal show={show} setShow={setShow}> 
        <Modal.Header>
          <Modal.Title>Modal heading</Modal.Title>
        </Modal.Header>
        <Modal.Body><AddNewForm/></Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={() => setShow(!show)}>
            Cancel
          </Button>
        </Modal.Footer>
      </Modal>
    </div>
  )
}

来源:

[1] https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment