2017-03-09 104 views
1

我似乎无法得到这个简单的功能的基本工作原理我的标记是像这样(简化)如果速记内声明,如果声明

{ loading || Object.keys(product).length <= 0 ? 'loading' : 
    <div> 
    {if(){ 

    }} 
    <ProductPictureWidget mainPic={product.pic_url} /> 
    <ProductOptionsWidget product={product} activeProps={activeProps} selectProductOption={this.selectProductOption}/> 
    </div> 
} 

但是,这给我留下了SyntaxError: Unexpected tokenif声明

什么我在这里做错了吗?我不允许在我的简写if声明中做if声明吗?

回答

2

JSX不允许返回函数中if statement。但你被允许,如果你想利用if statement使用三元表达式

{ loading || Object.keys(product).length <= 0 ? 'loading' : 
    <div> 
    {(condition here)? <div>Hello World</div>: null} 
    <ProductPictureWidget mainPic={product.pic_url} /> 
    <ProductOptionsWidget product={product} activeProps={activeProps} selectProductOption={this.selectProductOption}/> 
    </div> 
} 

但是还存在另一种方式做到这一点,即打电话给在其中使用if-else statements

conditionalRender() { 
    if(condition) { 
     return <div>Hello</div> 
    } else { 
     return null 
    } 
} 

{ loading || Object.keys(product).length <= 0 ? 'loading' : 
    <div> 
    {this.conditionalRender()} 
    <ProductPictureWidget mainPic={product.pic_url} /> 
    <ProductOptionsWidget product={product} activeProps={activeProps} selectProductOption={this.selectProductOption}/> 
    </div> 
} 
3

JSX只允许表达式,而不是语句。 ternary operator是一个表达式。 if开始if statement。你可以看到为什么一个if语句不会通过查看编译的JavaScript的工作(除去if语句):

​​

JSX相当于函数调用和对象声明。如果if语句被编译,这将产生无效的JavaScript:

{ 
    loading || Object.keys(product).length <= 0 ? 'loading' : React.createElement(
    'div', 
    null, 
    if(){ }, // This is **invalid** JavaScript!! 
    React.createElement(ProductPictureWidget, { mainPic: product.pic_url }), 
    React.createElement(ProductOptionsWidget, { product: product, activeProps: activeProps, selectProductOption: undefined.selectProductOption }) 
); 
} 
+1

功能所以要做到这一点,我必须完全删除三元运算符,并将它作为if else语句写出来吗? – NooBskie

+1

您可以将条件渲染的组件分配给变量,并引用JSX中的变量或遵循Shubham Khatri的答案中的模式。 –