react简述

1.1、概述

React 起源于Facebook的内部项目,它是一个用于构建用户界面的 javascript
库,Facebook用它来架设公司的Instagram网站,并于2013年5月开源。 React
拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。认为它可能是将来 Web 开发的主流工具之一。
React18是2022年3月29日正式发布,现在来说还是比较的新。

1.2、特点

💖声明式

  • 你只需要描述UI看起来是什么样式,就跟写HTML一样,React负责渲染UI,数据的声明

💖基于组件

  • 构建管理自身状态的封装组件,然后对其组合以构成复杂的 UI。由于组件逻辑使用 JavaScript
    编写而非模板,因此你可以轻松地在应用中传递数据,并保持状态与 DOM 分离。

💖学习一次,随处使用

  • 使用React可以开发Web应用(react-dom)也可以开发移动端(react-native)和小程序。

jsx语法

特点

ast=》虚拟dom=》render真实dom

由于通过​​React.createElement()​​​方法创建的React元素有一些问题,代码比较繁琐,结构不直观,无法一眼看出描述的结构,不优雅,开发时写代码很不友好。
React使用 ​​​JSX​​ 来替代常规的JavaScript,JSX 可以理解为的JavaScript语法扩展(超集),它里面的标签申明要符合XML规范要求。


💖jsx浏览器认识吗?
答:浏览器只能识别 js,对于jsx不能识别。


<!-- 1.引入react库文件 核心文件和dom解析文件 引入的顺序不能错 -->
<script src="./js/react.js"></script>
<script src="./js/react-dom.js"></script>
<!-- 引入babel解析 -->
<script src="./js/babel.js"></script>

通过 ​​jsx​​​生成一个虚拟​​dom​

  • jsx浏览不能直接解析 需要一个babel解析器,解析
  • jsx它必须要有一个顶层元素包裹
  • ​const vnode = <div>你好React</div>​
  • 注意如果使用jsx则一定要把type类型修改为text/babel​<script type="text/babel">​
const vnode = (
<div>
<h3>你好React</h3>
<ul>
<li>新闻1</li>
<li>新闻2</li>
</ul>
</div>
)

把react中的虚拟dom转成真实的dom并且挂载到页面根节点中
​​​ReactDOM.render(虚拟dom,容器)​

ReactDOM.render(vnode, document.getElementById('root'))
<div id="root"></div>
<script type="text/babel">
const vnode = (
<div>
<h3>你好React</h3>
<ul>
<li>新闻1</li>
<li>新闻2</li>
</ul>
</div>
)
ReactDOM.render(vnode, document.getElementById('root'))

表达式

嵌入JSX表达式
在jsx语法中,要把JS代码写到​​​{ }​​中,所有标签必须要闭合。

let username = '勇敢牛牛'
const run = ()=>'不怕困难'
let age = 18;
const vnode = (
<div>
{
// 单行注释
/* 多行注释 */
}
{/* 字符串拼接 */}
<div>{'aa' + 'bb' + username}</div>
{/* 运算 */}
<div>{1 + 1}</div>
{/* 调用方法 */}
<div>{run()}</div>
{/* 3目运算,表达式中不能使用 for while if等块语句 3目运算在jsx中使用非常非常多 */}
<div>{age < 18 ? '未成年' : <h3>成年</h3>}</div>
</div>

jsx动态属性

  • ​jsx​​中如果你的属性为一个动态的值,则原来的引号不要写,用单个花括号,花括号中间写表达式
  • 在​​jsx​​​中如果你用​​class​​​定义外部样式名称,则​​class==>className​​,因为class它是js中的关键词,如果有多个​class​​名称,则只能写一个
  • 如果你要对于一个class样式进行开关操作,需要用到3目运算符
  • style 内联样式,在jsx中,只能写对象 或者定义变量为对象传入
  • 表单项中有一个label标签,它有一个for属性,在jsx中换成​​htmlFor​
  • html不转义输出​​dangerouslySetInnerHTML={{__html:html字符串}}​​使用它有一定的安全问题,例如:xss攻击
const vnode = (
<div>
<img src="http://img.1314000.cn/face.png" title={title} />
<div className={'title ' + cname}>{title}</div>
<div className={false ? 'active' : ''}>{title}</div>
<div style={{ color: 'blue', fontSize: '30px' }} >wqewq</div>
<div>
{/*/<label for=""></label>'*/}
<label htmlFor="username">账号:</label>
<input type="text" id='username' />
</div>
{/*const html = '<h3>我是一个标题</h3>'*/}
<div>
{htmll}
</div>
<div dangerouslySetInnerHTML={{ __html: htmll }}></div>
</div>
)

jsx列表渲染

  • 直接展开数组内容
  • 列表渲染 – 就是使用数组方法中的map进行映射就可以
    列表渲染,一定要在顶层元素中添加一个key,为了提升数据比对时的性能dom的diff性能
const users = [
'张三',
'李四',
'王五'
]
========================
<div>{users}</div>
<div>{
users.map(item=>(<li key={item}>{item}</li>))
}</div>