往期回顾

前文中我们讲解了利用 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. POJ-2955 Brackets(括号匹配问题)

    题目链接:http://poj.org/problem?id=2955 这题要求求出一段括号序列的最大括号匹配数量 规则如下: the empty sequence is a regular brac ...

  2. jquery快速获得url 的get传值

    <script> var res = location.search.substr(1).split("&"); var arr={}; for (var i ...

  3. 统计数组中各个元素出现的次数,元素取值范围为:1到N

     问题描述: * 给定一个整数数组a,长度为N,元素取值范围为[1,N]. * 统计各个元素出现的次数,要求时间复杂度为O(N),空间复杂度为O(1). * 可以改变原来数组结构.  思路: * 从第 ...

  4. Web测试要点

    由于本人工作接触Web测试,所以我从网上找的资料,学习了解web测试哪些内容,然后自己整理汇总的随笔,如文章中有不足的地方,请大家多多指教:或者文章内容与他人相似,望见谅.   web是什么?(转载: ...

  5. Oracle 基本操作--数据类型、修改和删除表、增删改查和复制表

    一.Oracle基础数据类型:数据类型: 创建数据表时,设计数据表的结构问题,也就是设计及确定数据表中各个列的数据类型,是数值.字符.日期还是图像等其他类型. 因为只有设计好数据表结构,系统才会在磁盘 ...

  6. openssh安装/更新教程(CentOS)

    由于rpm包版本总落后于tar包,对于想安装新版本或由于漏洞需要更新到新版本那只能选择源代方式编译安装. 更新执行和安装一样的步骤就行了. 1.下载 官方网址:http://www.openssh.c ...

  7. SpringBoot 配置文件存放位置及读取顺序

    SpringBoot配置文件可以使用yml格式和properties格式 分别的默认命名为:application.yml.application.properties 存放目录 SpringBoot ...

  8. 给div添加锚点

    <div class="col-xs-3" id="myScrollspy"> <ul class="nav nav-tabs na ...

  9. linux命令--文件查询

    ls [ -lahid ] [ /* ] ls  --   默认查询当前目录下的显性文件 -l  --  显示文件的详细信息 -a --  显示所有文件(包括隐藏文件) -h --  文件大小显示为 ...

  10. VS 中常用的一些快捷键

    一.代码自动对齐 CTRL+K+F     二.撤销/反撤销 1.撤销---使用组合键“Ctrl+Z”进行撤销操作 2.反撤销---使用组合键“Ctrl+Y”进行反撤销操作 三.调用智能提示 使用组合 ...