[TOC]
### 1\. useState()
* **React内置自带函数**,在Bigfish中导入方式:import { useState } from '@alipay/bigfish/react';
* **接收一个参数**:可以是任意值,如果函数必须要有返回值
* **使用场景**:代替state使用的,如:每个页面、model等
* **demo**:\[name,setName\]=useState('tong')
* **demo2**:\[name,setName\]=useState(()=>'tong')
~~~
import { Button, message } from 'antd';
import React, { useState, useEffect } from 'react';
const COLORS = ['red', 'orange', 'blue'];
const App = () => {
const [state, setState] = useState({count: 0, color: 'red'});
message.info('render');
return (
<div>
<div style={{color: state.color}}>{state.count}</div>
<Button
onClick={()=>setState(s=>({...s, count: s.count + 1, color: COLORS[(s.count + 1) % 3]}))}
>
add
</Button>
</div>
)
}
ReactDOM.render(<App />, mountNode);import { Button, message } from 'antd';
import React, { useState, useEffect } from 'react';
const COLORS = ['red', 'orange', 'blue'];
const App = () => {
const [state, setState] = useState({count: 0, color: 'red'});
message.info('render');
return (
<div>
<div style={{color: state.color}}>{state.count}</div>
<Button
onClick={()=>setState(s=>({...s, count: s.count + 1, color: COLORS[(s.count + 1) % 3]}))}
>
add
</Button>
</div>
)
}
ReactDOM.render(<App />, mountNode);
~~~
### 2. useReducer() 当前操作有不同的返回结果的情况下使用
~~~
import { Button, message } from 'antd';
import React, { useReducer } from 'react';
const COLORS = ['red', 'orange', 'blue'];
const initState = {count:0, color: 'red'};
const reducer = (state, action) => {
switch (action.type) {
case 'add':
const count = state.count + 1;
const color = COLORS[count % 3];
return {...state, count, color};
default:
throw new Error();
}
}
const App = () => {
const [state, dispatch] = useReducer(reducer, initState);
message.info('render');
return (
<div>
<div style={{color: state.color}}>{state.count}</div>
<Button
onClick={()=>{dispatch({type: 'add'})}}
>
add
</Button>
</div>
)
}
ReactDOM.render(<App />, mountNode);
~~~
### 2\. useEffect()
* **React内置自带函数**,在Bigfish中导入方式:import { useEffect } from '@alipay/bigfish/react';
* **接收两个参数**,第一个参数:回调函数()=>{},第二个参数:可选参数:\[\]
* **使用场景**:代替部分(componentDidMount()、componentDidUpdate()、componentWillUnmount())生命周期使用
* **使用方式**: useEffect 接收两个参数,第一个是必传的 callback,第二个是选传的 dependencies, 类型为**列表**。例如 \[a, b\]。可以理解为,每当 dependencies 中的一个或多个元素发生改变时,都会去执行一遍callback. 第二个参数表示监听某些值变化才会执行return函数也就是callback函数
* **两个特殊情况是**:
**1.deps 为空列表 \[\], 则 callback 只会在组件 mount 时被执行。**
**2.不传入 \[\]参数,则每当 state 或者 props 发生变化(组件重新渲染)时,callback 都会被执行。**
* **demo:**
~~~
useEffect(()=>{
const timer = window.setInterval(()=>{console.log(a)}, 1000);
return () => window.clearInterval(timer);
}, [a])
~~~
### 3\. useModel()
* **Bigfish内置函数,react里不存在**,在Bigfish中导入方式:import { useState } from '@alipay/bigfish';
* **接收一个参数**:类型为字符串,为model下的文件夹名称
* **使用场景**:获取model中使用useState定义的数据
* **注意:**model文件有格式要求
~~~
import { useState } from '@alipay/bigfish/react';
const useUser = () => {
const [name, setName] = useState<string>(DEFAULT_NAME);
const [hookdata, setHookdata] = useState<string>('初始值');
return {
name,
setName,
hookdata,
setHookdata
};
};
export default useUser;
~~~
* **demo**:
~~~
const { name } = useModel('global');
~~~
### 4\. useRequest()
* **Bigfish内置函数,react里不存在**,在Bigfish中导入方式:import { useRequest } from '@alipay/bigfish';
* **接收两个参数**,第一个参数:回调函数()=>{},**需要返回一个 Promise**
* **使用场景**:使用数据请求
* **说明:相当于在****componentDidMount()生命周期中**
* **demo:**
~~~
const { data } = useRequest(() => {
return services.UserController.queryUserList({});
});
~~~
### 5\. useCollback()
* **React内置自带函数**,在Bigfish中导入方式:import { useCollback } from '@alipay/bigfish/react';
* **接收两个参数**,第一个参数:函数()=>{},第二个参数:\[\]。只有当 \[\]中的值发生变化时,collback 才会重新执行,并把 callback 的返回值传递给变量
* 使用场景:父子组件直接避免重复更新问题,在传递是是**函数**的情况下使用
* **优点:**useCallback包裹的函数,相当于对函数做了缓存,当父组件重新渲染时,函数不会重新定义==》子组件不会重新渲染
* **说明:**可以确保在每次重新渲染后,函数的引用地址保持不变
### 6\. useMome()
* **React内置自带函数**,在Bigfish中导入方式:import { useMome } from '@alipay/bigfish/react';
* **接收两个参数**,第一个参数:函数()=>{},第二个参数:\[\]。只有当 \[\]中的值发生变化时,memo 才会重新执行,并把 callback 的返回值传递给变量。如果 useMemo 的 第二个参数传入了一个空列表\[\], 那么这一函数只会在组件初始化的时候被执行。
* **优点:**useMemo包裹的变量,相当于对变量做了缓存,当父组件重新渲染时,变量不会改变==》子组件不会重新渲染
* 使用场景:父子组件直接避免重复更新问题,在传递是是**变量**的情况下使用
* **说明:**为了解决**变量**被回收和重建的问题。用来做性能优化的避免父子组件的其他方法执行
~~~
useMome(()=>{
const timer = window.setInterval(()=>{console.log(a)}, 1000);
}, [a])
~~~
### 7\. 自定义hook函数(就是分装一些功能)
~~~
// 实时监测浏览器窗口大小的Hooks函数
import React,{ useState ,useEffect ,useCallback } from 'react';
const useWinSize = () =>{
const [size,setSize] = useState({
width:document.documentElement.clientWidth,
height:document.documentElement.clientHeight
})
//useCallback,目的是为了缓存方法(useMemo是为了缓存变量)
const onResize = useCallback(() => {
setSize({
width: document.documentElement.clientWidth,
height: document.documentElement.clientHeight
})
},[])
useEffect(()=>{
window.addEventListener('resize',onResize)
return ()=>{
window.removeEventListener('resize',onResize)
}
},[])
return size
}
//组件中使用
const MyHooks = ()=>{
const size = useWinSize()
return <div>size:{size.width}x{size.height}</div>
}
export default MyHooks
~~~
- 第一章 起步
- 第1节 创建react项目
- 第2节 hello world
- 第3节 数据绑定+事件处理
- 3.1 for循环事件处理中的传参写法、条件渲染
- 第4章 点击切换文字
- 第5章 使用html写react
- 第二章 运用
- 第1节 循环
- 第2节 实现一个简单的TodoList
- 第2.1节 删除
- 第3节 父子组件传参
- 1. 父组件向子组件传参
- 2. 子组件向父组件传参
- 第4节 react-router实现一个简单路由
- 第5节 生命周期
- 第6节 取数据
- 第 7节 获取dom节点
- 第8节 双向数据绑定
- 第三章 redux
- 第1节 介绍
- 第2节 安装redux
- 第3节 使用
- 3.1 action
- 3.2 使用redux实现 todolist
- 第4节封装redux中的action
- 第5节 redux-thunk中间件
- 5.1介绍
- 5.2使用
- 第四章 ant-design前端ui
- 第一节 安装
- 第2节 使用
- 2.1 ant-design实现todoList增删功能
- 第3节 使用整理
- 第五章 vue和react的比较
- 第六章 dva.js轻量级应用框架
- 第1节 介绍
- 第2节 安装dva
- 第3节 页面跳转
- 1. 事件路由跳转
- 2. 通过路由跳转
- 第4节 组件之间通信
- 1. 父组件向子组件传参
- 2. 子组件向父组件传参
- 第5节 事件处理
- 第6节 发送请求
- 1. 通过路由判断页面渲染数据
- 2. 通过事件发送请求
- 第7节 运用
- 1. TodoList
- 1.添加数据
- 1.2输入框敲回车触发事件
- 2.删除数据
- 3. 总结
- 第8节 配合antd使用
- 1. 引入antd
- 2.dva 使用antd注意事项
- 3. 知识点整理
- 第七章 dva后台项目实战
- 第1节 登录加密
- 1.具体实现
- 第2节 知识点
- 第3节 树结构
- 第八章 react新特性 hooks
- 第1节 hooks介绍
- 第2节 useState的使用
- 第3节 useEffect的使用
- 第4节 dva+antd+hooks企业后台项目开发流程
- 第 5节 hooks 使用
- 运用
- 第6节 hook整理
- 第7节 react memo
- 第九章 react中使用Echarts
- 知识点
- react中使用mobx
- 知识点
- react中使用rem
- 递归实现目录数
- react使用图表
- react 同步更新策略
- antd tree默认展开无效
- ts中lint修复篇
- React-query方案
- 高阶组件