ReactJS:使用枚举的条件渲染

Posted

技术标签:

【中文标题】ReactJS:使用枚举的条件渲染【英文标题】:ReactJS: Conditional Rendering using Enums 【发布时间】:2018-10-19 02:34:43 【问题描述】:

我对 React 有点陌生,一直在练习使用this article 中指定的枚举渲染方法创建应用程序。

但是,我正在尝试以与本文所讨论的方式略有不同的方式应用它,更具体地说,使用它来有条件地呈现我的所有网站,除了基于lastLinkClicked 状态的<Nav />。对于 WEB_PAGES 对象中列出的每个条件,我都有不同的页面类。

也许我误解了这种方法,因为我对枚举没有太多经验,但我的页面没有正确呈现。这是我的代码:

class App extends Component 
  constructor(props)
    super(props);

    this.state = 
      x: ...
      y: ...
      z: ...
      lastClickedLink: 'home' //changes to 'new', 'settings', etc. using another function not listed here
    
  


  render() 
    function onLinkClick(link) 
      const WEB_PAGES = 
        home: <Home
                x=this.state.x
              />,
        new: <NewPost />,
        settings: <Settings />,
        signup: <SignUp />,
        login: <Login />
      ;
      return (
        <div>
          WEB_PAGES.link
        </div>
      );
    

    return (
      <div>
        <Nav
          y=this.state.y
          z=this.state.z
        />
      onLinkClick(this.state.lastClickedLink)
    </div>
    );
  


export default App;

为简洁起见,我删除了一些代码。我在此设置中遇到的错误是TypeError: Cannot read property 'state' of undefined for home 在 WEB_PAGES 对象下。

我最初认为this 指向 WEB_PAGES 对象,但将this 更改为App 表明state 也未定义。我现在不确定该怎么做。

枚举条件渲染方法在这种规模上是否可行?如果不是,还有什么其他方法最适合这种情况?非常感谢!

【问题讨论】:

使用立即调用函数。 请检查代码并将语句从 WEB_PAGES.link 替换为 WEB_PAGES[link] WEB_PAGES[link] 成功了,谢谢! 【参考方案1】:

javascript 中,当您使用 function 关键字创建函数时,它会创建自己的新范围并创建默认对象 this。因此,当您尝试访问 this.state.x 时,它不会在函数内声明属性。变成this.undefined.x。所以它给出了错误。

而箭头函数(() =&gt; ) 不会创建此对象,而是创建内部范围。

在您的代码中尝试以下渲染方法:

render() 
    return (
    <div>
        <Nav
        y=this.state.y
        z=this.state.z
        />
        ((link) => 
            const WEB_PAGES = 
            home: <Home
                    x=this.state.x
                />,
            new: <NewPost />,
            settings: <Settings />,
            signup: <SignUp />,
            login: <Login />
            ;
            return (
                <div>
                WEB_PAGES[link]
                </div>
            );
        )(this.state.lastClickedLink)
    </div>
    );

【讨论】:

消除了错误,但现在我渲染的只是导航,没有 WEB_PAGE 对象中的任何内容。 我觉得应该是&lt;div&gt;link&lt;/div&gt;? 试试这个WEB_PAGES[link] @ChristinaW。保持之前的代码不变,但尝试使用语句 WEB_PAGES[link] 而不是 WEB_PAGES.link @ShubhamBatra 你能解释一下,为什么她的状态是未定义的?【参考方案2】:

当你尝试使用. 时使用WEB_PAGES[link] 它将不起作用

【讨论】:

【参考方案3】:

const Link = ( lastClickedLink ) => 
  const WEB_PAGES = 
    home: <Home x=lastClickedLink />,
    new: <NewPost />,
    settings: <Settings />,
    signup: <SignUp />,
    login: <Login />
  ;
  return (
    <div>
      WEB_PAGES[link]
    </div>
  );


render() 
  return (
    <div>
      <Nav
        y=this.state.y
        z=this.state.z
      />
      <Link lastClickedLink=this.state.lastClickedLink />
    </div>
  );

此变体具有更高的可读性和可扩展性。基于 Shubham Batra 示例。

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。

以上是关于ReactJS:使用枚举的条件渲染的主要内容,如果未能解决你的问题,请参考以下文章

ReactJS 使用 props 条件渲染组件的最佳方式

如何根据用户的操作系统有条件地渲染 ReactJS 内容

我想在 reactjs 中实现一个条件渲染系统

在 reactjs 中悬停时显示组件 [关闭]

使用 ReactJS 的 Datatables.net,在一列中渲染一个 ReactJS 组件

reactjs - 如何隐藏一个div并将其替换为reactjs中的另一个div?