【发布时间】:2020-03-25 13:15:26
【问题描述】:
我需要帮助,我正在编写此表单,提交后,“已发布”的状态从 false 变为 true,我希望“return Redirect to="/landing" ;”但是,将我重定向到登录页面,我认为这不是因为该行在初始渲染后没有重新运行。我希望更改“已发布”的状态会导致重新渲染。我听说过使用历史推送并尝试将其调整为我的代码,但我失败了。我不知道如何用“withRouter”包装我的组件,因为我已经用“connect”包装了它。我怎样才能做到这一点?我已经阅读了很多关于此的帖子,但我不知道如何使其适应我的代码。任何帮助表示赞赏。
import React, { useState } from "react";
import Navbar from "./Navbar";
import { connect, useDispatch } from "react-redux";
import { Redirect } from "react-router-dom";
import { createProject } from "../actions/projectAction";
import PropTypes from "prop-types";
import { push } from "connected-react-router";
const EditProject = ({ posted, createProject }) => {
const dispatch = useDispatch();
const [formData, setFormData] = useState({
projectTitle: "",
projectDescription: "",
deliveryDate: ""
});
const { projectTitle, projectDescription, deliveryDate } = formData;
const onChange = e => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const onSubmit = async e => {
e.preventDefault();
createProject({ projectTitle, projectDescription, deliveryDate });
dispatch(push("/login"));
};
if (posted) {
return <Redirect to="/landing" />;
}
return (
<div>
<Navbar />
<div className="container">
<form onSubmit={e => onSubmit(e)}>
<h4>Project Title</h4>
<input
name="projectTitle"
value={projectTitle}
className="form-control"
placeholder="Your project title"
onChange={e => onChange(e)}
/>
<h4>Delivery Date</h4>
<input
type="date"
className="form-control"
name="deliveryDate"
value={deliveryDate}
onChange={e => onChange(e)}
/>
<h4>Description</h4>
<textarea
name="projectDescription"
value={projectDescription}
className="form-control"
rows="10"
onChange={e => onChange(e)}
></textarea>
<input type="submit" className="btn btn-primary" value="Create" />
<a href="/projects" className="btn btn-danger">
Cancel
</a>
</form>
</div>
</div>
);
};
EditProject.propTypes = {
createProject: PropTypes.func.isRequired
};
const mapStateToProps = state => ({
posted: state.posted
});
export default connect(mapStateToProps, { createProject })(EditProject);
【问题讨论】:
-
这段代码应该可以工作。您检查
posted的值是否符合预期? (例如,console.log('posted', posted)就在if的上方)如果是这样,问题将在于路由器的初始化方式(例如,<Route path="/lnding">中的拼写错误)。如果不是,则问题很可能出在 redux 中(例如,reducer 未正确设置state.posted)。
标签: javascript reactjs forms react-redux react-router