gpt4 book ai didi

javascript - 如何强制React组件删除后重新渲染

转载 作者:行者123 更新时间:2023-12-01 02:52:45 25 4
gpt4 key购买 nike

我有一个 react 组件,它呈现封面列表和一个用于从单击列表中删除该书的按钮。我通过 map 调度将删除操作传递给 props,并通过 map 状态将书架信息传递给 props。删除操作成功地从数据库中删除了这本书,并且正在影响我的 reducer 。但即使状态更新,图书列表组件也不会重新渲染(除非重新加载,否则删除的图书不会消失)。

import React from 'react';
import { Link, withRouter } from 'react-router-dom';
import {CarouselProvider, Slider, Slide, ButtonBack, ButtonNext, Image, Dot} from 'pure-react-carousel';
class BookshelfIndexItem extends React.Component {

constructor(props){
super(props);

}

render() {
return(
<div>
<h3 className='shelf-title'>{this.props.bookshelf.name}</h3>
<CarouselProvider
naturalSlideWidth={135}
naturalSlideHeight={250}
totalSlides={this.props.bookshelf.book_ids.length}
visibleSlides={3}>

<Slider style={{height: '240px', display: 'flex', 'justifyContent': 'space-between'}}>
{this.props.bookshelf.book_ids.map((id, index) =>(<Slide index={index}
key={id} style={{'width': '150px','display': 'flex','alignItems': 'center', 'margin': '0 50px'}}>
<Link to={`/books/${id}`}>
<Image style={{height: '200px', width: '140px'}} src ={this.props.books[id].image_url}></Image>
</Link>
<button style={{height: '35px', 'marginLeft': '55px', 'marginTop': '5px'}}
onClick={() => this.props.deleteBookFromBookshelf({book_id: id, bookshelf_id: this.props.bookshelf.id})}>
X
</button>
</Slide>))}
</Slider>
<div className='slider-button-container'>
<ButtonBack className='slider-button'>back</ButtonBack>
<ButtonNext className='slider-button'>next</ButtonNext>
</div>
</CarouselProvider>
</div>
);
}
}

export default withRouter(BookshelfIndexItem);

我尝试了一些生命周期方法,例如获取 ComponentWillReceiveProps 中的所有书架,但没有任何变化。

最佳答案

我强烈怀疑我知道发生了什么 - 你是否有可能推送到你保持状态的数组的副本,然后为其设置状态?当您推送到数组(或将项目添加到集合或类似的内容中)时,您最终仍然会在内存中得到相同的列表对象(尽管内容不同)。 React 正在检查是否有新列表,它会看到旧列表,看到新列表,并说“嘿,这些是内存中的同一个对象,所以因为它们是相同的,所以我什至不需要触发shouldComponentUpdate

我制作了此行为的一个最小示例,以便您可以看到它的实际效果: https://codesandbox.io/s/nrk07xx82j

如果您点击第一个按钮,您可以在控制台中看到新状态实际上是正确的,但渲染的列表永远不会更新(因为我上面讨论过)。

但是,如果您使用数组解构([...list]),您最终会返回相同的数组内容,但在一个新的数组对象中,触发 react 更新。

希望有帮助!

忍者编辑:意识到我可以更具体,因为你正在谈论删除项目 - Array.popArray.splice() 两者的行为方式相同,您仍在处理内存中的同一对象,因此不会触发组件更新。

关于javascript - 如何强制React组件删除后重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46868092/

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