如何强制反应组件在删除后重新渲染

如何强制反应组件在删除后重新渲染

问题描述:

我有一个反应组件,它呈现一个封面列表和一个按钮,用于从列表onClick中删除该书。我通过地图派发将道具和书架信息通过地图状态传递给道具。删除操作正在成功从数据库中删除该书,并正在击中缩减器。但即使状态更新,书目列表组件也不会重新呈现(删除的书不会消失,除非我重新加载)。如何强制反应组件在删除后重新渲染

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获取所有的书架,但没有任何变化。

+0

你能告诉我们连接到商店的组件吗? – Jaxx

+0

您正在映射'this.props.bookshelf.book_ids'。你如何创建该数组?你确定它正在更新吗? – mduleone

+0

我在后端创建该数组作为我的jbuilder视图的一部分。我认为它没有正确更新。我试图让我的Reducer在收到从书架上删除书籍操作后更新它。 –

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

我产生这种行为的一个小例子,这样你就可以在行动中看到它: https://codesandbox.io/s/nrk07xx82j

如果你打的第一个按钮,就可以在新的状态是在控制台中看到事实正确,但渲染列表从不更新(因为我上面讨论过)

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

希望有帮助!

忍者编辑:实现,因为你是在谈论删除项目我能更具体 - Array.popArray.splice()以同样的方式既表现,你还在处理内存中的同一个对象,因此不会触发组件更新。