J'ai besoin d'aide, je suis en train de coder ce formulaire et après l'avoir soumis, l'état des modifications "publiées" de faux à vrai et je m'attendrais à "renvoyer la redirection vers ="/landing ";" pour me rediriger vers la page de destination, cependant, ce n'est pas le cas, car je suppose que la ligne ne se réexécute pas après le rendu initial. J'espérais que changer l'état de "posté" provoquerait un nouveau rendu. J'ai entendu parler de l'utilisation de l'historique Push et j'ai essayé de l'adapter à mon code, mais j'ai échoué. Je ne sais pas comment envelopper mon composant avec "withRouter" étant donné que je l'ai déjà encapsulé avec "connect". Comment puis-je atteindre cet objectif? J'ai lu de nombreux articles à ce sujet mais je ne sais pas comment l'adapter à mon code. Toute aide est appréciée.
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);
Je pense que vous devez définir votre itinéraire. De mon code suivant, vous pouvez avoir une petite idée du routage.
Dans App.js
en gros j'ai défini les routes et j'ai créé deux autres composants fonctionnels Landing
et EditProject
pour simuler votre idée. De plus, j'ai utilisé Link
à des fins de navigation
App.js
import React, { Component } from "react";
import { BrowserRouter, Route, Switch, Link } from "react-router-dom";
import EditProject from "./editProject";
import Landing from "./landing";
class App extends Component {
render() {
return (
<BrowserRouter>
<div id="container">
<div>
<Link to="/">Landing Page</Link>
<Link to="/editproject">Edit Project</Link>
</div>
<Switch>
<Route path="/editproject" component={EditProject} />
<Route exact path="/" component={Landing} />
</Switch>
</div>
</BrowserRouter>
);
}
}
export default App;
Landing
composant fonctionnel
import React from "react";
const Landing = () => {
return <h1>Landing Page</h1>;
};
export default Landing;
EditProject
composant fonctionnel
import React from "react";
const EditProject = props => {
function handleSubmit(e) {
e.preventDefault();
console.log("submitted");
//do your task here before redirect
//...
props.history.Push("/");
}
return (
<div>
<h1>Edit Project</h1>
<form onSubmit={handleSubmit}>
<button>Submit</button>
</form>
</div>
);
};
export default EditProject;
J'espère que cela vous aidera.
Il y a deux choses que je voudrais aborder dans votre code.
si le composant EditProject
va directement à Route
, vous avez accès à Push.
const EditProject = ({ { posted, createProject, history: { Push } }) => {
Push() // your access to Push
}
deuxièmement, dans votre connexion, je ne soutiens pas cette idée de votre connexion. Probablement, la fonction de soumission n'était pas en cours d'exécution.
Vous pouvez faire quelque chose comme ci-dessous pour faire une différence.
export default connect(mapStateToProps, { handleNewProject, createProject })(EditProject);
Maintenant, réécrire le composant EditProject
serait
import React, { useState, useEffect } from "react";
const EditProject = ({ { posted, handleNewProject, history: { Push } }) => {
Push() // your access to Push
// useEffect React component life cycle Hook
useEffect(() => () => Push('/landing'), [posted]);
}
Remarquez que j'utilise React Hook tout comme vous utiliseriez React class component
cercle de vie .