1、react的创建
创建一个 React 应用 – React 中文文档 npx create-react-app name
进入根目录npm strat
2、jsx的本质
Babel官网 使用BABEL把H5转化为js代码
const count = 100000;
function test() {
return 'jjjaaaccckkk'
}
function App() {
return (
<div className="App">
红红火火恍恍惚惚
{'this is a test'}
{count}
{test()}<br/>
{new Date().getDate()}
<div style={{color:'red'}}>啦啦啦啦啦啦啦</div>
</div>
);
}
export default App;
3、if条件语句的使用
const isLogin = 1;
function Login(){
if(isLogin === 1){
return <div>登录成功</div>
}else if (isLogin === 0){
return <div>请登录</div>
} else{
return <div>请登录</div>
}
}
function App() {
return (
<div className="App">
{Login()}
</div>
);
}
export default App;
4、基础事件绑定
function App() {
const Login = (name,e) => {
console.log('点击了按钮',name,'+++++',e.target);
}
return (
<div className="App">
<button onClick={(e) => Login('zhangsan',e)}>jhhhhhh</button>
</div>
);
}
export default App;
5、react组件基本使用
1、写在一个js中
function Test(){
return <button>按钮</button>
}
function App() {
return (
<div className="App">
<Test></Test>
</div>
);
}
export default App;
6、useState双向绑定数据,相当于vue的v-model
import { useState } from 'react'
import { useState } from "react";
function App() {
const [count, setCount] = useState(0)
// 绑定的数据 改变数据的函数
const handleClick = () => {
//不能直接count++,要替换而不是修改
setCount(count + 1)
}
return (
<div>
<button onClick={handleClick}>{count}</button>
</div>
);
}
export default App;
复杂类型
function App() {
const [from, setFrom] = useState({name: 'tom', age: 20})
// 绑定的数据 改变数据的函数
const handleClick = () => {
setFrom(
{
...from,
name: 'jerry',
}
)
}
return (
<div>
<button onClick={handleClick}>{from.name}</button>
</div>
);
}
7、react的样式,类名使用className='name'
import './index.css';//引入外部css
const style = {
color:"red",
fontSize:"80px"
}
function App() {
return (
<div>
<span style={style}> hello</span>
<div className='foo'>哈哈哈哈</div>
</div>
);
}
export default App;
8、JS库Loadsh的使用
Lodash 简介 | Lodash中文文档 | Lodash中文网
yarn add loadsh
导入
import lodash from 'lodash'
9、(了解)JS库classnames切换类名控制
yarn add classnames按照命令
// className={`nav-item ${type === item.type && 'active' }`}
className={classNames('nav-item', { active: type === item.type })}
10、受控组件绑定及使用useState实现输入框,输入及更改双向绑定
import {useState} from 'react';
function App() {
const [count, setCount] = useState('');
return (
<div>
<input
value={count}
onChange={e => setCount(e.target.value)}
type='text'
></input>
</div>
);
}
export default App;
11、在React中获取DOM
import {useRef} from 'react'
function App() {
const inputRef = useRef(null)
const showDom = () => {
console.dir(inputRef.current)
}
return (
<div>
<input
type='text'
ref={inputRef}
></input>
<button onClick={showDom}>获取DOM</button>
</div>
);
}
export default App;
12、uuid生成随机数,dayjs以当前时间为标准生成固定格式
//安装
yarn add ~~
//引入
import {v4 as uuidV4} from 'uuid'
import dayjs from 'dayjs'
//使用
rpid: uuidV4(),
ctime: dayjs(new Date()).format('MM-DD hh:mm'),
13、组件通讯
1、父传子
props是只读数据,不允许直接修改props中的数据
function Son (props) {
return (
<div>
this is son {props.name}
</div>
);
}
function App() {
const name = "this is App"
const age = 18
return (
<div>
<Son name={name} age={age} />
</div>
);
}
export default App;
2、父传子特殊的children属性
function Son (props) {
return (
<div>
this is son ,{props.children}
</div>
);
}
function App() {
return (
<div>
<Son >
<div>
this is son son
</div>
</Son>
</div>
);
}
export default App;
3、子传父
4、兄弟组件传值,借助父组件,还是父子通信
import { useState } from 'react';
function Son ({onGet} ) {
const name = '1111111111111111111111';
return (
<div>
111111111111111111111
<button onClick={() => {onGet(name)}}>点击</button>
</div>
);
}
function Son22(props) {
return (
<div>
2222222222222222222222 ,,,{props.name}
</div>
);
}
function App() {
const [name, setName] = useState('');
const getAname = (name) => {
console.log(name);
setName(name);
}
return (
<div>
<Son onGet={getAname}></Son>
<Son22 name={name}></Son22>
</div>
);
}
export default App;
5、使用Context机制跨层级组件通信,挂载在顶层组件上
import { createContext, useContext } from "react";
const MyContext = createContext();
function A () {
return (
<div>
<h1>Hello World</h1>
<B></B>
</div>
);
}
function B () {
const mas = useContext(MyContext);
return (
<div>
<h1>{mas}</h1>
<h1>BBBBBBBBBBBBBB</h1>
</div>
);
}
function App() {
const mas = 'llllllllllllllllllllllllll'
return (
<div>
<MyContext.Provider value={mas}>
zzzzzzzzzzzzzzzzzzzz
<A></A>
</MyContext.Provider>
</div>
);
}
export default App;
14、useEffect的基础使用,用于发送AJAX请求,更新DOM列表数据
依赖项变化就会引发,副作用函数
import { useEffect,useState } from "react";
const URL = "https://geek.itheima.net/v1_0/channels";
function App() {
const [list, setList] = useState([]);
useEffect(() => {
async function getList() {
const res = await fetch(URL);
const list = await res.json();
setList(list.data.channels)
}
getList()
}, [])
return (
<div>
{list.map((item) => {
return (
<li key={item.id}>{item.name}</li>
);
}
)}
</div>
);
}
export default App;
15、useEffect[ ]依赖项的更改,类似vue生命周期
16、卸载时触发,清除useEffect副作用
import { useEffect,useState } from "react";
function Son(){
useEffect(() => {
const timer = setInterval(() => {
console.log('子组件定时器')
},1000)
return () => {
console.log('子组件销毁')
clearInterval(timer)
}
},[])
return (
<div>
son
</div>
)
}
function App() {
const [show,setShow] = useState(true)
return (
<div>
{show && <Son />}
<button onClick={() => setShow(!show)}>按钮</button>
</div>
);
}
export default App;
17、自定义Hook函数就是需要服用的函数,及以use打头的函数
import { useState } from "react";
function useToggle(initialValue) {
const [show,setShow] = useState(true)
const taggle = () => setShow(!show)
return {
show,
taggle
}
}
function App() {
const {show,taggle} = useToggle(true)
return (
<div>
{show && 'hhhhhhhhhhhhhhhhhhh'}
<button onClick={taggle}>按钮</button>
</div>
);
}
export default App;
18、ReactHooks函数使用规则
1、不可以在组件外使用 2、if for 组件内部函数不可使用
19、本地服务,yarn add json-server -D
"serve": "json-server db.json --port 3004"
20、Redux集中状态管理工具,可以独立于框架运行
21、redux插件的安装yarn add @reduxjs/toolkit react-redux
yarn add @reduxjs/toolkit react-redux
22、redux使用
注入到跟组件中
在组件中使用
23、redux传参
1、先在counterStore中定义,action.payload固定用法传参
2、在组件中使用
24、异步操作
25、reactRoute路由的学习
yarn add react-router-dom安装项目包 Picking a Mode | React Router 四部配置
26、路由传参,导航栏传参
<button onClick={() => navigate("/article?id=1001&name=jack")}>跳转传参</button>
27、嵌套路由
28、配置404页面
29、路由模式
30、别名路径配置,把@/解析为src/
"配置三个文件"
//craco.config.js
const path = require('path');
module.exports = {
webpack: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
};
//package.json修改webpake的配置
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
//jsconfig.json这是vscode的联想提示配置
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"]
}
}
}
31、mock数据,前端数据接口模拟
32、Ant Design 组件使用
组件总览 - Ant Design TabBar 标签栏 - Ant Design Mobile
"主题色配置"
33、dayjs的使用
dayjs( new Date()).format('YYYY-MM')
34、scss安装学习
yarn add sass -D把scss安装在测试环境
35、antD学习
不要死记命令,记得看文档
yarn add antd 安装依赖包 组件总览 - Ant Design
36、token持久化
const userSlice = createSlice({
name:'user',
initialState: {
token: localStorage.getItem('token') || '',
},
reducers:{
setToken(state, action) {
state.token = action.payload;
localStorage.setItem('token', action.payload)
}
}
})
37、添加token到请求头
// 添加请求拦截器
request.interceptors.request.use((config) => {
//添加请求头
const token = getToken()
if (token) {
config.headers.Authorization = `Bearer ${token}`
前端要求写法 后端要求写法
}
return config
}, (error) => {
return Promise.reject(error)
})
38、根据token控制路由的跳转
import { getToken } from "@/utils";
import { Navigate } from "react-router-dom";
export function AuthRoute ({ children }){
const token = getToken()
if(token){
return <>{children}</>
}else{
return <Navigate to={'/login'} replace />
}
}
39、样式reset(重置)
样式reset
npm install normalize.css
在index.js中进行初始化import 'normalize.css'
html,
body {
margin: 0;
height: 100%;
}
#root {
height: 100%;
}
40、获取当前路由,钩子useLocation()
使用钩子useLocation()
const location = useLocation()
console.log(location.pathname)
41、useSelector()从redux中获取数据
const dispatch = useDispatch()
useEffect(() => {
dispatch(fetchUserInfo())
},[dispatch])
const name = useSelector(state => state.user.userInfo.name)
42、useDispatch()获取 Redux store 的 dispatch 方法
useDispatch() 是 React-Redux 提供的一个 Hook,用于在函数组件中获取 Redux store 的 dispatch 方法,从而允许你派发 action 来更新 Redux store 的状态。
43、处理token失效以及401跳转登入页
44、在react中使用第三方Echarts基础图表插件
import * as echarts from 'echarts';
import { useEffect, useRef } from 'react';
//柱状图
const BarChart = ({title}) => {
const chart = useRef(null)
useEffect(() => {
//1、获取渲染的节点
const chartDom = chart.current
//2、图表初始化生成示例对象
var myChart = echarts.init(chartDom);
//3、准备图表参数
const option = {
title:{
text: title
},
xAxis: {
type: 'category',
data: ['vue','react','Angular']
},
yAxis: {
type: 'value'
},
series: [
{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar'
}
]
};
//4、使用图表参数完成图表的渲染
option && myChart.setOption(option);
}, [title])
return <div ref={chart} style={{width: '500px', height: '400px'}}></div>
}
export default BarChart
45、富文本编辑器react-quill
npm i react-quill@2.0.0-beta.2
import ReactQuill from 'react-quill'
import 'react-quill/dist/quill.snow.css'
const Publish = () => {
return (
// ...
<Form
labelCol={{ span: 4 }}
wrapperCol={{ span: 16 }}
>
<Form.Item
label="内容"
name="content"
rules={[{ required: true, message: '请输入文章内容' }]}
>
<ReactQuill
className="publish-quill"
theme="snow"
placeholder="请输入文章内容"
/>
</Form.Item>
</Form>
)
}
安装后如果出现两个把严格模式关了即可
46、自定义hooks函数
47、Popconfirm气泡确认框
48、项目打包和本地预览
49、打包优化-配置路由懒加载
50、打包优化-包体积分析
通过可视化的方式,直观的体现项目中各种打包后的体积大小,方便优化