Redux是一个模式和库,用于管理和更新应用程序状态,使用称为“action”的事件。它是需要在整个应用程序中使用的状态的集中存储,规则确保状态只能以可预测的方式更新。
Redux主要有三个功能:
使用redux的原则:
action就是视图发出的通知,用来说明状态应该发生什么变化。
action是一个普通的JavaScript对象,它有一个type字段。您可以将操作视为描述应用程序中发生的事情的事件.
一个action对象可以有其他字段,其中包含有关所发生事件的附加信息。按照惯例,我们将这些信息放在一个名为payload的字段中。
包含两个属性:
异步action是一个函数。
store就是保存数据的地方,可以看成一个容器。整个应用只能有一个store,store是整个Redux的统一操作入口。store是调度者用于联系action和reducer。
import {configureStore} from 'reduxjs/toolkit'
import counterReducer from './counter.js'
export default configureStore({
reducer:{
counter:counterReducer
}
})
store收到action之后,必须给出一个新的状态,这样视图才会发生变化,这种状态的计算过程就是Reducer。
reducer是一个纯函数,接收旧的state和action,返回一个新的state。用于初始化状态和更新状态。
import {createSlice} from 'reduxjs/toolkit'
const counterSlice createSlice({
name:'counter',
initialState:{
count:0
},
reducers:{
increament:(state,action)=>{
state.count+= action.payload;
}
}
})
export const {increament} = counterSlice.actions
export default counterSlice.reducer
// 组件内部
import {useDispatch,useSelector} from 'react-redux'
import {increament} from '../../../store/counter'
function Home {
let count = useSelector(state => state.counter.count)
let dispatch = useDispath();
add = () => {
dispatch(increament(1));
}
return
}
// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter} from 'react-router-dom';
import { Provider } from 'react-redux';
import store from './store'
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
);
useSelector是React Redux封装的一个Hooks,用于从Redux中的store对象中提取数据,并且返回的state对象是响应式的。
useSelector(selector,equalityFn):
state => state.username
===
的方式判断,也可以自定义判断规则import {useSelector} from 'react-redux'
function App(){
const userName = useSelector(state => state.userName);
return <>
用户姓名{userName}
>
}
useDispatch返回redux store的dispatch函数引用。
import {useDispatch} from 'react-redux'
function App(){
const dispatch = useDispatch();
const clickButton=()=>{
dispatch({
type:'username',
data:'hello'
});
}
return <>
姓名:{username}
>
}
useStore返回Redux
组件的对象引用
实际开发中为了满足组件的单一性数据原则,通常使用useSelector,但是当组件内需要引用大量数据,就需要useStore
import {useStore} from 'react-redux'
function App(){
const store = useStore();
const {
userInfo
} = store;
return <>
姓名:{userInfo.userName}
年龄:{userInfo.age}
>
}
useReduxContext就是一个完全的React.useContext
实例对象,返回全局实例对象的上下文,然后通过这个上下文直接获取state、dispatch。
import {useReduxContext}from 'react-redux'
function App(){
const context = useReduxContext();
const{
state,
dispatch
} = context;
return <>
姓名:{state.userInfo.userName}
年龄:{state.userInfo.age}
>
}