JSX是JavaScript XML的简写,表示在JavaScript代码中写XML(HTML)格式的代码
优势:声明式语法更加直观、与HTML结构相同、降低学习成本、提升开发效率
const title = <h1>Hello jsx</h1>
ReactDOM.render(title,document.getElementById('root'))
JSX 不是标准的ECMAScript,它是ECMAScript的语法扩展。
需要使用babel编译后,才能在浏览器环境中使用。
create-react-app脚手架中已经默认有该配置,无需手动配置。
编译JSX语法的包为:@babel/preset-react。
问题:什么是 Babel?
Babel是一个工具链,主要用于将采用ECMAScript 2015+ 语法编写的代码 转换为向后兼容的JavaScript语法,以便能运行在当前和旧版本的浏览器或其他环境中。
作用:
JSX 与 React
Babel用于转换JSX语法
安装React preset
npm install --save-dev @babel/preset-react
并将 @babel/preset-react 添加到你的 Babel 配置文件中。
想深入了解babel请移驾
const dv = (
<div> Hello JSX </div>
)
const name = "jack";
const div = (
<div>姓名:{name}</div>
)
<p>{1}</p>
<p>{"ssss"}</p>
<p>{1+7}</p>
<p>{2>5?'大于':'小于等于'}
const sayHi = ()=> 'Hi~'
<p>{sayHi()}</p>
{dv:"sss"} // 不正确
const h1 = <h1>I am JSX</h1>
const div = (
<div>{h1}</div>
)
{if(true){}}
{for(var i=0;i<10;i++){}}
场景:loading效果
条件渲染:根据条件渲染特定的JSX结构。 有三种方式 如下:
// ES6 中模块化语法
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
/**
* 条件渲染
*/
const isLoading = false;
const loadData = ()=>{
if(isLoading){
return <div>loading....</div>
}
return <div>加载完成</div>
}
const title = (
<h1>
{loadData()}
</h1>
)
ReactDOM.render(title,document.getElementById('root'))
const loadData = ()=>{
return isLoading ? (<div>loading.....</div>):(<div>加载完成</div>)
// 小括号不是必须的 只是为了看着更明了
}
const loadData = ()=>{
return isLoading && (<div>loading.....</div>)
}
如果要渲染一组数据,应该使用map()方法
// ES6 中模块化语法
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
/**
* 条件渲染
*/
const songs = [
{id:1,name:'adv'},
{id:2,name:'sdf'},
{id:3,name:'dfs'},
]
const title = (
<ul>
{
songs.map((item,index)=>{
return(
<li key={index}>{item.name}</li>
) // 需要有返回值 因为是标签 需要使用小括号包上
}
)
}
</ul>
)
ReactDOM.render(title,document.getElementById('root'))
问题一:箭头函数return
上面的map也可写成:
songs.map((item,index)=>
<li key={index}>{item.name}</li>
)
简写体:只需要一个表达式,并附加一个隐式的返回值
var func = x => x * x;
块体:必须明确return语句
var func = (x,y)=>{return x + y}
var func = ()
=> 1;
// SyntaxError: expected expression, got '=>'
但是在 => 之后换行 或者用 ( )、{ }来实现换行
var func = (a,b,c) =>(
1
);
var func = (a,b,c) => {
return 1
}
var func = (
a,
b,
c
)=>1;
问题二:map()函数的参数
map(映射)即原数组被“映射”成新的数组 。为一个回调函数,数组中的每个元素都会执行这个函数。
三个参数
function(currentValue,index,arr)
问题三: 遍历生成的元素 key必须做到唯一
<h1 style={{color:'red'}}>
</h1>
不推荐使用,因为使样式和结构代码过于耦合
先引入css文件(scss文件也可以)
import './index.css';
<h1 className="title">
JSX
</h1>