您应该在 componentDidMount 中发出请求,因为在 componentWillMount 中不应发出任何副作用请求。在 componentWillMount 中设置状态很好,如果在 componentDidMount 中设置状态,您将立即触发第二次重新渲染。
你会读到它是一种反模式 (UGHHH) 并且一些 linter 禁止它 (eslint-react-plugin),但我不会太关注它,因为有时它是与 DOM 交互的唯一方式。如果您使用关联的 babel 阶段,您可以在 willMount 或方法属性( state = { } )中设置默认状态
正如您所说,组件将已经渲染一次,但这很好,因为您可以显示某种加载器或资源正在加载的任何其他形式的信息。
class MyComp extends Component {
// What I do with stage 0
state = { mystate: 1 }
// What you might want to do if you're not
// on the experimental stage, no need to do
// the whole constructor boilerplate
componentWillMount() {
this.setState({ mystate: 1 });
}
componentDidMount() {
dispatch(yourAction());
// It's fine to setState here if you need to access
// the rendered DOM, or alternatively you can use the ref
// functions
}
render() {
if (!this.props.myCollection) return <Loader />
return (
<div> // your data are loaded </div>
)
}
}