Je tente de mettre à jour le composant center
du composant enfant BaseMap
via le composant parent. Même si l'état des composants parents est mis à jour (et que j'ai pu lire les nouvelles propriétés mises à jour dans le console.log
), il n'est pas transmis aux propriétés enfant.L'état de l'enfant React ne se met pas à jour après la mise à jour du composant parent
La dernière chose que j'ai essayé a été la méthode componentWillReceiveProps
. Ça ne marche toujours pas.
Ceci est mon code:
const google = window.google;
let geocoder = new google.maps.Geocoder();
class App extends Component {
constructor(props) {
super(props);
this.state = {
avatar: '',
username: 'someUse03',
realName: '',
location: '',
followers: '',
following: '',
repos: '',
address: '',
}
}
render() {
return (
<div>
<SearchBox fetchUser={this.fetchUser.bind(this)}/>
<Card data={this.state} />
<BaseMap />
</div>
);
}
fetchApi(url) {
fetch(url)
.then((res) => res.json())
.then((data) => {
this.setState({
avatar: data.avatar_url,
username: data.login,
realName: data.name,
location: data.location,
followers: data.followers,
following: data.following,
repos: data.public_repos,
address: geocoder.geocode({'address': data.location}, function(results, status) {
if (status == 'OK') {
var coords = [];
var results = results.map((i) => {
i.geometry.location = i.geometry.location
.toString()
.replace(/[()]/g, '')
.split(', ');
coords.push(i.geometry.location[0], i.geometry.location[1]);
results = coords.map((i) => {
return parseInt(i, 10)
});
return results;
});
} else {
alert('Geocoding was not successfull because ' + status)
}
})
})
});
}
fetchUser(username) {
let url = `https://api.github.com/users/${username}`;
this.fetchApi(url);
}
componentDidMount() {
let url = `https://api.github.com/users/${this.state.username}`;
this.fetchApi(url);
}
}
export default App;
Ceci est le composant enfant:
BaseMap extends React.Component {
constructor(props) {
super(props);
this.state = {
center: [41, 21],
}
}
componentWillReceiveProps(nextProps) {
this.setState({ center: nextProps.address});
}
render() {
return (
<Col md={10} mdPull={1}>
<div className="map">
<GoogleMap
bootstrapURLKeys={'AIzaSyBhzwgQ3EfoIRYT70fbjrWASQVwO63MKu4'}
center={this.state.center}
zoom={11}>
</GoogleMap>
</div>
</Col>
);
}
}
Vous pointez sur la ligne ' '? –
IsaaK08
Oui. Le modèle général pour les éléments qui doivent être récupérés lors du chargement de la page consiste à déclencher une action à partir de componentWillMount, par exemple fetchUser. Ceci à son tour définira alors l'état quand les données ont été retreived. Si c'est asynchrone, regardez les sagas ou les thunks. Les thunks sont plus faciles à apprendre, mais les sagas sont sans doute plus utilisées, du moins en ce moment. –
@ WillyG vous voulez dire 'componentDidMount'. Vous ne devriez jamais chercher sur 'componentWillMount' ou dans le' constructor'. https://facebook.github.io/react/docs/react-component.html#componentwillmount –