玩转 React【第02期】:恋上 React 模板 JSX

往期回顾
前文中我们讲解了利用 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的更多相关文章
- 【大厂面试02期】Redis过期key是怎么样清理的?
PS:本文已收录到1.1K Star数开源学习指南--<大厂面试指北>,如果想要了解更多大厂面试相关的内容,了解更多可以看 http://notfound9.github.io/inter ...
- 《HelloGitHub月刊》第02期
<HelloGithub>第02期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...
- 《HelloGitHub月刊》第 02 期
<HelloGithub>第02期 兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个 ...
- 【九天教您南方cass 9.1】02 从地形图上绘制纵横断面
同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程, 测量空间的[九天教您南方cass]专栏是九天老师专门开设cass免费教学班.希望能帮助那些刚入行的同学,并祝您一臂之力. [点击索 ...
- React学习笔记-1-什么是react,react环境搭建以及第一个react实例
什么是react?react的官方网站:https://facebook.github.io/react/下图这个就是就是react的标志,非常巧合的是他和我们的github的编辑器Atom非常相似. ...
- React系列(一):React入门
React简介 1.由来 React是有Facebook开发出来用于构建前端界面的JS组件库,由于其背后的强大背景,使得这款库在技术开发上完全没有问题. 2.React的优势 解决大规模项目开发中数据 ...
- React Native是一套使用 React 构建 Native app 的编程框架
React Native是一套使用 React 构建 Native app 的编程框架 React Native at first sight what is React Native? 跟据官方的描 ...
- react.js 从零开始(七)React (虚拟)DOM
React 元素 React 中最主要的类型就是 ReactElement.它有四个属性:type,props,key 和ref.它没有方法,并且原型上什么都没有. 可以通过 React.create ...
- 如何使用TDD和React Testing Library构建健壮的React应用程序
如何使用TDD和React Testing Library构建健壮的React应用程序 当我开始学习React时,我努力的一件事就是以一种既有用又直观的方式来测试我的web应用程序. 每次我想测试它时 ...
随机推荐
- oracle 查看被锁表 及解除锁定
查看 哪些表 被锁了 SELECT object_name, machine, s.sid, s.serial# FROM gv$locked_object l, dba_objects o, gv$ ...
- canvas绘图在手机上边缘粗糙
辛辛苦苦用canvas绘图,做好动画后,想看看效果,结果在手机上一打开,效果是有了,但是边缘特别粗糙,这怎么可以呢,有一种说法是你用canvas绘图时候在手机retain屏幕上,他把一个像素分为两个像 ...
- Single Number II leetcode java
问题描述: Given an array of integers, every element appears three times except for one. Find that single ...
- bat语法需要注意的地方
if else 格式 if exist C:\Python27 ::空格 ( ::(与if在同一行 ...
- Pycharm中安装package出现microsoft visual c++ 14.0 is required问题解决办法
在利用pycharm安装scrapy包是遇到了挺多的问题.在折腾了差不多折腾了两个小时之后总算是安装好了.期间各种谷歌和百度,发现所有的教程都是利用命令行窗口安装的.发现安装scrapy需要的包真是多 ...
- 牛客练习赛32-D-MST+tarjin割边
链接:https://ac.nowcoder.com/acm/contest/272/D来源:牛客网 题目描述 小p和他的朋友约定好去游乐场游玩,但是他们到了游乐场后却互相找不到对方了. 游乐场可以看 ...
- WDA基础一:激活相关服务
一个普通得系统,如果之前没动过相关配置而又想做做WDA程序,是需要激活几个服务的. 1.激活服务 事务码:SICF 默认SERVICE,执行. Service:default_host/sap/opt ...
- MapReduce(三)
MapReduce(三) MapReduce(三): 1.关于倒叙排序前10名 1)TreeMap根据key排序 2)TreeSet排序,传入一个对象,排序按照类中的compareTo方法排序 2.写 ...
- Spring AOP+Log4j记录项目日志
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6567672.html 项目日志记录是项目开发.运营必不可少的内容,有了它可以对系统有整体的把控,出现任何问题 ...
- AvalonJS+MVVM实战部分源码
轻量级前端MVVM框架avalon,它兼容到 IE6 (其他MVVM框架,KnockoutJS(IE6), AngularJS(IE9), EmberJS(IE8), WinJS(IE9) ),它可以 ...