#javascript #reactjs #react-native
#javascript #reactjs #react-native
Вопрос:
Вот мой пример кода…при этом большинство вещей удалены…
class MyView extends Component {
aFlag = true //initialize class variable here
componentDidMount() {
// for some reason even after this component unmounts and mounts again this class variable stays at false (a value that we set in this compoment at some point)...
this.aFlag = true // (1) ***** IF I TAKE THIS OUT...the console log for this.aFlag below is FALSE
console.log('this', this) // (2) shows a MyView Object, aFlag key has value FALSE!!!
console.log('this.aFlag:', this.aFlag)// (3) this console log show TRUE
//other code here that uses this.aFlag removed...
}
...
renderItem = () => {
//other code removed...
if (some condition) this.aFlag = false
}
render(){
<Flatlist
renderItem={this.renderItem}
...other code removed
/>
}
У меня есть простой класс с переменной класса, инициализированной значением true в определении класса.
Вот что происходит. Создайте экземпляр компонента …componentDidMount регистрирует то, что я показываю выше в комментариях. Почему это так?
Почему журнал консоли this
отображается aFlag
как false
Что такое консоль.журнал this.aFlag
ссылок?
У меня проблема с областью действия?
Комментарии:
1. Почему это так? Разве переменная класса не инициализируется?
Ответ №1:
посмотрите на диаграмму жизненного цикла здесь. кажется renderItem
, выполняется раньше componentDidMount()
Ответ №2:
Ваша проблема в том, что componentDidMount
вызывается после render
. Если вы установите для него значение false, render
тогда оно будет false componentDidMount
.
Вы можете использовать constructor
вместо этого, если это проблема, как она вызывалась ранее render
.
Источник: https://reactjs.org/docs/react-component.html#componentwillmount
Комментарии:
1. Даже если я перенесу это в конструктор, я все равно вижу это как false .
2. Тогда в коде, который вы удалили, есть что-то, что влияет на него.
3. Можете ли вы посмотреть на (1), (2) и (3)? Я установил флаг в (1), но вход в консоль (2) показывает и объект с этим ключом как false … НО (3) консоль регистрирует это. Ошибка … и это по какой-то причине верно. (В этих строках кода нет никаких асинхронных элементов)