文档章节

React jsx 中写更优雅、直观的条件运算符

开源中国最帅没有之一
 开源中国最帅没有之一
发布于 06/21 21:00
字数 647
阅读 16
收藏 1
点赞 0
评论 2

这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符

Conditional Operator

condition ? expr_if_true : expr_if_false

jsx中书写条件语句我们经常都会使用到的就是三目运算符(?:)也叫内联条件运算符,可能大家都有体会三目运算符并不是一种直观的书写方式。特别是在复杂情况下时。

拿上面文章中的代码举个

return (
  <div>
    <p>Text: {this.state.text}</p>
    {
      view
      ? null
      : (
        <p>
          <input
            onChange={this.handleChange}
            value={this.state.inputText} />
        </p>
      )
    }
  </div>
);

上面的代码是根据view变量为false时显示一个p元素

或者是下面这样显示不同的元素或组件

return (
  <div>
    <p>Text: {this.state.text}</p>
    {
      view
      ? (
        <p>
          something value
        </p>
      ) : (
        <p>
          <input
            onChange={this.handleChange}
            value={this.state.inputText} />
        </p>
      )
    }
  </div>
);

过多的javascript三目运算符在jsx中看起来并不那么容易,逻辑区分有时也会变的复杂

如果你又一些嵌套,情况会更复杂(大部分eslint并不能使用嵌套)

return (
  <div>
    { condition1
      ? <Component1 />
      : ( condition2
        ? <Component2 />
        : ( condition3
          ? <Component3 />
          : <Component 4 />
        )
      )
    }
  </div>
);

上面的代码我也遇到过,维护起来就像在沼泽里行走

我尝试着思考,能否将这种条件运算符进行更高级别的抽象,然后使用React组件实现它们呢?

经过尝试确实是可行的,于是我做了一些东西。抽象后jsx条件运算就像下面这样

根据某个变量的值显示某个组件

<If when={this.state.logic}>
  <p>↔️show component</p>
</If>

同上,但是具有更高的可读性,而且逻辑和美观程度上优越于三目运算符

<If when={this.state.logic}>
  <p>↔️show component</p>
  <If when={this.state.logic}>
    <p>other component</p>
  </If>
</If>

还有更多的选择,我应该不用做过多解释就能看明白下面的代码了

<Switch value={value}>
  <Case when={condition}>
    <p>condition 1</p>
  </Case>
  <Case when={condition}>
    <p>condition 2</p>
  </Case>
  <Case when='c' children={<p>condition 3</p>}/>
  <Default children={<p>default component</p>}/> {/*可提供一个默认组件*/}
</Switch>

遍历一个arrayobject

<For of={['a', 'b', 'c']}>
  {(item, index) => (<p key={index}>{index}:{item}</p>)}
  <Default>default component</Default> {/*可提供一个默认组件*/}
</For>

我创建这个仓库供大家尝试

你又任何想法?欢迎讨论。

感谢阅读

© 著作权归作者所有

共有 人打赏支持
开源中国最帅没有之一

开源中国最帅没有之一

粉丝 41
博文 20
码字总数 11484
作品 5
成都
程序员
加载中

评论(2)

开源中国最帅没有之一
开源中国最帅没有之一

引用来自“OSC_LvJiwU”的评论

又封装成vue语法了吗?<template v-if="condicondition"></template>
出发的初衷不是这,只是为了在jsx中更好的使用条件语法
OSC_LvJiwU
OSC_LvJiwU
又封装成vue语法了吗?<template v-if="condicondition"></template>
[译] React 实现条件渲染的多种方式和性能考量

原文地址:8 React conditional rendering methods 原文作者:Esteban Herrera 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:Dong Han 校对者:Jessica Shao,doc...

卷头驴先生
07/06
0
0
Web 开发的未来:React、Falcor 和 ES6

Widen是一家数字资产管理解决方案提供商。目前,其技术栈还非常传统,包括服务器端的Java、浏览器端的AngularJS、提供REST API支持的Jersey以及jQuery、 Underscore、lodash、jQuery UI和Boo...

oschina
2015/10/19
8.4K
28
react jsx 中的条件判断

想知道怎么拓展标签的, 请看我另一篇文章 http://my.oschina.net/wolfx/blog/707181 react jsx 中的条件判断 说到条件判断,很容易想到的就是if,有很多模版引擎都是这样处理的. 但是,上面的代...

WolfX
2016/02/28
1K
0
react学习(3)-jsx语法

深入JSX JSX是一个JavaScript语法扩展,类似于XML。你可以使用React,可以进行JSX语法到JavaScript的转换 Why JSX? react不是必须使用JSX。你可以使用普通的JS。然而,我们建议使用JSX因为它...

Yohance
2016/09/26
59
0
轻松入门React和Webpack

说说React 一个组件,有自己的结构,有自己的逻辑,有自己的样式,会依赖一些资源,会依赖某些其他组件。比如日常写一个组件,比较常规的方式: 通过前端模板引擎定义结构JS文件中写自己的逻...

WolfX
2016/02/27
228
0
深入了解React.js的JSX

JSX 是React 为JavaScript 语法带来的可选扩展,用于在JavaScript 代码中编写声明式XML 风格语法。 对于Web 项目而言,React 的JSX 提供了一组类似于HTML 的XML 标签,但在其他使用场景中,会...

紫霞等了至尊宝五百年
06/01
0
0
ReactJS学习笔记——npm、JSX、webpack

ReactJS学习笔记——npm、JSX、webpack [toc] React是一个JavaScript库文件,使用它的目的在于能够解决构建大的应用和数据的实时变更。该设计使用JSX允许你在构建标签结构时充分利用JavaScr...

小米墨客
2016/03/18
4.1K
11
关于React你应该了解的一切:开始构建前你所需的基础知识

摘要:你是不是对React充满好奇,并且还没有机会学习它?或者你已经尝试过,却挣扎于核心概念的掌握?又或者你已经学习过基础,但是想巩固一下知识?无论你是以上哪种类型,这篇文章都适合你...

众成翻译
2017/12/18
0
0
在Vue中使用JSX的正确姿势(有福利)

姿势很重要,末尾有福利 vue-antd-ui开源了一段时间后,收到了一些反馈,尤其是Form组件上线后,很多用户对JSX的使用感到迷惑和不习惯,为此专门介绍下Vue JSX的使用姿势及注意事项。 Form组...

zeka
06/14
0
0
前端神器:一行命令,React 组件转 Vue 组件!

基于目前React和Vue比较火,开发react-to-vue工具的目的是为了进一步提高组件的可复用用性,让组件复用不仅仅局限在一个框架里面 简介 对于react-to-vue工具,转化的是基本的react component...

cacao111
07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部