我正在构建一种电子商务应用程序。众所周知,每个电子商务应用程序都有愿望清单功能。在我的产品列表中,卡片项目上有一个点赞按钮。当用户单击它时,它会调用 API 将isLiked
属性设置为true
(布尔值)并更新数据库。
当用户单击该卡片项目时,它应该将他导航到它的详细信息页面,该页面也有类似按钮。我在...中调用详细 API 是componentDidMount
这样的:
如果from detail APIred
的属性是 ,我应该用颜色渲染 like 按钮。因此,为此,我在构造函数中使用 props 值设置我的状态:isLiked
true
constructor(props) {
super(props);
this.state = {
isLikedForCompare: this.props.detailProduct.is_liked, // true
isLiked: this.props.detailProduct.is_liked, // true
selectedItem: ''
};
}
我添加isLikedForCompare
比较是因为我们无法this
在 getDerivedStateFromProps 中访问。
static getDerivedStateFromProps(nextProps, prevState) {
let defaultItem = ''
// some code to get default item
const { is_liked: isLiked } = nextProps.detailProduct;
let selected = {};
if (prevState.selectedItem === '') {
selected = {
selectedItem: defaultItem,
};
}
return {
...selected,
isLiked: prevState.isLikedForCompare !== isLiked ? isLiked : prevState.isLikedForCompare
};
}
我有那个selectedItem
总是满足条件的代码块,因为初始值总是空的。这段代码适用于其他功能,所以我需要让他们不管,这就是为什么我的代码是这样的。所以,继续……现在我可以isLiked
从道具中获得价值。在我看来,点赞按钮现在是红色的。但问题是当我单击该按钮时。我的期望是当我单击该按钮时,按钮变为白色,因为我只是使用更改我的状态,this.setState
但为什么在 setState 之后调用 getDerivedStateFromProps?
这是一个问题,因为:
isLiked: prevState.isLikedForCompare !== isLiked ? isLiked : prevState.isLikedForCompare
将永远是错误的。所以我的状态isLike
永远都是真的!
如何解决这个问题?