reactjs - react-redux 调度未定义
问题描述
在我的 App.js 中:
const initialAppState = {
nums: {},
};
const reducer = (state = initialAppState, action) => {
if (
action.a === undefined ||
action.b === undefined ||
action.c === undefined
) {
return state;
}
if (state.nums[action.a][action.b] === undefined) {
state.nums[action.a][action.b] = {};
}
return {
nums: (state.nums[action.a][action.b] =
action.c),
};
};
const store = createStore(reducer);
然后用Provider传递它。在我的 Test.js 中,我试图更改它给我错误的值:
const mapStateToProps = (state) => {
return {
nums: state.nums,
};
};
function mapDispatchToProps(dispatch) {
return {
add: (a, b, c) =>
dispatch({a: a, b: b, c: c}),
};
}
export default connect(mapStateToProps, mapDispatchToProps())(Test);
测试功能组件如下所示:
function Test({nums, dispatch})
...
function add(data, count) {
dispatch.add('1','2','3');
}
它给我错误说: TypeError: undefined is not an object (evaluating 'dispatch.add')
它不应该将 dispatch 识别为 dispatch 是 Test 的参数,并且 add 是该功能组件的另一个功能吗?
解决方案
我建议你组织你的代码。尝试将 action 和 reducers 移动到单独的文件中,例如 actions.js、reducers.js。
减速机需要一些修复:
- 在最后一次返回的减速器示例中,您试图改变 state。
- 此外,正如您在第二个中看到的那样,
if
没有return
.
行动和减员分离的提议
在您的内部您App.js
将创建Store:
//App.js
import { reducer } from "./reducers"
const store = createStore(reducer);
<Provider store={ store }>
...
</Provider>
现在让我们做actions.js
文件:
//actions.js
export const ADD_ACTION='ADD_ACTION' // action type
export function addAction(data) {
return { type: ADD_ACTION, data }
}
在 reducer 中,您将从App.js
. 我建议您像这样在减速器内使用开关:
//reducers.js
import { ADD_ACTION } from "./actions";
const initialAppState = {
nums: {},
};
export const reducer = (state = initialAppState, action) => {
switch(action.type) {
case ADD_ACTION:
return Object.assign({}, state, { nums: action.data });
default:
return state
}
};
如您所见,其中一个 ADD_ACTION 正在返回具有更新nums
值的新对象。这是因为 Redux 的基本规则之一是“不要改变状态”。
现在,让我们在 Test.js 中尝试我们的操作。首先addAction
从actions.js
. 然后调用dispatch
withaddAction
作为参数。
//Test.js functional component version
import { addAction } from "./actions";
function Test({dispatch}) {
...
function add(data, count) {
dispatch(addAction(data));
}
}
export default connect(null, null)(Test);
组件dispatch
从连接接收。Connect 有 (null, null) 因为在这种情况下我们没有使用 mapStateToProps,也没有使用 mapDispatchToProps。
额外提示:对于类组件,您将以稍微不同的方式使用动作。
//Test.js Class component version
import React from 'react';
import { addAction } from "./actions";
import { connect } from 'react-redux';
class TestClass extends React.Component {
render() {
return(
<button onClick={() => this.props.addAction(2)}>Action</button>
)
}
}
const mapDispatchToProps = ({
addAction
});
export default connect(null, mapDispatchToProps)(TestClass);
在类组件示例中,您将2
在 onClick 事件触发时调用具有值的操作。
工作沙箱示例:react-redux 示例
推荐阅读
- python - 空行对训练 FastText 模型的影响
- angular - NgRx 数组状态如何修复类型约定?
- artifactory - JFrog Xray 可以只扫描 Maven 工件吗?
- python - Pygame - 接地时平台跳跃无响应
- google-cloud-platform - GCP HTTP(s) 第 7 层负载平衡器中的动态 SSL 分配
- c++ - 不删除静态指针(谷歌风格)
- python - 使用 GridSearchCV 时出现什么错误?
- apache-kafka - Ktable 到 KGroupTable - 架构不可用(状态存储 ChangeLog 架构未注册)
- javascript - 有没有更优雅的方法来遍历 js 中的 json 数组?
- statistics - 统计数据:在一组中找到它们之间相关的对的捷径