react父組件更改props子組件無(wú)法刷新原因及解決方法
項(xiàng)目場(chǎng)景:
使用過(guò)vue的朋友都知道,vue父組件更改props的值,子組件是會(huì)刷新的,而react就未必。
先看以下例子:
1、創(chuàng)建父組件
antd-mobile依賴需要自行引入
export default class Parent2 extends Component {
constructor(props){
super(props)
//初始化state
this.state={
parentVal: 10,
}
}
count=1
handleClick=()=>{
this.setState({
parentVal:this.state.parentVal+1
})
}
changeCount=()=>{
this.count=this.count+1
console.log(this.count)
}
componentDidMount() {
console.log("父組件生命周期======:Mount")
}
//掛載完成后更新?tīng)顟B(tài)值,render()結(jié)束后會(huì)執(zhí)行componentDidUpdate()鉤子函數(shù)
componentDidUpdate(prevProps, prevState, snapshot) {
console.log("父組件生命周期======:Update")
}
componentWillUnmount() {
console.log("父組件生命周期======:Unmount")
}
render() {
console.log("父組件生命周期======:render")
return (
<div>
父組件
<p>{this.state.parentVal}</p>
<Divider>分割線</Divider>
<Button color='primary' size='small' onClick={this.handleClick}>更改state的值</Button>
<p>父組件調(diào)用setState()時(shí),子組件也會(huì)執(zhí)行render()方法,</p>
<Button color='primary' size='small' onClick={this.changeCount}>更改count的值</Button>
<Child2 number={this.state.parentVal} count={this.count}/>
</div>
)
}
}
2、創(chuàng)建子組件
export default class Child2 extends Component {
constructor(props){
super(props)
}
componentDidMount() {
console.log("子組件生命周期======:Mount")
}
//掛載完成后更新?tīng)顟B(tài)值,render()結(jié)束后會(huì)執(zhí)行componentDidUpdate()鉤子函數(shù)
componentDidUpdate(prevProps, prevState, snapshot) {
console.log("子組件生命周期======:Update")
}
componentWillUnmount() {
console.log("子組件生命周期======:Unmount")
}
render() {
console.log("子組件生命周期======:render")
return (
<div style={{background:'yellow',padding:20}}>
<p>父組件state中傳值:{this.props.number}</p>
<p>父組件非state中傳值:{this.props.count}</p>
</div>
)
}
}問(wèn)題描述
這里有兩個(gè)變量,一個(gè)count,不是父組件state中的值,一個(gè)numer是父組件state中的值。
點(diǎn)擊更改‘更改state的值’按鈕,父子組件同步刷新,而點(diǎn)擊更改count的值按鈕,子組件不會(huì)刷新
原因分析:
父組件更改count的值,雖然父組件count值改變,但是不會(huì)更改子組件的值,props是單向傳遞的
情況組件掛載生命周期鉤子函數(shù)執(zhí)行控制臺(tái)打印數(shù)據(jù)

父組件執(zhí)行setState()結(jié)果:

- 要想讓子組件更新dom,必須讓子組件執(zhí)行render()方法,而父組件執(zhí)行render()方法后,子組件也會(huì)執(zhí)行render()方法,這就是為何父組件調(diào)用了setSate()方法,子組件會(huì)刷新。
- 當(dāng)更改了count的值,比如count連續(xù)加1,變成了9,此時(shí)父組件調(diào)用this.setState()更改狀態(tài)值,
此時(shí)子組件的count也變成了9,因?yàn)閏ount并沒(méi)有清除,父子組件又先后調(diào)用了render()方法,因此渲染上了最新的props的屬性值
如果子組件是函數(shù)組件,則render后,count值會(huì)變?yōu)槌跏贾?,那么父組件setState()之后,子組件render()函數(shù)執(zhí)行時(shí)收到的還是最初的值,這和子組件是類組件有區(qū)別,大家可以自己嘗試,
解決方案:
如果想要傳遞子組件的props改變后刷新子組件dom,就要將父組件的state中的值傳給子組件,而不是將普通的變量傳遞給子組件
vue更改props的值子組件會(huì)刷新,因?yàn)関ue中傳遞給props的值也是父組件狀態(tài)中的變量
到此這篇關(guān)于react父組件更改props子組件無(wú)法刷新原因的文章就介紹到這了,更多相關(guān)react父組件更改props子組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在React中實(shí)現(xiàn)txt文本文件預(yù)覽的完整指南
在前端開(kāi)發(fā)中,從遠(yuǎn)程 URL 加載并預(yù)覽文本文件是一項(xiàng)實(shí)用且常見(jiàn)的功能,今天,我將帶你深入剖析一個(gè) React 組件 TextViewerURL,它通過(guò) URL 加載文本文件,支持多種編碼),并搭配精心設(shè)計(jì)的樣式,讓文本展示更美觀、交互更友好,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-03-03
React實(shí)現(xiàn)類似于Vue中的插槽的項(xiàng)目實(shí)踐
本文主要介紹了React實(shí)現(xiàn)類似于Vue中的插槽的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
React實(shí)現(xiàn)控制減少u(mài)seContext導(dǎo)致非必要的渲染詳解
這篇文章主要介紹了React如何有效減少使用useContext導(dǎo)致的不必要渲染,使用useContext在改變一個(gè)數(shù)據(jù)時(shí),是通過(guò)自己逐級(jí)查找對(duì)比改變的數(shù)據(jù)然后渲染,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11
詳解如何使用React Hooks請(qǐng)求數(shù)據(jù)并渲染
這篇文章主要介紹了如何使用React Hooks請(qǐng)求數(shù)據(jù)并渲染,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
React?高階組件與Render?Props優(yōu)缺點(diǎn)詳解
這篇文章主要weidajai?介紹了React?高階組件與Render?Props優(yōu)缺點(diǎn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
解決React報(bào)錯(cuò)Style prop value must be a
這篇文章主要為大家介紹了React報(bào)錯(cuò)Style prop value must be an object解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

