Установить состояние ребенка после того, как он получит реквизит?
У меня есть два компонента. Одним из них является UserBase, на котором вызывается ajax-запрос для получения значений. Когда эти значения получаются и обновляются в состоянии заголовка.
Еще один компонент - заголовок. Это дочерний компонент UserBase. Поэтому, когда состояние обновляется, оно передается дочернему компоненту.
Теперь моя проблема в том, что мне нужно обновить состояние ребенка, когда он получит реквизиты от компонента UserBase. Как я могу достичь этой функциональности.
Вот мой код
Компонент заголовка
var React = require('react');
var Router = require('react-router');
import Auth from './Auth.js';
import PopupSmall from './PopupSmall.js';
var headerStyle = {
border:0
}
class Header extends React.Component{
constructor(){
super();
console.log("constructor");
this.state = {basicInfo : {}};
}
// **some function which needs to tigger when this component will receive props**
popupChange(){
console.log("============popupChange============");
console.log(this.state);
Router.browserHistory.push("/dashboard");
}
render(){
if(this.props.basicInfo){
return (
<div>
{this.props.basicInfo.isAgency==1 ? <PopupSmall popupCallBack={this.popupChange.bind(this)} itemList={this.props.agencies} show='true' title='Agencies'/> : console.log()}
</div>
)
}
}
}
export default Header;
Компонент UserBase
import React from 'react';
import Header from './Header.js';
import Auth from './Auth.js';
import Loader from './Loader.js';
var Router = require('react-router');
class Base extends React.Component{
constructor(){
super();
this.state = {basicInfo :[]};
}
loadDataFromServer() {
var tokenId = Auth.getCookies("token");
if(tokenId!=""){
var data = {
token : tokenId
}
$.ajax({
url: 'http://xxx.xxxxxxx.xxx/abc/cde',
dataType: 'json',
cache: false,
type : 'POST',
data : JSON.stringify(data),
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
success: function(response) {
var info = {
compName : response.name,
firstName : response.fn,
isAgency : response.isAgeny
}
this.setState({basicInfo:info}, function(){
//console.log(this.state.data);
}.bind(this));
}.bind(this),
error: function(xhr, status, err) {
console.error("", status, err.toString());
}.bind(this)
});
} else {
Router.browserHistory.push('/login');
}
}
componentDidMount() {
this.loadDataFromServer();
}
render(){
document.body.className="nav-md";
return (
<div className="container body">
<div className="main_container">
<Header basicInfo={this.state.basicInfo} />
</div>
</div>
);
}
}
export default Base;
1 ответ
Если вы еще этого не сделали, прочитайте: https://facebook.github.io/react/docs/component-specs.html
В частности, есть одна функция, которая может вам подойти:
componentWillReceiveProps (nextProps, nextState)
Вызывается, когда компонент получает новые реквизиты. Этот метод не вызывается для начального рендеринга.
Используйте это как возможность отреагировать на переход поддержки перед вызовом render() путем обновления состояния с помощью this.setState(). Старые реквизиты могут быть доступны через this.props. Вызов this.setState () в этой функции не вызовет дополнительный рендер.
Таким образом, ваш компонент Header будет иметь функцию, аналогичную следующей (непроверенная):
componentWillReceiveProps(nextProps) {
if (nextProps.basicInfo !== this.props.basicInfo) {
this.setState({ basicInfo: nextProps.basicInfo });
}
}