React学习
官网:
https://reactjs.org/
https://zh-hans.reactjs.org/
https://beta.reactjs.org/
3 简介
- 声明式UI。命名式类似于函数。
- 组件化
- 夸平台支持比较好
4 基础环境搭建
- 先安装 nodejs https://nodejs.org/en
- 再下载一个简单的react项目 npx create-react-app react-basic
5 目录
核心包
"react": "^18.2.0",
"react-dom": "^18.2.0",
7 jsx 基础
写前端,先写html。javascript xml。比较简单,又能有js的功能。
融合了 js 和 html 的语法。
机器编译成了 js格式。
8 jsx 表达式使用
{js表达式}
const name = 'ni hao'
<h1>{name}</h1>
9 jsx 列表渲染
const songs = [ {id: 1, name: 'A'}, {id: 2, name: 'B'}, {id: 3, name: 'C'}, ] function App() { return ( <div className="App"> <ul> {songs.map(song => <li key={song.id}>{song.name}</li>)} </ul> </div> ); } export default App;
10 条件渲染
三元表达式(常用)
const flag = true function App() { return ( <div className="App"> {flag ? <span>WN</span> : null} </div> ); } export default App;
条件运算
const flag = true function App() { return ( <div className="App"> {true && <div> no </div>} </div> ); } export default App;
11 jsp 模板精简原则
模板中逻辑尽量精简。
复杂多分枝逻辑 收敛为一个函数 通过一个函数来写分枝逻辑 模板中负责调用
const getHtag = (x) => { if (x === 1) return <h1> x1</h1> else return <h1>x else</h1> } function App() { return ( <div className="App"> {getHtag(1)} </div> ); } export default App;
12 JSP 样式控制
1)行内样式
在元素身上绑定一个style 属性即可
const style = { color: 'blue', fontSize: '30px' } function App() { return ( <div className="App"> <span style={style}>this is span</span> </div> ); } export default App;
2)类名样式 (常用)
在元素身上绑定一个 className
import './app.css' function App() { return ( <div className="App"> <span className='active'>this is span</span> </div> ); } export default App;
13 jsx 动态类名
import './app.css' const flag = true function App() { return ( <div className="App"> <span className={flag ? 'active' : ''}>this is span</span> </div> ); } export default App;
14 jsx 注意事项
- jsx必须要有个根节点。
- 所有标签必须闭合
- jsx语法更贴近js
- jsx支持换行,需使用()包裹,防止bug
15 开发工具和格式化代码
安装插件。
17 组件
把小功能抽离,再组装。
18 函数组件的创建和渲染
function Hello() { return <div>hello</div> } function App() { return ( <div className="App"> <Hello></Hello> </div> ); } export default App;
- 组件名称必须大写
- 函数组件必须要有返回值
19 类组件的创建和渲染
import React from "react"; class HelloComponent extends React.Component { render() { return <div>This is from a class</div> } } function App() { return ( <div className="App"> <HelloComponent></HelloComponent> </div> ); } export default App;
用法和函数组件差不多,必须 extends React.Component
20 事件绑定
on + 事件名称 = {事件处理程序}
import React from "react";
function Hello() {
const clickHandler = () => {
console.log('click handler')
}
return <div onClick={clickHandler}>Hello</div>
}
class HelloComponent extends React.Component {
//标准写法
clickHandler = () => {
console.log('click handler')
}
render() {
return <div onClick={this.clickHandler}>This is from a class</div>
}
}
function App() {
return (
<div className="App">
<Hello/>
<HelloComponent/>
</div>
);
}
export default App;
function Hello() {
const clickHandler = () => {
console.log('click handler')
}
return <div onClick={clickHandler}>Hello</div>
}
class HelloComponent extends React.Component {
//标准写法
clickHandler = () => {
console.log('click handler')
}
render() {
return <div onClick={this.clickHandler}>This is from a class</div>
}
}
function App() {
return (
<div className="App">
<Hello/>
<HelloComponent/>
</div>
);
}
export default App;
21 事件对象e
import React from "react"; class HelloComponent extends React.Component { //标准写法 clickHandler = (e) => { e.preventDefault() console.log('click handler') } render() { return <div><a onClick={this.clickHandler} href="https://www.baidu.com">百度</a></div> } } function App() { return ( <div className="App"> <HelloComponent/> </div> ); } export default App;
22 组件-事件绑定额外参数
加入事件参数e,如果不加入则删除
import React from "react";
class HelloComponent extends React.Component {
//标准写法
clickHandler = (e, msg) => {
console.log('click handler', e, msg)
}
render() {
return <div onClick={(e) => this.clickHandler(e, 'msg param')}>Hello </div>
}
}
function App() {
return (
<div className="App">
<HelloComponent/>
</div>
);
}
export default App;
class HelloComponent extends React.Component {
//标准写法
clickHandler = (e, msg) => {
console.log('click handler', e, msg)
}
render() {
return <div onClick={(e) => this.clickHandler(e, 'msg param')}>Hello </div>
}
}
function App() {
return (
<div className="App">
<HelloComponent/>
</div>
);
}
export default App;
23 组件状态
类组件状态:使用state,如果要修改使用setState
24 this 指向问题说明
在类中无法使用this,如果非要使用,使用bind绑定
或者使用箭头函数
29 组件不可变状态说明
- 数字可以直接+1
- 数组,拿原值,再操作
- 对象同上
30 受控组件
input状态被React组件状态控制
- 在组件的state声明一个组件状态数据
- 将状态数据设置成input标签元素的value属性的值
- 为input添加change事件
- 通过e获取input的值
- 调用setState更改值
31 tab切换实现
使用state状态记录一个值
37 组件通信
各组件数据交互就是组件通信
父子关系。最重要
38 父传子
- 父组件提供数据state
- 给自组件中添加数据的值为state中的值
- 子组件通过props接受父组件的值 (类中使用 this.props 获取 props, 函数中用 props
39 父传子 props说明
props是单向传递,只读
props可以传递任何数据
40 props的解构
就是参数分开写
class 组件自身的问题
44 跨组件通信context
用provider 和consumer
60 hook
组件状态逻辑复用问题
class 问题
谢谢!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
2019-04-02 Flink学习(三)状态机制于容错机制,State与CheckPoint