Как я могу получить доступ к состоянию моего компонента через деструктуризацию?
Я пытаюсь получить доступ к значению this.state.timeRemaining из функции componentWillMount(). Я деструктурировал объект this.state и переименовал значение в "swag". Я ожидаю, что мой оператор console.log() выведет "5" (так как я установил состояние и запустил этот оператор print в функции обратного вызова), но вместо этого будет напечатано значение "null". Я считаю, что это проблема, связанная с деструктуризацией, поскольку я могу вывести "5", используя вместо этого this.state.timeRemaining в операторе console.log(). Есть идеи, почему это? Это как-то связано с контекстом?
class Favr extends Component {
constructor(props) {
super(props);
this.state = {detailsAreShowing: false, timeRemaining: null};
this.showDetails = this.showDetails.bind(this);
}
componentWillMount() {
const { timeRemaining: swag } = this.state;
const { favr: {expirationTime} } = this.props;
let remainingTimeInMil = expirationTime.getTime() - Date.now();
this.setState({timeRemaining: 5}, () => {
console.log(swag); // prints null
});
...
}
...
}
2 ответа
Существует проблема с вашим пониманием и использованием переменных и ссылок в JS.
Разрушением / деконструкцией
const {timeRemaining: swag} = this.state
, вы создаете новую переменнуюswag
, Эта переменная будет выделена новая память, обновлениеtimeRemaining
не изменит значениеswag
на момент назначения,timeRemaining
имеет значениеnull
, Назначение по ссылке работает только сobject
в JS.Кроме того, не имеет прямого отношения к вашему вопросу, но стоит знать, что никогда не стоит использовать
componentWillMount
сReact
, Этот метод жизненного цикла устарел с момента реакции 16.3: https://reactjs.org/docs/react-component.html.
Это потому, что вы читаете объявленную переменную в первой строке componentWillMount
метод, который не обновляется. Даже если вы не переименуете его, он напечатает null
также. Когда ты читаешь this.state.timeRemaining
снова это обеспечивает обновленное значение.