【问题标题】:React Conditional Rendering of Component Inside Function Not WorkingReact 函数内部组件的条件渲染不起作用
【发布时间】:2020-05-22 02:49:13
【问题描述】:

我正在使用 Codesandbox 来学习 React。我正在尝试有条件地在函数内部(基于类的组件内部)呈现功能性 React 组件,单击按钮时会触发该组件。

这里是 Codesandbox 的链接:https://codesandbox.io/embed/laughing-butterfly-mtjrq?fontsize=14&hidenavigation=1&theme=dark

我遇到的问题是,如果没有在 App.js 中导入和呈现错误和膳食,我永远无法从 Booking 组件中获取任何一个组件来呈现。在这里的函数中:

   if (!this.state.name) {
     return (
       <div>
         <Error />
       </div>
     );
   }
    else {
      return <Meals name={this.state.name} date={this.state.date} />;
    }
 }

我应该呈现错误,如果没有输入名称但没有任何反应并且我被难住了,它应该会在点击时显示在屏幕上。

有什么明显的东西会阻止我看到错误组件在点击时加载吗?

提前谢谢你!

【问题讨论】:

    标签: javascript reactjs react-functional-component


    【解决方案1】:
      render() {
          const name = this.state.name;
          return (
            <div>
              {name ? (
              <Meals name={name} date={name} />
              ) : (
                 <Error />
              )}
            </div>
          );
        }
    

    nb:仅在类组件中使用渲染方法。

    中提到了各种类型的条件渲染

    https://reactjs.org/docs/conditional-rendering.html#

    【讨论】:

      【解决方案2】:

      屏幕上显示的一切都来自render 方法。你不能从任何类似的函数返回JSX。你可以这样做:

      class Bookings extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            name: "",
            date: "",
            display: false
          };
        }
      
        guestInfoHandler = event => {
          console.log(this.state, "what is the state");
          this.setState({ name: event.target.value });
        };
      
        dateInfoHandler = event => {
          this.setState({ date: event.target.value });
        };
      
        showMeals = () => {
          this.setState({ display: true });
        };
      
        render() {
          return (
           <>
            <div style={{ display: "inline-block" }}>
              <form
                className="theForm"
                style={{
                  height: "50px",
                  width: "100px",
                  borderColor: "black",
                  borderWidth: "1px"
                }}
              >
                <label className="theLabel">
                  Name:
                  <input
                    className="theInput"
                    type="text"
                    placeholder="guest name here"
                    onChange={this.guestInfoHandler}
                    value={this.state.value}
                  />
                </label>
              </form>
              <form>
                <label>
                  Date:
                  <input
                    type="text"
                    placeholder="date here"
                    onChange={this.dateInfoHandler}
                    value={this.state.value}
                  />
                </label>
              </form>
              <button onClick={() => this.showMeals()}>Click</button>
            </div>
            { display && name ? (
                <Meals name={name} date={name} />
                ) : (
                   <Error />
                )}
           </>
          );
        }
      }
      
      export default Bookings;
      

      希望这对你有用。

      【讨论】:

      • 谢谢,这确实有效!这很有帮助,而且更有意义。我不认为在函数中添加 JSX 似乎是正确的,但我找到了几篇关于条件渲染的文章,并以此为例。
      猜你喜欢
      • 2019-05-03
      • 2019-04-15
      • 2018-09-21
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多