import { useReducer } from "react";
//定义一个reducer函数
const reducer = (state,action)=>{
switch(action.type){
case "INC":
return state + 1;
case "DEC":
return state - 1;
case "SET":
return action.payload
default:
return state
}
}
function App() {
//组件中调用useReducer
const [state,dispatch] = useReducer(reducer,0)
return (
<div className="App">
this is APP
<button onClick={()=>dispatch({type:"DEC"})}>-</button>
{state}
<button onClick={()=>dispatch({type:"INC"})}>+</button>
<button onClick={()=>dispatch({type:"SET",payload:100})}>update</button>
</div>
);
}
export default App;
useMemo(()=>{
},[count])
//count为依赖项
const MemoComponent = memo(function SomeComponent(props){
// ...
})
Object.is
比较新值和老值,返回true则表示没有变化useCallback
包裹函数之后,函数可以保证在APP重新渲染时保持引用稳定import { memo, useCallback, useReducer, useState } from "react";
const Input = memo(function Input({onChange}){
console.log("子组件重新渲染了");
return <input type="text" onChange={(e)=>{onChange(e.target.value)}}></input>
})
function App() {
const [count,setCount] = useState(0)
const changeHandler = useCallback((value)=>console.log(value),[])
return (
<div className="App">
<Input onChange={changeHandler} />
<button onClick={()=>{setCount(count+1)}}>{count}</button>
</div>
);
}
export default App;
import { forwardRef, memo, useCallback, useReducer, useRef, useState } from "react";
const Input = forwardRef((props,ref)=>{
return <input ref={ref} type="text"></input>
})
function App() {
const inputref = useRef(null)
const showRef = ()=>{
console.log(inputref);
inputref.current.focus()
}
return (
<div className="App">
<Input ref={inputref} />
<button onClick={showRef}>ref</button>
</div>
);
}
export default App;
import { forwardRef, memo, useCallback, useImperativeHandle, useReducer, useRef, useState } from "react";
const Input = forwardRef((props,ref)=>{
const inputRef = useRef(null)
//编写聚焦逻辑
const focusHandler = ()=>{
inputRef.current.focus()
}
//向外层暴露方法
useImperativeHandle(ref,()=>{
return {
focusHandler
}
})
return <input ref={inputRef} type="text"></input>
})
function App() {
const inputref = useRef(null)
const showRef = ()=>{
console.log(inputref);
inputref.current.focusHandler()
}
return (
<div className="App">
<Input ref={inputref} />
<button onClick={showRef}>ref</button>
</div>
);
}
export default App;
setState
方法来修改状态数据render
来写UI模版(JSX语法一致)import { Component, forwardRef, memo, useCallback, useImperativeHandle, useReducer, useRef, useState } from "react";
//ClassAPI
class Counter extends Component{
//定义状态变量
state = {
count:0
}
//定义事件回调修改状态变量
setCount = ()=>{
this.setState({
count: this.state.count + 1
})
}
//通过render函数返回UI模版
render(){
return <button onClick={this.setCount}>{this.state.count}</button>
}
}
function App() {
return (
<div className="App">
<Counter />
</div>
);
}
export default App;
create
函数创建一个状态管理的存储storeimport { create } from "zustand";
//创建store
const useStore = create((set)=>{
return {
//状态数据
count:0,
//修改状态数据
inc:()=>{
set((state)=>{return {count:state.count + 1}})
}
}
})
function App() {
//实例store并结构数据
const {count,inc} = useStore()
return (
<div className="App">
<button onClick={inc}>{count}</button>
</div>
);
}
export default App;
注意:
- 函数参数必须返回一个对象,对象内部编写状态数据和方法
- set是用来修改数据的专门方法必须调用它来修改数据