![](/img/trans.png)
[英]Reactjs - Setting State from props using setState in child component
[英]Reactjs child component goes into infinite loop on setting state array provided by parent in props
父元素從服務器獲取數組並在 props 中提供子元素以顯示數組(門票)。
render() {
return (
<div style={outerBoundary}>
<ShowArray tickets={this.state.tickets}/>
</div>
)
}
render() {
const { classes } = this.props;
var tablePadding = {
'padding':'1em',
}
this.setState({
tickets:this.props.tickets,
});
return (
<div>
<Paper className={classes.root} style={tablePadding}>
<Typography variant="title" id="tableTitle">
Array Elements
</Typography>
{this.state.tickets && this.state.tickets.length > 0 && this.state.tickets.map((n, index) => {
console.log(n, index)
return (
<TableRow> n.id </TableRow>
);
})}
)
}
我面臨的問題是票 state,我使用道具的值在子元素中設置進入無限循環。
this.setState({
tickets:this.props.tickets,
});
您不能在render
函數中調用setState
this.setState({
tickets:this.props.tickets,
});
由於setState
函數導致重新渲染,因此在下一次渲染時,您將再次調用setState
,並且您需要再次重新渲染,因此這就是循環的原因
不要在渲染中設置狀態。 您可以改為映射道具:
render() {
const { classes } = this.props;
var tablePadding = {
'padding':'1em',
}
return (
<div>
<Paper className={classes.root} style={tablePadding}>
<Typography variant="title" id="tableTitle">
Array Elements
</Typography>
{this.props.tickets.map((n, index) => {
console.log(n, index)
return (
<TableRow> n.id </TableRow>
);
})}
)
}
請從子級的render方法中刪除this.setState,然后在子級組件中嘗試以下操作,
static getDerivedStateFromProps(nextProps, prevState) {
if(nextProps.tickets){
return {
tickets: tickets
}
}
}
在子組件的渲染中,
render() {
const { classes } = this.props;
const { tickets } = this.state;
var tablePadding = {
'padding':'1em',
.
.
.
.
}
嘗試這個...
為了擴展其他人所說的內容,您在render
方法中使用setState
。
看來您正在使用props
更改state
this.setState({
tickets:this.props.tickets,
});
在您的代碼中,您不需要這樣做,可以使用this.props.
直接代替this.state.tickets
中的jsx
。
但是,如果您需要根據道具更新狀態,則應使用getDerivedStateFromProps
這樣,您可以編寫這樣的static
方法
static getDerivedStateFromProps(props) {
return {
tickets: props.tickets
}
}
getDerivedStateFromProps
的返回值用於更新狀態。 在這種情況下,將使用props.tickets
的值更新state
為tickets
鍵。
為避免無限循環,請調用useEffect
並將[this.props.tickets]
作為第二個參數傳入。
第一個參數中的 lambda 將僅在this.props.tickets
更改值時調用,限制 state 更新的次數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.