往期回顾

前文中我们讲解了利用 ReactElement 来编写React程序,但是我们也看到这种方式编写 React 特别的麻烦,而且层级结构特别不清晰。今天我们来看一种优雅的编写React的代码的一种方式 JSX。

JSX

JSX就是把 js 和 xml 结合起来编写程序的一种格式,简单的说就是给我们的 JS 添加了 XML 的语法扩展。有了 JSX 之后,可以帮助我们在编写模板的时候结构更加简单清晰。 我们可以对比一下,咱们使用 ReactElement 和 JSX 编写同一个结构时的区别,大家就会喜欢上 JSX;

  • 利用 ReactElement 编写的结构

let Title = React.createElement("h1",null,"页面标题"); 

let Header = React.createElement("header",null,Title);  

let Sider = React.createElement("aside",null,"侧边栏");  

let Content = React.createElement("article",null,"页面内容"); let Main = React.createElement("div",null,Sider,Content); 

let Footer = React.createElement("footer",null,"页面底部");  

let Page = React.createElement(      "div",      null,

     Header,

     Main,

     Footer);

 ReactDOM.render(

     Page,

     document.getElementById("root")

 );

  

  • 利用 JSX 编写的结构

ReactDOM.render(

        <div>

            <header>

                <h1>页面标题</h1>

            </header>

            <div>

                <aside>侧边栏</aside>

                <article>页面内容</article>

            </div>

            <footer>页面底部</footer>

        </div>

        document.getElementById("root")

    );

  

从上述示例中我们看到在 JSX 中我们可以直接使用我们熟悉的 HTML 标签来书写我们的模板,这样的话结构层级非常清晰,也便于我们维护,当然上手也更便捷。

JSX 使用时的注意事项

  • 在使用 JSX 中,不能嵌套多个同级标签,一定要在外边加一个父级

  • 使用 JSX 时,我们需要使用 Babel 来进行编译,所以必须引入 Babel 并且在 script 上 添加 type="text/babel" 来提示 babel 编译我们 script 中的代码,如下所示:

    <script type="text/babel">

        ReactDOM.render(

        <div>

                <h1>hello world</h1>

                <p>注意 type 另外 必须有一个父标签包裹</p>

        </div>,

        document.getElementById("root")

        );

    </script>

  

  • 使用 JSX 时,当我们要写的是一个 HTML 标签时,请全部小写

  • 使用 JSX 时,所有标签都必须闭合单标签 <单标签 /> 也一样必须闭合

插值表达式

当我们需要在 JSX 中插入一个js数据时,我们就需要使用插值表达式。 在 JSX 中,读到{} 时,它就会认为你要插入一条js数据,这个 {} 就是插值表达式,使用示例如下:

    let a = "hello";

    let b = "React";

    ReactDOM.render(

        <h1>{a + b}</h1>,

        document.getElementById("root")

    );

  

插值表达式在什么时候使用

  • 当我们需要在 JSX 中使用 JS 中的数据的时候,我们就需要使用差值表达式

  • 当我们要在 JSX 中添加 注释的时候,也需要使用插值表达式 {/* 在这里写JSX的注释 */}

使用插值表达式时的注意事项

  • {}中,接收一个 JS 表达式,可以是我们的算术表达式,变量 或函数调用, 最终 {} 接收的是表达式 计算的结果

  • {}中,接收的是 函数调用时,该函数需要由返回值

  • {}中,不能写 if else 以及 switch 这些流程控制语句,但是可以使用三目表达式 来进行判断,示例如下:

    let a = 10;

          let b = 20;

          ReactDOM.render(

               <h1>{a > b?"正确":"错误"}</h1>,

               document.getElementById("root")

      );

  

  • {}中,不能写 for 或者 whlie 这些循环语句,可以使用数组方法代替,示例如下:

    let arr = [

       "这是第一项",

       "这是第二项",

       "这是第三项"

      ]

      ReactDOM.render(

           <ul>

           {arr.map((item,index)=>{

           /* 当我们要向 JSX 中添加一组元素时,一定要设置  key 属性,具体内容 我们会在后边的文章中讲到 */

           return <li key={index}>{item}</li>

           })}

           </ul>,

       document.getElementById("root")

      );

  

不同类型数据在插值表达式中的数据输出

  • 字符串、数字:原样输出

  • 布尔值、空、未定义:输出空值,也不会有错误

  • 对象:不能直接输出,但是可以通过其他方式,Object.values、Object.keys 等方法去解析对象

  • 数组:支持直接输出,默认情况下把数组通过空字符串进行拼接

JSX的属性操作

  • 属性值加了引号,那么就是一个普通的属性书写方式

    ReactDOM.render(

          <h1 title="React笔记">React笔记</h1>,

          document.getElementById("root")

      );

  

  • 属性值可以直接写成差值表达式

    let title = "React笔记" 

      ReactDOM.render(

          <h1 title={title}>React笔记</h1>,

          document.getElementById("root")

      );

  

  • class:在 JSX 中需要使用 className 属性去代替 class

ReactDOM.render(

      <h1 className="title">React笔记</h1>,

      document.getElementById("root")

  );

  

  • style:在 JSX 中 style 的值只能是对象 style={{ property : value }}

let style = {

  borderBottom: "1px solid #000"

  }

  ReactDOM.render(

      <h1 style={style}>React笔记</h1>,

      document.getElementById("root")

  );

  ReactDOM.render(

      <h1 style={{

      borderBottom: "1px solid #000"

      }}>React笔记</h1>,

      document.getElementById("root")

  );

  

看完了 JSX 的基本操作之后,我们来看一个小例子,如何通过数据来生成一个简单的视图

let data = {

        title: "巅峰榜·热歌",

        details: [

                {

                name: "体面",

                message: "《前任3:再见前任》电影插曲"

                },

                {

                name: "说散就散",

                message: "《前任3:再见前任》电影主题曲"

                },

                {

                name: "BINGBIAN病变 (女声版) ",

                message: "抖音热门歌曲"

                }

        ]

 }

    ReactDOM.render(

        <section className="box">

        <h2 className="title">{data.title}</h2>

        <ul className="list">

        {data.details.map((item,index)=>{

        return (

        <li>

            <p className="name">{item.name}</p>

            <p className="message">{item.message}</p>

        </li>

        );

        })}

        </ul>

        </section>,

    document.getElementById("root")

    );

  

关于 JSX 的基本使用我们就说到这,在下一章节中我们要说到一个比较重的内容--组件。

当然在 React 中编写组件的方式也会有多种,我们在下一篇中详细的说。

——以上是笔者归纳总结,如有误之处,欢迎指出。

订阅号ID:Miaovclass

关注妙味订阅号:“妙味前端”,为您带来优质前端技术干货;

玩转 React【第02期】:恋上 React 模板 JSX的更多相关文章

  1. 【大厂面试02期】Redis过期key是怎么样清理的?

    PS:本文已收录到1.1K Star数开源学习指南--<大厂面试指北>,如果想要了解更多大厂面试相关的内容,了解更多可以看 http://notfound9.github.io/inter ...

  2. 《HelloGitHub月刊》第02期

    <HelloGithub>第02期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...

  3. 《HelloGitHub月刊》第 02 期

    <HelloGithub>第02期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...

  4. 【九天教您南方cass 9.1】02 从地形图上绘制纵横断面

    同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程, 测量空间的[九天教您南方cass]专栏是九天老师专门开设cass免费教学班.希望能帮助那些刚入行的同学,并祝您一臂之力. [点击索 ...

  5. React学习笔记-1-什么是react,react环境搭建以及第一个react实例

    什么是react?react的官方网站:https://facebook.github.io/react/下图这个就是就是react的标志,非常巧合的是他和我们的github的编辑器Atom非常相似. ...

  6. React系列(一):React入门

    React简介 1.由来 React是有Facebook开发出来用于构建前端界面的JS组件库,由于其背后的强大背景,使得这款库在技术开发上完全没有问题. 2.React的优势 解决大规模项目开发中数据 ...

  7. React Native是一套使用 React 构建 Native app 的编程框架

    React Native是一套使用 React 构建 Native app 的编程框架 React Native at first sight what is React Native? 跟据官方的描 ...

  8. react.js 从零开始(七)React (虚拟)DOM

    React 元素 React 中最主要的类型就是 ReactElement.它有四个属性:type,props,key 和ref.它没有方法,并且原型上什么都没有. 可以通过 React.create ...

  9. 如何使用TDD和React Testing Library构建健壮的React应用程序

    如何使用TDD和React Testing Library构建健壮的React应用程序 当我开始学习React时,我努力的一件事就是以一种既有用又直观的方式来测试我的web应用程序. 每次我想测试它时 ...

随机推荐

  1. drozer安装出现的问题

    首先先检查你的手机或者模拟器是否开启了drozer agent 安装出现的问题: (1)找不到java路径: 解决方法:新建一个TXT文件,在文件中写如下内容: [executables] java ...

  2. CRM WEB UI 03搜索界面新建按钮调到详细界面

    这个和上一个差不多,简单说下: 1.因为NEW是在创建搜索界面的时候加的,所以此时只需在结果界面重定义NEW事件: method EH_ONNEW. OP_NEW( ). endmethod. 2.结 ...

  3. Oracle查询前几条数据的方法

    在Oracle中实现select top N:由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询. ...

  4. 559. Maximum Depth of N-ary Tree C++N叉树的最大深度

    网址:https://leetcode.com/problems/maximum-depth-of-n-ary-tree/ 很简单的深度优先搜索 设定好递归返回的条件和值 /* // Definiti ...

  5. Ping 的TTL理解

    http://www.webkaka.com/tutorial/zhanzhang/2017/061570/ 根据自己的扩展重新整理了一下,虽然不是运维,想了解一点东西就希望了解清楚. 一.含义 “T ...

  6. GetMapping 和 PostMapping最大的差别(转)

    原文地址:GetMapping 和 PostMapping  Spring4.3中引进了{@GetMapping.@PostMapping.@PutMapping.@DeleteMapping.@Pa ...

  7. 十一、持久层框架(MyBatis)

    一.基于注解方式的CRUD 把xml方式的CRUD修改为注解方式 之前在xml中配置,是在<mapper></mapper>标签下写CRUD <mapper namesp ...

  8. java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close().

    java.lang.Exception: DEBUG STACK TRACE for PoolBackedDataSource.close(). java.lang.Exception: DEBUG ...

  9. 如何让一个div水平和垂直居中对齐

    以下方法来自百度知道:https://zhidao.baidu.com/question/558984366971173044.html 方法1: .parent { width: 800px; he ...

  10. vs2015如何使用附加进程调试发布在IIS上项目

    1.如何使用附加进程调试IIS上的网站项目 1)在IIS部署一个网站项目 2)保证浏览器可访问(比如访问登陆页面) 3)在项目中LoginController断点,并在工具栏的调试找到附加到进程 4) ...