4 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
發(fā)生這種情況是因?yàn)槊總€(gè) setState 都會(huì)觸發(fā)一次渲染,然后再次觸發(fā)一次 componentDidMount,這基本上會(huì)導(dǎo)致無(wú)限循環(huán)。要停止該循環(huán),您需要設(shè)置一些條件,以防止再次渲染,例如
componentDidUpdate(previousProps, previousState) {
if (previousProps.data !== this.props.data) {
this.setState({/*....*/})
}
}

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
我遇到了同樣的錯(cuò)誤。在使用效果方法中,我使用 axios 從后端獲取數(shù)據(jù)并更新了狀態(tài)。但在更新?tīng)顟B(tài)之前,我沒(méi)有將 json 數(shù)據(jù)轉(zhuǎn)換為狀態(tài)的數(shù)據(jù)類(lèi)型,這就是導(dǎo)致此錯(cuò)誤的原因。
錯(cuò)誤代碼 :
Useeffect(() => {
fetch
.then((res) =>{
setDate(res.data.date)
})
})
正確代碼:
Useeffect(() => {
fetch
.then((res) =>{
setDate(new Date(res.data.date))
})
})

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
看來(lái)你想在 props 改變時(shí)改變狀態(tài)來(lái)過(guò)濾一些產(chǎn)品。我刪除componentDidUpdate代碼并在組件中添加一個(gè)方法來(lái)進(jìn)行過(guò)濾,然后我將從父組件中調(diào)用該方法
class MyComponent extends Component {
constructor(props) {
super(props);
this.state = {
matchtedProducts: [],
products: [],
}
}
async componentDidMount() {
try {
const products = await getProducts()
this.setState({ products })
} catch(err) {
console.log(err)
}
}
updateMatches = () => {
const productColor = this.props.size.trim().toLowerCase()
const productSize = this.props.color.trim().toLowerCase()
const matches = []
this.state.products.map(product => {
const title = product.title
const titleSpliitet = title.split(',')
let color = titleSpliitet[1].trim().toLowerCase()
let size = titleSpliitet[2].trim().toLowerCase()
if(color == productColor && size == productSize) {
matches.push(product)
}
})
this.setState({matchtedProducts: matches})
}
render() {
return (<div></div>)
}
}
并在父組件中
changeSizeAndColor = () => {
//note that I called updateMatches of MyComponent
this.setState({color : ... , size : ...} , () => this.myComponent.updateMatches());
}
render() {
return <MyComponent ref={ref => this.myComponent = ref} color={...} size={...}/>
}

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
我認(rèn)為你必須傳遞prevProps和/或prevState作為 的參數(shù)componentDidUpdate,并且僅當(dāng)狀態(tài)的 prop 或?qū)傩园l(fā)生更改時(shí)才執(zhí)行代碼,
例子:
componentDidUpdate(prevProps, prevState) {
// if the property count of the state has changed
if (prevState.count !== this.state.count) {
// then do your code
}
}
文檔:https ://en.reactjs.org/docs/react-component.html#componentdidupdate
添加回答
舉報(bào)