【发布时间】:2021-07-23 09:41:46
【问题描述】:
我正在学习 React,我想使用 history.push("/dashboard") 但它不起作用。
import axios from "axios";
import { GET_ERRORS, GET_PROJECT, GET_PROJECTS } from "./types";
export const createProject = (project, history) => async (dispatch) => {
try {
const res = await axios.post("http://localhost:8080/api/project", project);
history.push("/dashboard");
} catch (err) {
dispatch({
type: GET_ERRORS,
payload: err.response.data,
});
}
};
export const getProjects = () => async (dispatch) => {
const res = await axios.get("http://localhost:8080/api/project/all");
dispatch({
type: GET_PROJECTS,
payload: res.data,
});
};
export const getProject = (id, history) => async (dispatch) => {
try {
const res = await axios.get(`http://localhost:8080/api/project/${id}`);
dispatch({
type: GET_PROJECT,
payload: res.data,
});
} catch (error) {
history.push("/dashboard");
}
};
history.push 的问题在于 getProject 而不是 createProject
这是我使用 createProject 函数的代码
import React, { Component } from "react";
import { getProject, createProject } from "../../actions/projectActions";
import PropTypes from "prop-types";
import { connect } from "react-redux";
import classnames from "classnames";
class UpdateProject extends Component {
//set state
constructor() {
super();
this.state = {
id: "",
projectName: "",
projectIdentifier: "",
description: "",
start_date: "",
end_date: "",
errors: {},
};
this.onChange = this.onChange.bind(this);
this.onSubmit = this.onSubmit.bind(this);
}
componentWillReceiveProps(nextProps) {
if (nextProps.errors) {
this.setState({ errors: nextProps.errors });
}
const {
id,
projectName,
projectIdentifier,
description,
start_date,
end_date,
} = nextProps.project;
this.setState({
id,
projectName,
projectIdentifier,
description,
start_date,
end_date,
});
}
componentDidMount() {
const { id } = this.props.match.params;
this.props.getProject(id, this.props.history);
}
onChange(e) {
this.setState({
[e.target.name]: e.target.value,
});
}
onSubmit(e) {
e.preventDefault();
const updateProject = {
id: this.state.id,
projectName: this.state.projectName,
projectIdentifier: this.state.projectIdentifier,
description: this.state.description,
start_date: this.state.start_date,
end_date: this.state.end_date,
};
this.props.createProject(updateProject, this.props.history);
}
render() {
const { errors } = this.state;
return (
<div className="project">
<div className="container">
<div className="row">
<div className="col-md-8 m-auto">
<h5 className="display-4 text-center">Update Project form</h5>
<hr />
<form onSubmit={this.onSubmit}>
<div className="form-group">
<input
type="text"
className={classnames("form-control form-control-lg", {
"is-invalid": errors.projectName,
})}
placeholder="Project Name"
name="projectName"
value={this.state.projectName}
onChange={this.onChange}
/>
{errors.projectName && (
<div className="invalid-feedback">{errors.projectName}</div>
)}
</div>
<div className="form-group">
<input
type="text"
className={classnames("form-control form-control-lg", {
"is-invalid": errors.projectIdentifier,
})}
placeholder="Unique Project ID"
name="projectIdentifier"
value={this.state.projectIdentifier}
onChange={this.onChange}
disabled
/>
{errors.projectIdentifier && (
<div className="invalid-feedback">
{errors.projectIdentifier}
</div>
)}
</div>
<div className="form-group">
<textarea
className={classnames("form-control form-control-lg", {
"is-invalid": errors.description,
})}
placeholder="Project Description"
name="description"
value={this.state.description}
onChange={this.onChange}
></textarea>
{errors.description && (
<div className="invalid-feedback">{errors.description}</div>
)}
</div>
<h6>Start Date</h6>
<div className="form-group">
<input
type="date"
className="form-control form-control-lg"
name="start_date"
value={this.state.start_date}
onChange={this.onChange}
/>
</div>
<h6>Estimated End Date</h6>
<div className="form-group">
<input
type="date"
className="form-control form-control-lg"
name="end_date"
value={this.state.end_date}
onChange={this.onChange}
/>
</div>
<input
type="submit"
className="btn btn-primary btn-block mt-4"
/>
</form>
</div>
</div>
</div>
</div>
);
}
}
UpdateProject.propTypes = {
getProject: PropTypes.func.isRequired,
createProject: PropTypes.func.isRequired,
project: PropTypes.object.isRequired,
errors: PropTypes.object.isRequired,
};
const mapStateToProps = (state) => ({
project: state.project.project,
errors: state.errors,
});
export default connect(mapStateToProps, { getProject, createProject })(
UpdateProject
);
我看到了需要使用 withRouter 的解决方案,但我在这个 js 文件中没有类,所以我不知道这是否对我有帮助
希望有人能帮帮我
【问题讨论】:
-
那么createProject用在哪里,可以分享一下组件吗?
-
还有用什么路由器?
-
什么是
history.push? -
我用组件更新了我的问题,我对 history.push() 的问题在 getProject 中
标签: javascript reactjs axios