create-react-app的redux范例,通过useSelector获得state
发布于 作者:苏南大叔 来源:程序如此灵动~本文接着分析create-react-app
的redux
范例,已经分析了相关函数需要定义成reducer
的样式,而根据官方的提示,这些reducer
又整合到了redux/toolkit
的slice
内。那么,如何随时随地的访问到state
内的数据呢?这个就是本文要讨论的问题。
大家好,这里是苏南大叔的程序如此灵动博客,这里记录苏南大叔的代码故事。本文描述react
和redux
结合后,如何随时随地访问redux
重新定义果的state
的数据。测试环境:win10
,node@16.14.2
,create-react-app@5.0.1
,reduxjs/toolkit@1.8.3
,react-redux@8.0.2
。
访问state
(设置和获取)
这里还是沿用create-react-app
的redux
模版,基本情况参考文章:
src/logic/slice.js
定义:
export const counterSlice = createSlice({
//...
reducers: {
increment: (state) => {
state.value += 1;
},
},
});
//...
export const selectCount = (state) => state.store_reducer_name.value;
export const getState = (state) => {
return state.store_reducer_name;
}
这里定义了两个函数,一个是原版的selectCount()
,另外一个是苏南大叔新加的getState()
。都用于外部访问state
使用。
定义位置 | 访问方式 |
---|---|
slice内部 | state.{value} |
slice外部 | state.{store中定义的reducer名字}.{value} |
{store中定义的reducer名字}
来自store.js
:
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './slice';
export const store = configureStore({
reducer: {
store_reducer_name: counterReducer,
},
});
来自react
的useState
useState
函数不是redux
提供的,是react
本来就有的,有点意外不是?关于这个函数的说明见这里:
简单的来说,useState
函数就是定义了一个函数,同时又执行了这个函数,并把这个结果挂载到了state
上面。大家都知道,在react
里面,state
的概念可是非常重要的。
const [incrementAmount, setIncrementAmount] = useState('2');
按照苏南大叔的理解,这句话的意思是:
const setIncrementAmount = (value) => {
state.incrementAmount = value;
}
setIncrementAmount ("2");
来自redux
的useSelector
正常来说,外部访问不了redux
的state
数据,但是凡事有例外。下面来看看如何访问到redux
的state
数据。
src/logic/slice.js
定义【注意store_reducer_name】:
export const selectCount = (state) => state.store_reducer_name.value;
export const getState = (state) => {
return state.store_reducer_name;
}
src/logic/store.js
定义【store_reducer_name】:
export const store = configureStore({
reducer: {
store_reducer_name: counterReducer,
},
});
src/view/counter.js
调用:
import { useSelector, useDispatch } from 'react-redux';
import {
selectCount,
getState,
} from './../logic/slice';
const count = useSelector(selectCount);
const state = useSelector(getState);
console.log(count);
console.log(state);
这里的核心代码:
const selectCount = (state) => state.store_reducer_name.value;
const count = useSelector(selectCount);
苏南大叔的理解就是:
const count = state.store_reducer_name.value;
useSelector
的只读性
在useSelector
对应的函数中,
redux
的state
是有命令空间的,来自于store
中的定义。redux
中的state
是只读的,不可扩展的。
比如:
export const getState = (state) => {
return state.store_reducer_name;
}
const state = useSelector(getState);
试图改写已有属性的时候,会报错:
state.store_reducer_name.status="test";
Cannot assign to read only property 'status' of object '#<Object>'
试图添加新的属性的时候,会报错:
state.store_reducer_name.aaa="bbb";
Uncaught TypeError: Cannot add property aaa, object is not extensible
useState
vsuseSelector
userState
里面的state
,是react
组件原生的state
。和redux
中的state
不一样!redux
的state
在react
里面,叫做selector
。
react
中的state
,指的是组件的状态数据。redux reducer
中的state
,指的是store
中的数据。
以下截图来自react devtools
:
相关文档
- https://newsn.net/say/redux.html
- https://newsn.net/say/react.html
- https://newsn.net/say/react-usestate.html
综述
本文中的大多数内容,都是苏南大叔自己的理解。不正确之处,请指正。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。