Je suis assez nouveau avec réaction et appel d'appel. Je construis une application complète de pile à l'aide de React, Express, MySQL et séquez. Tout fonctionne bien, à l'exception de la demande de vente pour modifier les informations du client. J'utilise Axios pour faire ces appels et je peux ajouter, voir et supprimer des données de l'application, mais la pièce d'édition ne fonctionne pas.
Lorsque vous frappez le bouton Soumettre sur le formulaire, la demande de vente renvoie un tableau vide. au lieu des données modifiées réelles. Mes itinéraires sont ok (je crois), comme le testant avec le facteur travaillant tout simplement bien. Je suis presque sûr que mon problème est sur la méthode utilisée dans l'appel Axios, mais je ne peux pas trouver la bonne façon de le faire fonctionner. Toute aide serait très appréciée. P>
import React, { Component } from 'react';
import axios from 'axios';
import API from '../../utils/API';
class index extends Component {
constructor(props) {
super(props);
this.onChangeLastName = this.onChangeLastName.bind(this);
this.onChangeFirstName = this.onChangeFirstName.bind(this);
this.onChangePhone = this.onChangePhone.bind(this);
this.onChangePetName = this.onChangePetName.bind(this);
this.onChangeBreed = this.onChangeBreed.bind(this);
this.onChangeNotes = this.onChangeNotes.bind(this);
this.onSubmit = this.onSubmit.bind(this);
this.state = {
client: null
}
}
componentDidMount() {
let id = this.props.match.params.id
API.getClient(id)
.then(res => {
this.setState({
client: res.data
})
console.log(this.state.client.id)
})
.catch(error => console.log(error))
}
onChangeLastName(e) {
this.setState({
lastName: e.target.value
});
}
onChangeFirstName(e) {
this.setState({
firstName: e.target.value
});
}
onChangePhone(e) {
this.setState({
phone: e.target.value
});
}
onChangePetName(e) {
this.setState({
petName: e.target.value
});
}
onChangeBreed(e) {
this.setState({
breed: e.target.value
});
}
onChangeNotes(e) {
this.setState({
notes: e.target.value
});
}
onSubmit(e) {
e.preventDefault();
let obj = {
lastName: this.state.client.lastName.value,
firstName: this.state.client.firstName.value,
phone: this.state.client.phone.value,
petName: this.state.client.petName.value,
breed: this.state.client.breed.value,
notes: this.state.client.notes.value
};
let id = this.state.client.id
axios.put("http://localhost:3000/api/clients/" + id, obj)
// .then(alert("client Updated"))
.then(res => console.log(res))
.catch(error => console.log(error))
this.props.history.push('/admin');
}
render() {
const client = this.state.client ? (
<div className="client">
<h3 style={{ marginLeft: "60px" }}>Update Client</h3>
<form onSubmit={this.onSubmit} style={{ padding: "60px" }}>
<div className="form-group">
<label>Last Name: </label>
<input type="text"
className="form-control"
defaultValue={this.state.client.lastName}
onChange={this.onChangeLastName}
/>
</div>
<div className="form-group">
<label>First Name: </label>
<input type="text"
className="form-control"
defaultValue={this.state.client.firstName}
onChange={this.onChangeFirstName}
/>
</div>
<div className="form-group">
<label>Phone: </label>
<input type="text"
className="form-control"
defaultValue={this.state.client.phone}
onChange={this.onChangePhone}
/>
</div>
<div className="form-group">
<label>Pet Name: </label>
<input type="text"
className="form-control"
defaultValue={this.state.client.petName}
onChange={this.onChangePetName}
/>
</div>
<div className="form-group">
<label>Breed: </label>
<input type="text"
className="form-control"
defaultValue={this.state.client.breed}
onChange={this.onChangeBreed}
/>
</div>
<div className="form-group">
<label>Notes: </label>
<input type="text"
className="form-control"
defaultValue={this.state.client.notes}
onChange={this.onChangeNotes}
/>
</div>
<br />
<div className="form-group">
<input type="submit" value="Update Client"
className="btn btn-primary" />
</div>
</form>
</div>
) : (
<div className="center">Loading Client</div>
)
return (
<div className="container">
{client}
</div>
)
}
}
export default index;
3 Réponses :
Cela pourrait être parce que vous appelez essayez de mettre ceci.props.history.push code> immédiatement après avoir appelé axios.post code>, essentiellement redirigeant avant que la demande de poste ait une chance de revenir. une réponse. P>
ceci.props.history.push ('/ admin') code> à l'intérieur du .Chen () code>. p>.
Je suppose que c'est à cause de la façon dont vous gérez l'onduleur de vos intrants. Vous souhaitez définir l'ondange sur la valeur du client dans votre état. Mais au lieu de cela, vous le mettez à l'état lui-même. Ainsi, lorsque vous construisez votre objet à envoyer au backend, vous envoyez des données NULL, car vous n'avez défini aucune donnée sur la valeur du client réelle dans votre état et il est toujours null. Essayez la console enregistrant l'état et vous verrez de quoi je parle. Vous ajoutez également un .value code> à la fin chacune des valeurs d'état que vous essayez de créer votre objet avec et ceci n'est pas nécessaire. Enfin, vous n'avez pas besoin de spécifier un ONCHANGE pour chaque entrée, donnez simplement à l'entrée d'un attribut de nom et vous pouvez définir votre gestionnaire d'ONCHANGE comme suit: import React, { Component } from 'react';
import axios from 'axios';
import API from '../../utils/API';
class index extends Component {
constructor(props) {
super(props);
this.onChange = this.onChange.bind(this);
this.onSubmit = this.onSubmit.bind(this);
this.state = {
client: null
}
}
componentDidMount() {
let id = this.props.match.params.id
API.getClient(id)
.then(res => {
this.setState({
client: res.data
})
console.log(this.state.client.id)
})
.catch(error => console.log(error))
}
onChange(e) {
this.setState({
client: {
...this.state.client,
[e.target.name]: e.target.value
}
});
}
onSubmit(e) {
e.preventDefault();
let obj = {
lastName: this.state.client.lastName,
firstName: this.state.client.firstName,
phone: this.state.client.phone,
petName: this.state.client.petName,
breed: this.state.client.breed,
notes: this.state.client.notes
};
let id = this.state.client.id
axios.put("http://localhost:3000/api/clients/" + id, obj)
// .then(alert("client Updated"))
.then(res => console.log(res))
.catch(error => console.log(error))
this.props.history.push('/admin');
}
render() {
const client = this.state.client ? (
<div className="client">
<h3 style={{ marginLeft: "60px" }}>Update Client</h3>
<form onSubmit={this.onSubmit} style={{ padding: "60px" }}>
<div className="form-group">
<label>Last Name: </label>
<input type="text"
name="lastName"
className="form-control"
defaultValue={this.state.client.lastName}
onChange={this.onChange}
/>
</div>
<div className="form-group">
<label>First Name: </label>
<input type="text"
name="firstName"
className="form-control"
defaultValue={this.state.client.firstName}
onChange={this.onChange}
/>
</div>
<div className="form-group">
<label>Phone: </label>
<input type="text"
name="phone"
className="form-control"
defaultValue={this.state.client.phone}
onChange={this.onChange}
/>
</div>
<div className="form-group">
<label>Pet Name: </label>
<input type="text"
name="petName"
className="form-control"
defaultValue={this.state.client.petName}
onChange={this.onChange}
/>
</div>
<div className="form-group">
<label>Breed: </label>
<input type="text"
name="breed"
className="form-control"
defaultValue={this.state.client.breed}
onChange={this.onChange}
/>
</div>
<div className="form-group">
<label>Notes: </label>
<input type="text"
name="notes"
className="form-control"
defaultValue={this.state.client.notes}
onChange={this.onChange}
/>
</div>
<br />
<div className="form-group">
<input type="submit" value="Update Client"
className="btn btn-primary" />
</div>
</form>
</div>
) : (
<div className="center">Loading Client</div>
)
return (
<div className="container">
{client}
</div>
)
}
}
export default index;
Merci de répondre. J'ai modifié le code comme vous l'avez suggéré, mais au lieu d'un tableau vide, je récupère maintenant un objet vide sur la console avec Statut 200. Toujours aucune modification des données
Oui, postez, obtenez, supprimez et placez-vous des demandes bien fonctionner lorsque vous utilisez Postman. Je viens d'essayer encore et de mettre la demande me permet de récupérer un objet avec le numéro 1, et lorsque vous vérifiez MySQL Workbench, cela modifie réellement les données, donc je suppose que cela fonctionne
Ok console.log the Obj et l'ID avant de l'envoyer dans votre demande AxIOS pour vous assurer que vous envoyez les données correctes
Je console identifiant enregistré et cela montre bien, mais obj me donne les mêmes informations sur la base de données
Oh mon méchant, j'ai oublié de changer chacun des gestionnaires d'ONCHANGE dans vos entrées pour utiliser la seule fonction ONCHANGE. J'ai édité la réponse. Dans chacune de vos entrées, changez le gestionnaire d'ONCHANGE pour utiliser la seule fonction ONCHANGE
ok, OBJ est la console enregistrant les modifications, de sorte que les données sont envoyées correctement, mais pourquoi ne pas être modifiée
Les données que vous affichez-elles avec Postman est-elle identique à celle que vous envoyez? Dans Postman, vous envoyez un objet clair avec vos informations en ce sens vers le backend. Vous n'envoyez pas vos données dans une clé à l'intérieur de cet objet. Essayez peut-être de poster votre code serveur afin que nous puissions aussi regarder cela.
Oui, je l'ai eu, je dois juste ajouter la propriété ID à l'objet envoyé. Merci beaucoup mec, tu as sauvé ma journée :)
Pas de problème heureux d'aider. Bonne chance.
Vous faites plusieurs choses erronées ici,
Pour chaque entrée, vous devez avoir seulement 1 Onchange Code> Handler, chaque entrée a Nom code> Attribut pour fonctionner avec Etat code>. Par exemple, P> API.getClient(id)
.then(res => {
this.setState({
client: res.data
}, () => console.log(this.state.client.id)) //This is callback
})
Je ne vois aucun problème avec le code ci-dessus. Pouvez-vous utiliser l'onglet Réseau dans l'outil de développement de Chrome pour vérifier que votre demande d'API et vos données de réponse sont correctes ou non?