【问题标题】:Update state when props change道具改变时更新状态
【发布时间】:2018-11-28 12:03:26
【问题描述】:

我对更新道具有疑问。


我有两个组件

第一个是App,里面有一个按钮可以打开或者关闭modal。

第二个是模态结构。
第一个组件存储状态,我点击按钮,状态发生变化,我向ModalComponent组件发送props(模态正在打开)。
如果我想关闭模式,在这个组件中应该改变这个状态。
但是,如果我在模态中单击Cancel 按钮,则什么也不会发生。
状态不变。

如何改变它,它如何使孩子和父母之间的沟通?

这是我的代码: ModalComponent

import React, { Component } from "react";
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";

class ModalComponent extends Component {
  constructor(props) {
    super(props);

    this.state = {
      modal: props.modal
    };

    this.toggle = this.toggle.bind(this);
  }

  toggle() {
    const { modal } = this.state;
    this.setState({
      modal: !modal
    });
  }

  render() {
    const { modal } = this.props;
    return (
      <div>
        <Modal isOpen={modal} toggle={this.toggle}>
          <ModalHeader toggle={this.toggle}>Halo</ModalHeader>
          <ModalFooter>
            <Button onClick={this.toggle}>Cancel</Button>
          </ModalFooter>
        </Modal>
      </div>
    );
  }
}

export default ModalComponent;

应用程序

import React from "react";
import ReactDOM from "react-dom";
import Modal from "./modal";
import { Button } from "reactstrap";

import "./styles.css";

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      modal: false
    };
    this.toggle = this.toggle.bind(this);
  }

  toggle() {
    const { modal } = this.state;
    this.setState({
      modal: !modal
    });
  }

  render() {
    const { modal } = this.state;
    return (
      <div>
        <Button
          type="link"
          onClick={this.toggle}
        >
          Delete account
        </Button>
        <Modal modal={modal} />
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

【问题讨论】:

    标签: reactjs react-props


    【解决方案1】:

    您的模态组件中的状态会改变,但您没有使用它来设置 Modal 组件上的 isOpen 属性。

    你也不能使用直接从道具派生的状态。您必须改为从 Parent 传递一个处理程序来更新父级本身的状态

    模态组件

    import React, { Component } from "react";
    import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
    
    class ModalComponent extends Component {
      render() {
        const { modal } = this.props;
        return (
          <div>
            <Modal isOpen={modal} toggle={this.toggle}>
              <ModalHeader toggle={this.props.toggle}>Halo</ModalHeader>
              <ModalFooter>
                <Button onClick={this.props.toggle}>Cancel</Button>
              </ModalFooter>
            </Modal>
          </div>
        );
      }
    }
    
    export default ModalComponent;
    

    应用

    class App extends React.Component {
      constructor(props) {
        super(props);
    
        this.state = {
          modal: false
        };
        this.toggle = this.toggle.bind(this);
      }
    
      toggle() {
        const { modal } = this.state;
        this.setState({
          modal: !modal
        });
      }
    
      render() {
        const { modal } = this.state;
        return (
          <div>
            <Button
              type="link"
              onClick={this.toggle}
            >
              Delete account
            </Button>
            <Modal modal={modal} toggle={this.toggle}/>
          </div>
        );
      }
    }
    

    【讨论】:

      【解决方案2】:

      您现在拥有它的方式,模态框正在设置自己的状态,但它仍然从父级接收一个道具,使其保持打开状态。

      这是一种方法的示例。请注意,打开和关闭都是使用父级的状态来处理的,而不是子级的状态。

      import React from "react";
      import ReactDOM from "react-dom";
      
      import "./styles.css";
      
      class App extends React.Component {
        state = { open: false };
      
        toggle = () => {
          this.setState({ open: !this.state.open });
        };
      
        render() {
          return (
            <React.Fragment>
              something
              <Modal show={this.state.open} />
              <Child toggle={this.toggle} />
            </React.Fragment>
          );
        }
      }
      
      const Child = ({ toggle }) => {
        return <button onClick={toggle}>toggle</button>;
      };
      
      const Modal = ({ show }) => {
        if (show) {
          return <h1>I am a modal</h1>;
        }
      
        return null;
      };
      
      const rootElement = document.getElementById("root");
      ReactDOM.render(<App />, rootElement);
      

      代码沙盒here.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-24
        相关资源
        最近更新 更多