扫码关注官方订阅号
根据文档说法,从后台获取数据一定要放在componentDidMount里面调用,为什么不能在constructor或者componentWillMount里面调用?有什么不同?
ringa_lee
constructor()中获取数据的话,如果时间太长,或者出错,组件就渲染不出来,你整个页面都没法渲染了。componentDidMount()中能保证你的组件已经正确渲染。
1、通常我在componentWillMount发送ajax(渲染dom之前做的操作)
2、componentDidMount也可以做ajax操作(渲染dom完成之后做的操作)
那么,这2种情况如何区分呢?
需求1:
当你的render函数需要有数据才能渲染的时候,就在componentWillMount做操作。
render() { return data && <p>{data}</p> }
需求2:
当你的render不需要数据,先渲染dom结构,就在componentDidMount操作。
render() { const { data } = this.props return ( <p> <span>我要先渲染</span> <span>{data || ''}</span> </p> ) }
你既然了解的周期的顺序,那就很好理解了啊!willMount在dom没有渲染前先进行的方法,如果这个时候请求ajax那么势必会有等待的这一刻,然后排队渲染dom,而didMount是在dom加载后在进行的方法,而这个时候请求ajax前面没有任何等待,直接请求,然后如果你setState那么整个虚拟dom会在此渲染,此时再将获得的数据进行渲染,这样就感觉很顺的就执行下去了。而再次渲染的同时大部分的dom都是没有改变的,只有部分改变,所以渲染的速度会很快
willMount
ajax
didMount
setState
虚拟dom
因为有很多前置工作要做
感谢各位的回答:总结一下不建议在constructor和componentWillMount里写的原因是
会阻碍组件的实例化,阻碍组件的渲染
如果用setState,在componentWillMount里面触发setState不会重新渲染
而在React Redux中,由于触发的渲染方式不同,是可以不需透过React组件的生命周期方法,所以我感觉可以在生命周期的任何地方调用。当然,在consttructor和componentWillMount还是会阻碍一点点组件的实例化和渲染。
是可以不需透过React组件的生命周期方法
由于@eyesofkids写的全面一点,我采纳他的了。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
constructor()中获取数据的话,如果时间太长,或者出错,组件就渲染不出来,你整个页面都没法渲染了。
componentDidMount()中能保证你的组件已经正确渲染。
1、通常我在componentWillMount发送ajax(渲染dom之前做的操作)
2、componentDidMount也可以做ajax操作(渲染dom完成之后做的操作)
那么,这2种情况如何区分呢?
需求1:
需求2:
你既然了解的周期的顺序,那就很好理解了啊!
willMount在dom没有渲染前先进行的方法,如果这个时候请求ajax那么势必会有等待的这一刻,然后排队渲染dom,而didMount是在dom加载后在进行的方法,而这个时候请求ajax前面没有任何等待,直接请求,然后如果你setState那么整个虚拟dom会在此渲染,此时再将获得的数据进行渲染,这样就感觉很顺的就执行下去了。而再次渲染的同时大部分的dom都是没有改变的,只有部分改变,所以渲染的速度会很快因为有很多前置工作要做
感谢各位的回答:
总结一下不建议在constructor和componentWillMount里写的原因是
会阻碍组件的实例化,阻碍组件的渲染
如果用setState,在componentWillMount里面触发setState不会重新渲染
而在React Redux中,由于触发的渲染方式不同,
是可以不需透过React组件的生命周期方法,所以我感觉可以在生命周期的任何地方调用。当然,在consttructor和componentWillMount还是会阻碍一点点组件的实例化和渲染。由于@eyesofkids写的全面一点,我采纳他的了。