StackOver记录:如何在function中使用redux
Stackoverflow地址:Accessing redux store inside functions (opens new window)
# 问题描述
项目中需要封装一个函数buttonClick
,顾名思义:点击按钮触发buttonClick
点击事件,点击后需要修改react-redux
生成的store
中的state
状态。
但是connect
只能将state
与Class
组件链接起来,所以stackoverflow
给出的解决方案是通过redux API
实现。
# 记录我尝试过的几种失败方案
# 1. 使用redux API
// buttonClick.js
// 获取 state
store.getState()
// 更新 state
store.dispatch({type:"updateValue",value:"xxx"})
// 导出给外部使用
export default const buttonClick = ()=>{....}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
但是以上使用的过程时发现,store.getState()
拿不到store
中的最新state
。
我分析的原因是:import buttonClick
时,实际上已经执行了一遍了。所以我尝试了下:
<button onClick={
import('./button.js').then((module)=>{
module.button()
})}
/>
1
2
3
4
5
2
3
4
5
函数运行未报错,但是仍然取不到最新的state
# 2. 使用 store.subscribe()
import store from './redux/store.js';
export const buttonClick = function (){
var newState = store.getState();
console.log('state changed');
}
store.subscribe(buttonClick)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
但是此种方法在state
概念的时候,仍然无法触发。
这个时候我就在想:到底是state
变化了,无法触发store.subscribe
还是压根state
就没有变化呢?
# 目前测试的结果
// buttonClick.js
store.getState() // 无论是懒加载触发,还是使用store.subscribe触发都无法获取最新的state
// 但是在组件中使用connect语法时
// 与mapStateFromProps: 能拿到最新的state
// mapDispatchToProps: 能改变store的reducer中的状态
1
2
3
4
5
6
2
3
4
5
6
#
编辑 (opens new window)
上次更新: 2022/04/06, 15:04:00