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

时间:2017-10-21 21:08:08

标签: javascript reactjs

我有一个react组件,它会显示一个封面列表和一个按钮,用于从onClick列表中删除该书。我将删除操作通过地图调度传递给道具,书架信息通过地图状态传递给道具。删除操作已成功从数据库中删除该书,并且正在击中我的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);
&#13;
&#13;
&#13;

我尝试了一些生命周期方法,例如在ComponentWillReceiveProps中获取所有书架,但没有更改。

1 个答案:

答案 0 :(得分:0)

我有一种强烈的怀疑,我知道会发生什么事情 - 你是否有机会推动你保持状态然后设置状态的阵列副本?当您推送到一个数组(或将一个项目添加到一个集合或类似的东西)时,您仍然在内存中使用相同的列表对象(尽管具有不同的内容)。 React正在检查是否有新列表,它看到旧列表,看到新列表,并说&#34;嘿,那些是内存中的相同对象,所以因为它们是相同的我甚至不需要触发shouldComponentUpdate

我已经生成了此行为的最小示例,因此您可以看到它的实际效果: https://codesandbox.io/s/nrk07xx82j

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

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

希望有所帮助!

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