Javascript三元运算符&;chaining&;
javascript ternary operator "chaining"
我正试图用三元运算符(由于jsx语法限制而需要)写这样的东西
if(!this.state.msg) {
if(this.state.ask.length != 0) {
// do stuff
} else {
// do stuff
}
if(this....) {
//do stuff
} else {
// ...
}
} else {
//nothing
}
所以我尝试了这个愚蠢的
!this.state.msg ? this.state.ask.length != 0 ? //do stuff : "" this.state... ? //do stuff : //do other stuff : //nothing
但这显然不是正确的方法。
非常欢迎任何帮助。
真正的分支有两个组件;可以用逗号分隔它们(括号括起来,因为逗号的结合性比三元运算符弱)。所以
!this.state.msg ?
(
this.state.ask.length != 0 ? /*stuff*/ : /*stuff*/,
this... ? /* stuff */ : /* ... */
) : /* nothing */
或者,由于else
分支"什么都不做",您可以将顶层的三元操作符替换为简单的and:
!this.state.msg &&
(
this.state.ask.length != 0 ? /*stuff*/ : /*stuff*/,
this... ? /* stuff */ : /* ... */
)
您断言JSX以这种方式限制您是错误的-阅读此文档页面,您将看到您可以使用这样的内容:
{(() => {
// My awesome multi-step code
})()}
也许添加另一个视角会有所帮助。在JSX中,很少有需要使用三元操作符的情况。在这种情况下,我会考虑将所有这些逻辑移到一个单独的函数中。
helperFunction: function() {
if(!this.state.msg) {
if(this.state.ask.length != 0) {
// return stuff
} else {
// return stuff
}
if(this....) {
// return stuff
} else {
// ...
}
} else {
// nothing
}
}
那么你就可以在渲染方法中使用你的helper函数了。
React.createClass({
helperFunction: function() {
// ...
},
render: function() {
return (
<div>
{this.helperFunction()}
</div>
);
}
});
您的辅助函数可以返回可用于属性的值,也可以返回其他JSX组件。我经常发现将代码移出如下模式很有帮助:
render: function() {
return (
condition === 'example' ?
<MyComponent attr={this.props.example} onChange={this.props.onChange} /> :
<MyOtherComponent attr={this.state.example} onChange={this.state.onChange}/>
);
}
像这样的代码:
helper: function(condition) {
if(condition === 'example') {
return (
<MyComponent attr={this.props.example} onChange={this.props.onChange} />
);
}
else {
return (
<MyOtherComponent attr={this.state.example} onChange={this.state.onChange}/>
);
}
},
render: function() {
return this.helper(condition);
}
或者在字符串相等检查的情况下更好。
helper: function(condition) {
const default = <MyOtherComponent attr={this.state.example} onChange={this.state.onChange}/>
const conditions = {
example: <MyComponent attr={this.props.example} onChange={this.props.onChange} />,
example2: <MyComponent attr={this.props.example} onChange={this.props.onChange} />,
example3: <MyComponent attr={this.props.example} onChange={this.props.onChange} />,
};
return conditions[condition] || default;
},
render: function() {
return this.helper(condition);
}
这种方式为您提供了switch语句的大部分功能,但语法也更简洁,它允许您从大量条件组件中优雅地进行选择。使用if语句(常规或三元)编写的相同代码将更加冗长。
考虑到冗长、表达式的清晰度和可维护性,我不建议将if-else转换为三元表达式。尽量保持你的代码简单,即使以增加几行代码为代价。
如果你只是想学习
!this.state.msg ?
(this.state.ask.length != 0 ? //do if stuff : //do else stuff),
(this.some == 0 ? //do 2nd if stuff : //do 2nd else stuff)
:
将其可视化会有所帮助。
!this.state.msg ?
? this.state.ask.length != 0)
// do stuff
:
// do stuff
:
this.... ?
//do stuff
:
// ...
相关文章:
- 这是什么 ==- javascript 运算符
- jQuery/JS包含运算符或类似运算符
- Javascript逻辑运算符和字符串/数字
- 模运算符前的双水平线
- jQuery's trim()的前缀为not运算符
- Javascript,如果条件在没有&&逻辑运算符当&&它不起作用
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 如何使用排列运算符来获取具有命名参数的函数的所有参数
- JavaScript 中三元条件和逻辑和运算符的运算符优先级
- 用于验证JS中逻辑运算符表达式的正则表达式
- 什么's是相当于LINQ's SelectMany运算符
- JavaScript-===vs===运算符性能
- 在 Jquery/Javascript 中使用多个 OR (||) 运算符时如何设置变量
- 三元运算符检查多个字符串
- 调用C++中JScript中的instanceof运算符(IDispatch/IDispatchEx)
- ||(OR)运算符如何在赋值中工作
- 在 JavaScript 对象中设置要使用的运算符的属性
- 哪个JavaScript相等运算符(==或===)更快
- 逻辑和/或运算符-意外的最终结果
- Javascript三元运算符&;chaining&;