Hook 是 React 16.8 的新增特性。它可让你在不编写 class 的状况下使用 state 以及其余的 React 特性,以及数据状态共享。react
本文仅用于学习过程当中记录!!!数组
useState是react自带的一个hook函数,做用是用来声明状态变量bash
function Example() {
const [count, setCount] = useState(0)
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => {setCount(count+1)}}>Click me</button>
</div>
)
}
复制代码
useEffect代替经常使用生命周期函数,useEffect跟 class 组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 具备相同的用途,只不过被合并成了一个 API,能够比喻为它使得函数组件拥有了“生命周期函数”。ide
function Example() {
const [count, setCount] = useState(0)
useEffect(() => {
console.log(`useEffect => You cliked ${count}`)
return () => {
console.log('==============')
}
}, [count])
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => {setCount(count+1)}}>Click me</button>
</div>
)
}
复制代码
useContext能够帮助咱们跨越组件层级直接传递变量,实现共享,避免一层层的传递状态。函数
它对所包含的组件树提供全局共享数据的学习
const CountContext = createContext()
function Counter() {
let count = useContext(CountContext)
return (<h2>{count}</h2>)
}
function Example() {
const [count, setCount] = useState(0)
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => {setCount(count+1)}}>Click me</button>
<CountContext.Provider value={count}>
<Counter></Counter>
</CountContext.Provider>
</div>
)
}
复制代码
useReducer能够看作是对 useState 作了一层包装,让咱们能够更直观的去管理状态。看下它的使用方法:ui
function ReducerDemo() {
const [count, dispatch] = useReducer((state, action) => {
switch(action.type) {
case 'add':
return state+1
case 'sub':
return state-1
default:
return state
}
}, 0)
return (
<div>
<h2>如今计数是:{count}</h2>
<button onClick={() => {dispatch({
type: 'add'
})}}>Increment</button>
<button onClick={() => {dispatch({
type: 'sub'
})}}>Dcrement</button>
</div>
)
}
复制代码
新建一个reducer,初始化数据、添加数据处理逻辑,经过useContext包裹组件,使得被包裹的组件能够获取数据和dispatch,共享数据为了组件树能获取数据,共享dispatch让组件树能够修改数据状态信息spa
import React, { createContext, useReducer } from 'react';
export const CounterContext = createContext({})
export const ADD_COUNTER = 'ADD_COUNTER'
export const DELETE_COUNTER= 'DELETE_COUNTER'
const reducer = (state, action) => {
switch(action.type) {
case ADD_COUNTER:
return action.count + 1
case DELETE_COUNTER:
return action.count - 1
default:
return state
}
}
export const Counter = props => {
const [count, dispatch] = useReducer(reducer, 0)
return (
<CounterContext.Provider value={{
count, dispatch
}}>
{props.children}
</CounterContext.Provider>
)
}
复制代码
ShowData组件和ChangeData组件包裹在Counter内部,所以能够经过useContext获取到父组件的数据以及dispatch,而后经过dispatch去更新状态数据信息code
import React, {useContext} from 'react'
import { Counter, CounterContext, ADD_COUNTER, DELETE_COUNTER } from './counter'
function Example() {
return (
<div>
<Counter>
<ShowData></ShowData>
<ChangeData></ChangeData>
</Counter>
</div>
)
}
function ShowData() {
const { count } = useContext(CounterContext)
return (
<div>
当前计数: {count}
</div>
)
}
function ChangeData() {
const { count, dispatch } = useContext(CounterContext)
return (
<div>
<button onClick={() => {dispatch({
type: ADD_COUNTER,
count: count
})}}>增长</button>
<button onClick={() => {
dispatch({
type: DELETE_COUNTER,
count: count
})
}}>减小</button>
</div>
)
}
export default Example
复制代码
经过这些就实现了类Redux的效果以达到数据管理的目的component