当前位置: 首页 > Web前端 > JavaScript

小程序填坑,子组件componentWillReceiveProps一直触发打印

时间:2023-03-27 15:48:50 JavaScript

背景:父组件a传值给子组件b,当a有新数据时,b组件会重新渲染,但是我发现时间上没有变化传给b组件的值,b组件的componentWillReceiveProps钩子函数依然一直打印。子组件componentWillReceiveProps(nextProps){if(nextProps.timeAxisArr.toString()!=this.props.timeAxisArr.toString()){//没有变化就不要动console.log('Change');if(nextProps.timeAxisArr.length>5){this.setState({timeAxisArrNomore:nextProps.timeAxisArr.slice(0,5),statusMore:'more',})}else{this.setState({timeAxisArrNomore:nextProps.timeAxisArr,statusMore:'noMore',})}}else{console.log('nochange');}}父组件在render()中调用了renderIdCardBtn(),在这个函数中操作state值{/*上传身份证按钮,优先显示上传身份证按钮和签名按钮*/}{car??dsContent.idCardStatus===1&&caseStatus==30?{this.renderIdCardBtn()}:null}//该方法已运行staterenderIdCardBtn(){//调解时,当有签名和上传的身份证时,会显示上传的身份证first,上传提交后会显示签名条目。const{caseStatus,cardsContent}=this.stateletviewBoxif(cardsContent.idCardStatus===1&&caseStatus==30){this.setState({isShowIdBtn:true},()=>{viewBox=(上传我的身份证)})}else{this.setState({isShyowIdBtn:false})}returnviewBox}稍后查看经过一番了解:发现我在render()中操作state中的值,导致componentWillReceiveProps一直刷新:props变化时执行,render初始化时不执行。在这个回调函数中,你可以根据属性的变化,通过调用this.setState()来更新你的组件状态。旧的属性仍然可以通过this.props获取。在这里调用更新状态是安全的,不会触发额外的渲染。调用render()方法是很纯粹的,就是不在这个方法中初始化组件的状态,每次执行返回相同的值,不读写DOM,不和服务器交互,如果必须交互与服务端,在componentDidMount()方法中实现,或者在其他生命周期方法中实现,保持render()方法的纯粹,让服务端更准确,组件更简单参考:https://blog.csdn.net/wangche...https://blog.csdn.net/halo141...