往期回顾

前文中我们讲解了利用 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. gitlab 集成Jenkins

    项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将git路径存在这里还需要权限认证,否则会出现error  我 ...

  2. Python 2.7.x 使用Requests发起https请求时报Warning的问题

    warning :如下 /usr/local/lib/python2.7/dist-packages/requests/packages/urllib3/connectionpool.py:852: ...

  3. Codefores 1151E Number of Components

    大意:给定n元素序列$a$, $1\le a_i \le n$, 定义函数$f(l,r)$表示范围在$[l,r]$以内的数构成的连通块个数, 求$\sum\limits_{i=1}^{n}\sum\l ...

  4. Win10更改CMD控制台的代码页和字体和字号

    注意:936(简体中文)时,指定Consolas等英文字体将无效,会自动变为“新宋体”. 代码页:若是UTF8(65001)应改为:0000fde9 字号:000e0000 -> 12 cmd_ ...

  5. Highcharts 配置语法

    Highcharts 配置语法 本章节我们将为大家介绍使用 Highcharts 生成图表的一些配置. 第一步:创建 HTML 页面 创建一个 HTML 页面,引入 jQuery 和 Highchar ...

  6. 字符序列(characts)

    字符序列(characts) 问题描述: 从三个元素的集合[A,B,C]中选取元素生成一个N 个字符组成的序列,使得没有两个相邻的 子序列(子序列长度=2)相同,例:N=5 时ABCBA 是合格的,而 ...

  7. 【转】Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)

    E文好的可以直接看https://github.com/loresoft/EntityFramework.Extended 也可以在nuget上直接安装这个包,它的说明有点过时了,最新版本已经改用对I ...

  8. Windows和Linux创建软链接和硬链接

    1.Wondows创建软链接和硬链接 mklink [/d] [/h] link target /d--创建目录软链接:默认为文件软链接:创建目录链接时必须使用该选项不然创出的软链接无效 /h--创建 ...

  9. 微信小程序 带参调用后台接口 循环渲染页面 wx.request wx:for

    test.js 文件里的onLoad function getarticles(p,order,mythis) { wx.request({ url: 'https://ganggouo.cn/ind ...

  10. QPainter绘制渐进色文本

    参考资料:https://blog.csdn.net/what951006/article/details/52876513 效果图: 代码: void WgtText::paintEvent(QPa ...