Reactjs React Redux TypeError-不是函数
我正在尝试同时使用Reactjs React Redux TypeError-不是函数,reactjs,redux,redux-thunk,Reactjs,Redux,Redux Thunk,我正在尝试同时使用React和Redux来管理我的应用程序状态。我试图从我的操作中调用一个方法(SprintActions),但我一直收到错误 TypeError:props.getAllSprints不是一个函数 你能告诉我我做错了什么吗 我的主要组件是Sprint组件,它导入SprintActions import * as types from "../constants/ActionTypes"; import Axios from "axios"; export const getS
React
和Redux
来管理我的应用程序状态。我试图从我的操作中调用一个方法(SprintActions
),但我一直收到错误
TypeError:props.getAllSprints不是一个函数
你能告诉我我做错了什么吗
我的主要组件是Sprint
组件,它导入SprintActions
import * as types from "../constants/ActionTypes";
import Axios from "axios";
export const getSprints = () => {
console.log("get sprints");
return (dispatch) => {
Axios.get("http://127.0.0.1:5000/sprints").then((response) => {
const sprintData = response.data;
dispatch(getAllSprints(sprintData));
});
};
};
export const getAllSprints = (data) => ({
type: types.GET_SPRINTS,
data: data,
});
这是我的Sprint
组件
import React, { useEffect } from "react";
import { getSprints } from "./sprintActions";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import { bindActionCreators } from "redux";
export const Sprint = (props) => {
useEffect(() => {
props.getAllSprints();
}, []);
return (
<div style={{ zIndex: 1 }}>
{sprints &&
sprints.map((s) => (
<p>{s.id}</p>
))}
</div>
);
};
Sprint.propTypes = {
getAllSprints: PropTypes.func,
};
const mapStateToProps = (state) => ({
sprints: state.sprints,
});
const mapDispatchToProps = (dispatch) => ({
getAllSprints: bindActionCreators(getSprints, dispatch),
});
export default connect(mapStateToProps, mapDispatchToProps)(Sprint);
感谢您的时间和耐心。您在这里试图实现的目标应该通过使用
redux-thunk
(发送api请求)或redux-sagas
(在imo中稍微复杂一点)来实现。
你可以阅读,这是非常有帮助的
您的问题是getSprints
操作没有返回属性(类型,…负载)为的对象。如果您使用getAllSprints操作,您将看到它将起作用
也检查
我希望这有帮助
bindActionCreators
用于将分派功能传递到商店不知道的组件中,因为您在connect
内部使用mapDispatchToProps
根本不需要它(无论如何,您实现它的方式有点错误,欢迎查看文档)
只需使您的mapDispatch尽可能基本:
# 编辑 您可以将检查程序添加到
useffect
中,使getAllSprint
是函数(这一行在Redux上下文设置后执行),并添加[props[getAllSprint]]
依赖项,以便在未设置的情况下再次运行效果
如果您有多个操作,并且希望绑定它们,那么您只需执行以下操作
import * as sprintActions from "./sprintActions";
export const Sprint = (props) => {
useEffect(() => {
props.sprintActions.getSprints();
}, []);
...
};
const mapDispatchToProps = (dispatch) => ({
sprintActions: bindActionCreators(sprintActions, dispatch),
});
否则,您需要按照其他答案中的建议手动呼叫调度:
export const Sprint = (props) => {
useEffect(() => {
props.getAllSprints();
}, []);
...
};
const mapDispatchToProps = (dispatch) => ({
getAllSprints: () => dispatch(getSprints()),
});
您已经在
SprintActions
中定义了getallsprint
,并且在bindActionCreators
中声明了相同的内容。对吗?我认为一些命名不匹配正在发生。这是正确的吗<代码>从“/sprintActions”导入{getSprints}代码>不应该是从“/SprintActions”导入{getSprints}对不起,我选择了第二个选项,但得到的结果是相同的。对不起,我的回复太晚了。很抱歉,我仍然得到同样的回复。请原谅我迟迟没有回复。请原谅我也迟迟没有回复,如果你仍然面临这个问题,我将编辑我的答案
import * as sprintActions from "./sprintActions";
export const Sprint = (props) => {
useEffect(() => {
props.sprintActions.getSprints();
}, []);
...
};
const mapDispatchToProps = (dispatch) => ({
sprintActions: bindActionCreators(sprintActions, dispatch),
});
export const Sprint = (props) => {
useEffect(() => {
props.getAllSprints();
}, []);
...
};
const mapDispatchToProps = (dispatch) => ({
getAllSprints: () => dispatch(getSprints()),
});