【问题标题】:Dynamically render react component based on parent state基于父状态动态渲染 React 组件
【发布时间】:2017-02-03 20:39:24
【问题描述】:

我的父组件,基本上是一个表单,有一个子组件,一个带有加载器的叠加层,它只需要根据父组件的状态显示。

import React from 'react';
import Overlay from './overlay';

export default class RegisterForm extends React.Component {
  constructor {
    this.state = {
      loading: false
    };
  }
  handleSubmit(){
    this.state.loading = true;
    ...
  }

  render(){
    return(
    <form onSubmit={() => this.handleSubmit()}>
     ...
     <Overlay />
    </form>
    );
  }
}

我怎样才能做到这一点?

我尝试了React.cloneElement(&lt;Overlay /&gt;, {}),但我不知道如何将这个孩子重新附加到父母身上,据我所知,这不是 React 的做事方式......

我还尝试根据父级的state 设置prop ob Overlay,例如React.cloneElement(&lt;Overlay /&gt;, { visible = this.state.loading }),但似乎无法使其工作...

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    对于有问题的情况,我更喜欢下面的表达式而不是三元运算符

    render() {
      return (
        <form onSubmit={this.handleSubmit}>
          { this.state.loading == false && <Overlay /> }
        </form>
      );
    }
    

    记住不要错过渲染函数中的 return 子句。记住不要直接通过赋值来改变状态。这是一个通过单击按钮提交表单并显示加载消息的工作组件。这是实现行为的典型 React 方式。

    class HelloWidget extends React.Component{
      constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this)
        this.state = {
          loading: false
         };
      }
      handleSubmit() {
        this.setState({ loading: true });
      }
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            { this.state.loading && <div>loading...</div> }
            <button>click</button>
           </form>
         );
      }
    }
    

    附录 - 下面是两个速记技巧。

    三元运算符:

    速记

    render() {
      return condition === someCondition ? <CompA /> : <CompB />;
    }
    

    速写

    render() {
      if ( condition === someCondition ) {
        return <CompA />;
      } else {
        return <CompB />;
      }
    }
    

    布尔与运算符 &&:

    速记

    render() {
      return condition === someCondition && <CompA />;
    }
    

    速写

    render() {
      if ( condition === someCondition ) {
        return <CompA />;
      } else {
        return null;
      }
    }
    

    【讨论】:

    • 谢谢!我试过this.state.loading &amp;&amp; &lt;Overlay /&gt;,但什么也没发生……
    • 你在构造函数中绑定了句柄吗? this.handleSubmit = this.handleSubmit.bind( this );
    • 我编辑了问题:我的提交处理程序是这样完成的onSubmit={() =&gt; this.handleSubmit()}
    • 好的,那么。渲染函数是否已经包含 return 子句?
    • 是的,很抱歉我没有立即提及。我更新了问题。
    【解决方案2】:

    使用三元运算符来渲染你的组件。 React JSX 支持 If-else 逻辑渲染,如 {(this.state.loading == false) ? &lt;Overlay /&gt; : null}

    您应该使用this.setState({loading: true}); 来更改状态,而不是直接赋值。在您的handleSubmit(); 中也使用event.preventDefault()

    import React from 'react';
    import Overlay from './overlay';
    
    export default class RegisterForm extends React.Component {
      constructor {
        this.state = {
          loading: false
        };
      }
      handleSubmit(event){
       event.preventDefault();
        this.setState({loading: true});
        ...
      }
    
      render(){
        <form onSubmit {()=>{this.handleSubmit()}>
    
         {(this.state.loading == false) ? <Overlay /> : null}
        </form>
      }
    }
    

    【讨论】:

    • 不幸的是,这也不起作用。我试过{(this.state.loading == true) ? &lt;Overlay /&gt; : null}{(this.state.loading) ? &lt;Overlay /&gt; : null}{this.state.loading &amp;&amp; &lt;Overlay /&gt;}
    • 在您的 handleSubmit 中使用 event.preventDefault。检查更新的答案
    • 我的原始代码中已经有了这个;有问题省略(认为无关紧要?)
    • this.setState() 而不是直接分配 this.state 是线索。我很想知道为什么...谢谢!
    • 这里很好地解释了为什么你应该使用 this.setState 而不是 this.state stackoverflow.com/questions/35867038/…
    猜你喜欢
    • 2018-12-21
    • 2019-11-26
    • 2019-07-11
    • 2021-10-22
    • 1970-01-01
    • 2019-11-21
    • 2022-11-11
    • 2014-12-18
    • 1970-01-01
    相关资源
    最近更新 更多