Почему рендеринг компонента до того, как this.setState () завершил установку состояния?

import string, random

source = string.hexdigits[:16]
result = ''
while len(result) < 12 :
    idx = random.randint(0,len(source))
    if len(result) < 3 or result[-1] != result[-2] or result[-1] != source[idx] :
        result += source[idx]
0
задан Frank van Puffelen 19 January 2019 в 04:22
поделиться

2 ответа

Это связано с тем, что действия setState являются асинхронными и пакетируются для повышения производительности. Это объясняется в документации setState.

setState () не изменяет немедленно this.state, но создает ожидающий переход в состояние. Доступ к this.state после вызова этого метода может потенциально вернуть существующее значение. Нет гарантии синхронной работы вызовов к setState, и вызовы могут быть сгруппированы для увеличения производительности.

Так что вы можете сделать что-то вроде этого,

this.setState({foo: 'bar'}, () => { 
// Do something here. 
});
0
ответ дан Saurabh Narhe 19 January 2019 в 04:22
поделиться
async componentDidMount() {
  const { user, roomName } = this.props.navigation.state.params
  await this.props.getRoom(roomName)
  this.setState({
    room: this.props.room
  })
}

В этом случае вам не нужно использовать местное государство.

 render() {
 const {room: {name}} = this.props;

 return (
  <View style={styles.container}>
    <ScrollView contentContainerStyle={styles.contentContainer}>
      <View>
        <Text>Room name: {name}</Text>
      </View>
   </ScrollView>
  </View>
  )
 }

Здесь, поскольку вы используете redux (глобальное состояние), вам не нужно добавлять его в локальное состояние. Вы можете напрямую получить доступ к стоимости комнаты из реквизита.

0
ответ дан prabin badyakar 19 January 2019 в 04:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: