2017-02-15 3 views
6

Я не могу понять, как сделать мой компонентный повторный рендер при изменении значения this.props.user. Первоначально значение this.props.user имеет значение null, но оно изменяется на фактическое значение через секунду после. Ниже я показываю дочерний компонент. Родительский компонент отображает состояние хранилища на его реквизит, и я передаю его классу дочерних компонентов ниже.React use componentWillReceiveProps для повторной обработки компонента

export class UserInfoComponent extends Component { 
    constructor(props){ 
    super(props); 
    this.state = {user: this.props.user} 
    } 

    componentWillReceiveProps(){ 
    this.setState({user: this.props.user}) 
    } 

    render() { 
    if(this.state.user) 
    return (
     <h1>{this.state.user.firstName}</h1> 
    ); 

    return (
     <h1>loading</h1> 
    ) 
    } 
} 

ответ

18

componentWillReceiveProps получает nextProps в качестве аргумента. с кодом, который вы сейчас используете, вы просто устанавливаете пользователя обратно в его текущее состояние. Вы должны использовать аргумент nextProps.

export class UserInfoComponent extends Component { 
    constructor(props){ 
    super(props); 
    this.state = {user: this.props.user} 
    } 

    componentWillReceiveProps(nextProps){ 
    this.setState({user: nextProps.user}) 
    } 

    render() { 
    if(this.state.user) 
    return (
     <h1>{this.state.user.firstName}</h1> 
    ); 

    return (
     <h1>loading</h1> 
    ) 
    } 
} 
+0

Зачем пользоваться государством? Изменение реквизита уже приведет к повторной обработке компонента. – FurkanO

+0

Основное отличие здесь состоит в том, что в примере опроса они преобразуют переданные в реквизиты свои собственные внутренние состояния. Это происходит только один раз, когда компонент визуализируется так, что ссылка «this.state.user», на которую ссылается, всегда ссылается на первое значение, которое когда-либо передавалось, поскольку оно происходит во время построения компонента. 'componentWillReceiveProps' обновляет состояние, когда родительский компонент прошел в новых реквизитах, но это не происходит естественно и почему преобразование реквизита в состояние обычно является анти-шаблоном – finalfreq

+0

. Могу сказать, что вам не нужно слушать изменения реквизита для перекомпоновки компонента. Вопрос может и не знать этого. Я не спрашивал об этой разнице. – FurkanO

Смежные вопросы