React.createElement的格式:
React.createElement(‘标签名’,{标签上的属性1:值1},子元素1,子元素2)
// 导入react和react-dom
import React from 'react'
import ReactDOM from 'react-dom'
// 创建元素
const title = React.createElement('h1', {id:'box'}, 'hello react')
// 渲染react元素
ReactDOM.render(title, document.getElementById('root'))
React.createElement的格式 :繁琐不简洁,不直观,无法一眼看出所描述的结构,不优雅,开发体验不好,接下来看看JSX穿件组件
JSX:是 JavaScript XML的缩写。
理解:我们之前用html写页面,现在是用jsx来写页面
jsx示例:
// 导入react和react-dom
import React from 'react'
import ReactDOM from 'react-dom'
// jsx创建元素
const list = <ul><li>html</li><li>js</li><li>css</li><ul>
// 渲染react元素
ReactDOM.render(list, document.getElementById('root'))
优势:
掌握JSX的5个注意事项
虚拟根节点:<> xxx >
import ReactDOM from 'react-dom'
const title = <> Hello React
p标签
>
ReactDOM.render(title, document.querySelector('#root'))
有两种格式:
import ReactDOM from 'react-dom'
const title = <React.Fragment> <h1>Hello React</h1><p>p标签</p> </React.Fragment>>
ReactDOM.render(title, document.querySelector('#root'))
例如class, for
—
理解引入react的作用(提供createElement的功能)
老版本中不引入就会报错React must be in scope when using JSX
{ JS 表达式 }
例如:
import ReactDOM from 'react-dom'
const num = Math.random()
const title = (<div>
随机值:{ num }
</div>)
ReactDOM.render(title, document.querySelector('#root'))
大括号是一种特殊的语法,让 JSX 解析器知道它需要将它们之间的内容解释为 JavaScript代码 而不是字符串
作用:执行{}内部的代码,并输出结果。
const logo = 'https://create-react-app.dev/img/logo.svg'
<img width="80" src={logo} />
const name = '小芳'
<div>{name}</div>
可以写
不可以写
if/else
简单情况-用三元表达式
const flag = 0
const content = (<div>{flag ? '达成' : '没有达成'}</div>)
简单情况-用逻辑与
const isLogin = true
const content = (<div>{ isLogin && '您登录了'}</div>)
复杂情况-使用额外的函数
const loadData = (isLoading) => {
if (isLoading) {
return <div>数据加载中,请稍后...</div>
} else {
return <div>数据加载完成,此处显示加载后的数据</div>
}
}
const content = <div>{loadData(true)}</div>
从后端取回来的数据保存在数组中,需要用列表展示。这里的数组如下:
const skills = [
{ id: 1, name: 'html' },
{ id: 2, name: 'css' },
{ id: 3, name: 'js' }
]
我们要生成的dom结构如下:
<ul>
<ol>技能1:htmlol>
<ol>技能2:cssol>
<ol>技能3:jsol>
ul>
如何实现呢?
直接定义一个数组,每个元素都是一个jsx结构
const skills = [<ol>技能1:html</ol>, <ol>技能2: css</ol>, <ol>技能3: js</ol>]
const content = <ul>{skills}</ul>
ReactDOM.render(content, document.getElementById('root'))
完整格式
// 完整格式
const t = skills.map(function(item) {
return <ol>技能{item.id}: {item.name}</ol>
})
const list = <ul>{t}</ul>
简写格式
const list = (
<ul>
{skills.map(item => <ol>技能{item.id}: {item.name}</ol>)}
</ul>
)
React 内部用来进行性能优化时使用的,在最终的HTML结构中是看不到的。
例如,数据如下
const songs = [
{ id: 1, name: '痴心绝对' },
{ id: 2, name: '像我这样的人' },
{ id: 3, name: '南山南' }
{ id:4, name: 'abc'}
]
生成的dom
<ul>
<li>排名:1 - 歌名:痴心绝对li>
<li>排名:2 - 歌名:想我这样的人li>
<li>排名:3 - 歌名:南山南li>
ul>
如果添加一条数据,则视图也要随之更新,而更新的逻辑是:前三条正常保留,而重新添加第四条。