javascript - ReactJs - 创建一个 "If"组件……好主意吗?

标签 javascript reactjs

我在 React 文档中读到“if”类​​型的语句不能在 JSX 代码中使用,因为 JSX 呈现为 javascript 的方式,它不会像人们期望的那样工作。

但是有什么理由可以说明实现“if”组件不是一个好主意吗?从我最初的测试来看它似乎工作正常,这让我想知道为什么不经常这样做?

我的部分意图是让 React 开发尽可能多地基于标记——使用尽可能少的 javascript。对我来说,这种方法更像是一种“数据驱动”的方法。

您可以 check it out here on JS Fiddle

<script type='text/javascript' src="https://unpkg.com/react@0.11.0/dist/JSXTransformer.js"></script>
<script type='text/javascript' src="https://unpkg.com/react@0.11.0/dist/react-with-addons.js"></script>

<script type="text/jsx">
/** @jsx React.DOM */
    
var If = React.createClass({
  displayName: 'If',

  render: function()
  {
    if (this.props.condition)
      return <span>{this.props.children}</span>
    return null;
  }
});

var Main = React.createClass({
    render: function() {
        return (
           <div>
             <If condition={false}>
                <div>Never showing false item</div>
             </If>
             <If condition={true}>
                <div>Showing true item</div>
             </If>
          </div>
        );
    }
});

React.renderComponent(<Main/>, document.body);
</script>

运行上面的结果:

Showing true item

最佳答案

查看 If-Else in JSX react 文档中的部分。

在 JSX 中,不能将语句放在花括号内——只能放在表达式中。如果您不知道 JavaScript 中表达式与语句之间的区别,请阅读此 article .此限制是因为 JSX 脱糖为函数调用,并且您不能将 if 语句用作 JavaScript 中函数的参数。但是,您可以使用 bool 运算符( &&||? : )来完成类似的工作。它们是表达式,因此它们可以放入 JSX 生成的构造函数调用中,并且它们的短路求值与 if 语句中使用的求值相同。

<div>
    {(true
        ? <div>Showing true item</div>     
        : <div>Never showing false item</div>
    )}
</div>
<p>My name is {this.name || "default name"}</p>

此外,React 会处理 nullfalse作为不在真实 DOM 中呈现的“空组件”(目前它在幕后使用相同的 noscript 技巧)。当您不想要“else”分支时,这很有用。参见 False in JSX了解详情。

<div>
    {shouldIncludeChild ? <ChildComponent/> : false}
</div>

至于您询问的 If 组件,它存在的一个问题是,在其当前形式中,即使条件为假,它也会评估其子组件。当 If 的主体仅在条件为真时才有意义时,这可能会导致错误:

<If condition={person !== null}>
    //This code throws an exception if this.person is null
    <div>{person.name}</div>
</If>

您可以通过让 if 组件将主体作为函数而不是子组件列表接收来解决此问题,但它更冗长:

<If condition={person !== null} body={function(){
    return <div>{person.name}</div>
}/>

最后,由于 If 组件是无状态的,您应该考虑使用普通函数而不是新的组件类,因为这会使“If”对 React 的协调算法透明。如果您使用 If 组件,则 <div>和一个 <If><div>将被认为是不兼容的,React 将进行完全重绘,而不是尝试将新组件与旧组件合并。

// This custom if function is for purely illustrative purposes
// However, this idea of using callbacks to represent block of code
// is useful for defining your own control flow operators in other circumstances.
function myCustomIf(condition, onTrue, onFalse){
    onTrue  = onTrue  || function(){ return null }        
    onFalse = onFalse || function(){ return null }
    if(condition){
        return onTrue();
    }else{
        return onFalse();
    }
}

<div>    
    {myCustomIf(person !== null, function(){
         return <div>{person.name}</div>
     })}
</div>

关于javascript - ReactJs - 创建一个 "If"组件……好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25224793/

相关文章:

html - 当屏幕太小时将标题放在两行

css - 在 Mac 上工作并在 Windows 上显示为 times new roman 在开发模式下的字体

reactjs - 从 react 中的对象数组中获取第一个对象

javascript - Grails:将两个g:select的值添加到HTML多重选择列表中

javascript - 使用ajax上传图片并显示给用户

javascript - 根据单选按钮选择显示表单

javascript - es lint '' 被分配了一个值但从未使用过'尽管我已经使用过它

javascript - mouseenter mouseleave 和一个选择

javascript - 从 Google 电子表格单元格中解析 Json

javascript - 根据图像的大小有条件地设置样式属性,通过 url 获取