# ReactHooks_learn
**Repository Path**: yzuxqz/ReactHooks_learn
## Basic Information
- **Project Name**: ReactHooks_learn
- **Description**: study from jspang.com
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-11-16
- **Last Updated**: 2021-11-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## useState
```jsx
import React, { useState } from 'react';
function Example() {
// 声明一个叫 "count" 的 state 变量
const [count, setCount] = useState(0);
return (
You clicked {count} times
);
}
```
## useEffect
```jsx
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
return (
You clicked {count} times
);
}
```
- useEffect如果第二个参数不写,相当于class中的componentDidMounted和componentDidUpdate
```jsx
useEffect(() => {
document.title = `You clicked ${count} times`;
});
```
- 返回一个函数,相当于componentWillUnMounted
```jsx
useEffect(() => {
console.log(count)
return ()=>{
console.log('离开')
}
})
```
- 第二个参数表示要根据哪些状态的改变而去重新渲染,如果为空数组,则无论什么状态改变都不会调用effect
```jsx
useEffect(() => {
console.log(count)
return ()=>{
console.log('离开')
}
},[])
```
- 数组中有哪些值,就会随着这些状态的改变而重新执行副作用
```jsx
useEffect(() => {
console.log(count)
return ()=>{
console.log('离开')
}
},[count])//只有count变化了才会调用effect中的函数
```
## useContext
```jsx
import React ,{useState,createContext,useContext} from 'react'
const CountContext = createContext({})//1
function Counter() {
let {count} = useContext(CountContext)//3
return {count}
}
function Context() {
const [count,setCount] = useState(0)
return(
{count}
//2如果初始值为对象,这里要写成对象的形式
)
}
export default Context
```
- 父组件创建context
- 在父组件中包裹子组件
```jsx
```
- 子组件中使用useContext获取父组件中传递的数据
## memo
## useMemo
## useCallback
https://blog.csdn.net/fedlover/article/details/103347989?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control
记忆函数
## useReducer
和useContxt结合可以实现redux的效果,但是不建议使用,使用useDispatch和useSlelector来使用redux
## useRef
- 相当于class中的createRef()
```jsx
import React ,{useRef}from 'react'
function Ref() {
const textRef= useRef(null)
return(
)
}
export default Ref
```
## useDispatch
- 用于结合redux使用
- 首先创建redux的store,action,reducer。并在外层容器包裹provider传递store
- 在需要使用dispatch发布action时
```jsx
import React from 'react'
import {useDispatch} from 'react-redux'
import {createChangeColorAction} from "./redux/action";
function ChangeColor() {
const dispatch = useDispatch()
return (
)
}
export default ChangeColor
```
## useSelector
- 需要使用store中的state时
```jsx
import React, {createContext} from 'react'
import {useSelector} from "react-redux";
export const ColorContext = createContext({})
export const Color = (props) => {
const color = useSelector(state=>state.color)
return (
{props.children}
)
}
```
## 自定义hooks
- 动态获取浏览器窗口大小的hooks
```jsx
import React,{useState,useEffect,useCallback} from 'react'
function useWinSize() {
const [width,setWidth] = useState(document.body.clientWidth)
const [height,setHeight] = useState(document.body.clientWidth)
const reSize=useCallback(()=> {
setWidth(document.body.clientWidth)
setHeight(document.body.clientHeight)
},[])
useEffect(()=>{
window.addEventListener('resize',reSize)
return ()=>{
window.removeEventListener('resize',reSize)
}
},[])
return ({width,height})
}
export default function UseWinSize() {
const {width,height} = useWinSize()
return(
{width}
{height}
)
}
```