Недавно я наткнулся на следующий код:
import { Component } from 'react';
import { connect } from 'react-redux';
import { setUser } from './store';
const doSomeSideEffect = ({ firstName, lastName }) => document.title = `Hello ${firstName} ${lastName}`;
class App extends Component {
state = {
isLoading: false
}
async componentDidMount() {
console.log(this.props.user); // some initial state like: { firstName: undefined, lastName: undefined, isAuthorized: false }
if (!this.props.user.isAuthorized) await this.loadData();
console.log(this.props.user); // { firstName: 'Foo', lastName: 'Bar', isAuthorized: true }
doSomeSideEffect(this.props.user);
}
async loadData() {
this.setState({ isLoading: true });
const data = await new Promise(resolve => setTimeout(() => resolve({ firstName: 'Foo', lastName: 'Bar', isAuthorized: true }), 5000));
this.props.setUser(data);
this.setState({ isLoading: false });
}
render() {
return this.state.isLoading ? 'Loading' : 'Loaded';
}
}
export default connect(user => ({ user }), { setUser })(App);
Я знаю, что в конце концов это просто обычный Javascript, но меня смутила ссылка на this.props
после await
в componentDidMount
, и этона самом деле код работает как положено.Кто-нибудь может сказать, является ли это хорошей или плохой практикой ссылаться на реквизит таким образом и почему?Разве это не относится к состоянию гонки?