React框架推荐使用的DOM语法格式为JSX语法,属于一种JavaScript扩展,React使用JSX来描述用户界面。咱们能够粗略的认为JSX是JavaScript和HTML的结合,可是在实际的使用过程当中还有必定的细节区别。本文就带领你们系统的学习JSX语法的格式。javascript
const element=<div>你好,React!</div>;
这里须要注意,上述代码不是JavaScript字符串,因此没有用任何引号引住;也不是HTML代码。而是JSX语法格式。html
React应用的最小单位是“元素”,JSX语法格式就是React推荐用来声明元素的。前端
对于相互嵌套的JSX元素,JSX语法推荐使用()扩住。java
const ulElement=( <ul> <li>第一名</li> <li>第二名</li> </ul> )
使用()扩住嵌套的JSX元素,让格式更加清晰。从实际的操做来看,不书写()也是能够的。小程序
在JSX元素中使用变量必须使用{}扩住,变量能够用于JSX元素的内容中,也能够用与JSX元素的HTML属性取值上。微信小程序
let name='张三'; const strongElement=<strong>你好,{name}</strong> let url='https://www.baidu.com'; const link=<a href={url}>百度一下</a>
对于具备return返回值的函数,JSX元素能够像使用变量同样,利用{}扩住对函数进行调用。数组
function getSum(a,b){ return a+b; } let a=10,b=20; const sum=<div>{a}+{b}={getSum(a,b)}</div>
上述几种状况中举的案例元素(element、ulEelement、strongElement、link、sum)均可以直接用在ReactDOM。render()方法的第一个参数中,充当向第二个参数所指的DOM节点中放入的元素。以sum为例,代码以下所示。浏览器
ReactDOM.render( sum, document.querySelector('#app') );
JSX元素在书写时还要注意下列语法规定:微信
请你们仔细阅读下列代码:app
const element=( /*一个完整的JSX元素:本注释没有在任何标记内部,因此不用{}扩住*/ <div> {/*惟一的根节点:本注释在标记内部,必须用{}扩住*/} <div className="top"> {/*className属性的使用*/} {/*style属性的使用必须是双大括号*/} <div style={{width:'1200px',height:'40px',backgroundColor:'#3385ff'}}> 欢迎学习React框架。 <img src=”images/01.jpg” /> {/*标记必须有结尾标识*/} </div> </div> </div> ); ReactDOM.render( element, document.querySelector('#app') );
上述代码在浏览器中运行,能够从开发人员工具的Elements选项卡中看到下列如图所示的结构。
从图中能够看得出,id属性取值为app的div和class属性取值为top的div之间,有一个空的div。这是因为为了知足JSX元素必须具有一个惟一的根节点,而设置的最外层的div标记对。为了避免让最外层的根节点显示在DOM结构中,React建议使用React.Fragment做为全部JSX元素最外层的根节点。代码该为以下格式。
const element=( /*一个完整的JSX元素:本注释没有在任何标记内部,因此不用{}扩住*/ <React.Fragment> {/*惟一的根节点:本注释在标记内部,必须用{}扩住*/} <div className="top"> {/*className属性的使用*/} {/*style属性的使用必须是双大括号*/} <div style={{width:'1200px',height:'40px',backgroundColor:'#3385ff'}}> 欢迎学习React框架。 <img src=”images/01.jpg” /> {/*标记必须有结尾标识*/} </div> </div> </ React.Fragment > );
这时再看开发人员工具的Elements选项卡,React.Fragment标记位置是没有任何标记对的。
在JSX格式中遍历数组不能使用for循环,只能使用ES5为数组提供的各类方法。下面的例子展现了用数组的map()方法来遍历数组的功能实现。
例1:实现页面导航条的JSX格式。
let navText=['首页','产品展现','技术展望','视频会议','金牌团队','关于咱们']; let navLink=['index.html','product.html','technology.html','videol.html','team.html','about.html']; const nav=( <React.Fragment> <div className="top"> <div className="topContent"> <ul> { navText.map((item,index)=>{ return <li key={index}><a href={navLink[index]}>{item}</a></li> }) } </ul> </div> </div> </React.Fragment> );
从上述代码中能够看出下列有关JavaScript语言在JSX语法中的规范:
例2:有一个JSON数组,每一个元素有两个属性:isShow和file。其中isShow取值为逻辑值,file取值为表示图片路径的字符串。当isShow取值为true时,file指定的图片要显示在页面中;当isShow取值为false时,file指定的图片不显示在页面中。
let picture=[ {isShow:true,file:'images/01.jpg'}, {isShow:true,file:'images/02.jpg'}, {isShow:false,file:'images/03.jpg'}, {isShow:true,file:'images/04.jpg'}, {isShow:true,file:'images/05.jpg'} ]; const img=( <React.Fragment> <h2>图片欣赏</h2> <div className="picture"> { picture.filter((item,index)=>{ return item.isShow }).map((item,index)=>{ return <img src={item.file} key={index} /> }) } </div> </React.Fragment> );
上述代码中,使用数组的filter()方法对picture数组进行筛选,筛选条件是isShow取值为true。而后再对筛选出来的数组元素使用map()方法进行遍历,以用来在页面中显示图片。
在JSX格式中是不能直接使用JavaScript的if语句的,咱们经过下列五种方式来为你们讲解可行的方法。
例:设置一个变量flag。规定当flag=true时,页面中显示一个类名为box的div标记;当flag=false时,页面中显示一个类名为fox的div标记。
JavaScript提供的三元运算符(? :)也被称为“三目运算符”。该运算符适合分为两种状况的分支断定。
let flag=true; const element=( <React.Fragment> { flag? <div className="box"> 我是box元素...... </div> : <div className="fox"> 我是fox元素 </div> } </React.Fragment> );
JavaScript提供的逻辑与运算符(&&)的短路原理规定:当&&运算的左侧为false时,右侧不予计算。该运算符适合多分支的断定。
let flag=true; const element=( <React.Fragment> {flag && <div className="box"> 我是box元素...... </div>} {!flag && <div className="fox"> 我是fox元素 </div>} </React.Fragment> );
上述代码中,由于flag变量的取值为true,因此!flag的取值为false,则!flag &&右侧的元素再也不计算,也就不会被渲染出来。
既然JSX格式不容许直接使用if语句,那咱们就不在JSX格式中使用。咱们能够在JSX格式之外的区域使用if语句。
let flag=false; let target; if(flag){ target=( <div className="box"> 我是box元素...... </div> ) }else{ target=( <div className="fox"> 我是fox元素 </div> ) } const element=( <React.Fragment> {target} </React.Fragment> );
上述代码中定义了一个名为target的变量,经过在JSX格式之外进行if语句的断定,让target变量得到不一样的JSX元素,最终在React.Fragment标记对中使用{target}引用了断定后的结果。
咱们也能够在JSX格式之外的区域声明一个函数,在函数体总使用if语句进行断定,并最终将须要渲染的JSX格式利用return语句返回。
let flag=true; function getTarget(){ if(flag){ return ( <div className="box"> 我是box元素...... </div> ) }else{ return ( <div className="fox"> 我是fox元素 </div> ) } } const element=( <React.Fragment> {getTarget()} </React.Fragment> );
上述代码中定义了一个名为getTarget的函数,该函数内部使用if断定flag变量的值,而后利用return语句将须要的JSX元素返回出去。在React.Fragment标记对中只须要使用{getTarget()}调用该函数便可。
本文是React系列教程的第二篇文章,主要为你们讲解了React框架中JSX语法的书写格式。系统的学会了JSX语法的书写格式,对于编写复杂的React项目有很大的帮助。明天会为你们系统的讲解React组件的使用方法。
小海前端,具备18年Web项目开发和先后台培训经验,在前端领域著有较为系统的培训教材,对Vue.js、微信小程序开发、uniApp、React等全栈开发领域都有较为深的造诣。入住Segmentfault,但愿可以更多的结识Web开发领域的同仁,将Web开发大力的进行普及。同时也愿意与你们进行深刻的技术研讨和商业合做。