gpt4 book ai didi

javascript - getDerivedStateFromProps,在改变 Prop 的影响下改变状态

转载 作者:数据小太阳 更新时间:2023-10-29 05:34:30 24 4
gpt4 key购买 nike

我点击 Item -> 我从 url:https://app/api/v1/asset/${id} 获取数据。数据保存在 loadItemId 中。我正在将 loadItemId 从组件 Items 移动到组件 Details,然后移动到组件 AnotherItem。每次我单击 Item 时, Prop loadItemId 都会在 getDerivedStateFromProps 方法中发生变化。问题:我将单击 Element D -> 我在 console.log 中看到“true”,然后我将单击 Element E --> 它显示在 console.log 中truefalse同时显示,应该只显示false

尝试创建一个三元运算符 {this.state.itemX ['completed'] ? this.start () : ''}.如果{this.state.itemX ['completed']调用函数this.start()

代码在这里:stackblitz

图片:https://imgur.com/a/OBxMKCd

项目

class Items extends Component {
constructor (props) {
super(props);
this.state = {
itemId: null,
loadItemId: ''
}
}

selectItem = (id) => {
this.setState({
itemId: id
})

this.load(id);
}

load = (id) => {

axios.get
axios({
url: `https://app/api/v1/asset/${id}`,
method: "GET",
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => {
this.setState({
loadItemId: response.data
});
})
.catch(error => {
console.log(error);
})
}

render () {
return (
<div >
<Item
key={item.id}
item={item}
selectItem={this.selectItem}
>
<Details
loadItemId={this.state.loadTime}
/>
</div>
)
}

项目

class Item extends Component {
render () {

return (
<div onClick={() => this.props.selectItem(item.id}>

</div>
)
}
}

详情

class Details extends Component {
constructor() {
super();
}

render () {
return (
<div>
<AnotherItem
loadItemId = {this.props.loadItemId}
/>
</div>
)
}
}

另一个项目

class AnotherItem extends Component {


constructor() {
super();

this.state = {
itemX: ''
};
}


static getDerivedStateFromProps(nextProps, prevState) {
if(nextProps.loadItemId !== prevState.loadItemId) {
return { itemX: nextProps.loadItemId }
}

render () {
console.log(this.state.itemX ? this.state.itemX['completed'] : '');

{/*if this.state.loadX['completed'] === true, call function this.start()*/ }
return (
<button /*{this.state.loadX['completed'] ? this.start() : ''}*/ onClick={this.start}>
Start
</button>
);
}
}

最佳答案

这里:

selectItem = (id) => {
this.setState({
itemId: id
})

this.load(id);
}

您调用 setState(),然后“Item”、“Details”和“AnotherItem”调用它们的渲染方法。所以您会看到之前“loadItemId”的日志。

当“加载”方法完成时。这里:

 this.setState({
loadItemId: response.data
});

您再次 setState(),然后“Item”、“Details”和“AnotherItem”再次调用它们的渲染方法。此时您会看到新“loadItemId”的日志。


解决方案

setState 将两种状态放在一处。加载方法完成后,而不是:

 this.setState({
loadItemId: response.data
});

写:

 this.setState({
itemId: id,
loadItemId: response.data
});

并删除:

this.setState({
itemId: id
})

来自“selectItem”方法。

关于javascript - getDerivedStateFromProps,在改变 Prop 的影响下改变状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57005076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com