【问题标题】:Display element based on event fired and props passed in基于触发的事件和传入的道具显示元素
【发布时间】:2020-11-19 04:05:55
【问题描述】:

我正在尝试通过直接将道具传递给它来操纵另一个元素,然后让它显示自己。如果我通过true/false.

实时运行代码:

https://codesandbox.io/s/keen-dan-rt0kj

  • 我不知道是否有可能拥有一个对象系统,并根据一个事件,告诉父母显示一个孩子。

App.js

import React from "react";
import "./styles.css";
import Content from "./components/Content";

export default class App extends React.Component {
  state = {
    display: false
  };

  render() {
    return (
      <div className="App">
        <button onClick={() => this.setState({ display: !this.state.display })}>
          Display div
        </button>
        <Content display={this.state.display} />
      </div>
    );
  }
}

./components/Content.js:

import React from "react";

export default class Content extends React.Component {
  constructor(props) {
    super();
    this.state = {
      display: props.display
    };
  }

  render() {
    const { display } = this.state;
    return (
      <div
        id="mydiv"
        className="mydiv"
        style={{ display: display ? "block" : "none" }}
      >
        <h3>A simple div</h3>
      </div>
    );
  }
}

目标: 我想基于一个状态,并基于触发的事件,显示一个已经存储在root 中的元素。

编辑:我知道,这存在并且可以使用:import PropTypes from 'prop-types',但是,我不确定这是一个好的做法,因为它需要一些父组件或其他一些组件来实现props


刚刚尝试过:

应用:

<Content display={this.state.display} content={"Hello World"} />

内容:

<h3>{this.state.content}</h3>

看来,存储在内容state = {content: props.content} 中的传入文本确实会显示出来,而boolean 值不能直接工作。发送bool 有什么问题吗?

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    在你的内容组件中试试这个

        export default class Content extends React.Component {
          constructor(props) {
            super();
            this.state = {
              
            };
          }
        
          render() {
            return (
             <>
              {this.props.display?(
                <div
                id="mydiv"
                className="mydiv"
                >
                <h3>A simple div</h3>
              </div>
              ):null}
             </>
            );
          }
        }
    

    【讨论】:

    • 在内容组件中,react 正在根据显示状态更新 dom。这就是 react 的作用。我会推荐你​​阅读一些关于 state 和 props 的文档。顺便说一下,尝试像这样命名布尔值 isDisplay。这是一个很好的命名习惯。
    • Vibhav,谢谢。这仍然会产生孤立的状态吗?
    • 你能详细说明你的问题吗?
    • 如果我有多个 Content div。所以,可以说,一个 div 有一个带有“X”的按钮来关闭它。然后它必须访问自己的状态变量并对其进行操作,对吗?所以,我就是这么想的。但是,也许,我不应该将 props 作为通用传递,而是传递 ({...}) 命名参数,你认为这更好吗?修复了命名参数。
    • 看看我已经编辑了你的代码我想这就是你在说什么??? codesandbox.io/s/naughty-night-odkqe?file=/src/App.js
    【解决方案2】:

    这可能不起作用的原因是因为您在初始化组件后以不连接显示道具的方式初始化状态。这意味着在 Content 组件被“构造”后,Content 的状态和它的父级没有链接。这是因为constructor() 函数只运行一次来​​初始化状态。

    最好的选择是不使用 Content 组件的内部状态。无需使用 display 属性初始化状态,只需在渲染函数中使用 display 属性即可。

    尝试这样的方法可能会奏效

    import React from "react";
    
    export default class Content extends React.Component {
      constructor(props) {
        super(props);
      }
    
      render() {
        const { display } = this.props;
        return (
          <div
            id="mydiv"
            className="mydiv"
            style={{ display: display ? "block" : "none" }}
          >
            <h3>A simple div</h3>
          </div>
        );
      }
    }
    

    我还建议在根目录中使用状态:

    import React from "react";
    import "./styles.css";
    import Content from "./components/Content";
    
    export default class App extends React.Component {
      constructor(props) {
        super();
        state = {
          display: false
        };
      }
    
      render() {
        return (
          <div className="App">
            <button onClick={() => this.setState({ display: !this.state.display })}>
              Display div
            </button>
            <Content display={this.state.display} />
          </div>
        );
      }
    }
    

    【讨论】:

    • Shn,这还会创建孤立状态吗?
    • 您总是可以在内容组件中创建第二个隔离状态。在问题示例中,您并没有真正使用内容文件中的隔离组件。
    • 我知道。但是,如何才能使组件隔离,即使其保留自己的状态。并且有自己的状态属性,通过外部道具设置。 ?
    猜你喜欢
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2016-06-23
    相关资源
    最近更新 更多