首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在删除后强制deletion组件重新呈现

如何在删除后强制deletion组件重新呈现
EN

Stack Overflow用户
提问于 2017-10-21 21:08:08
回答 1查看 2.7K关注 0票数 1

我有一个react组件,它呈现一个封面列表和一个从list onClick中删除图书的按钮。我是在通过地图发送到道具删除操作和书架信息通过地图状态到道具。删除操作正在成功地从数据库中删除图书,并且正在击中我的还原器。但是即使状态更新,图书列表组件也不会重新呈现(除非我重新加载,否则删除的书不会消失)。

代码语言:javascript
复制
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中获取所有的书架,但是没有改变。

EN

回答 1

Stack Overflow用户

发布于 2017-10-21 23:32:50

我有一个强烈的怀疑,我知道是怎么回事-你是否有可能推到一个数组的副本,你保持在状态,然后设置状态?当您推送到一个数组(或者将一个项添加到一个集合或任何类似的东西)时,您仍然会在内存中得到相同的list对象(尽管内容不同)。React是检查是否有一个新的列表,它看到旧的列表,看到新的列表,并说“嘿,它们是内存中相同的对象,所以由于它们是相同的,所以我甚至不需要触发一个shouldComponentUpdate

我已经给出了这个行为的一个最小的例子,这样您就可以看到它的作用:https://codesandbox.io/s/nrk07xx82j

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

但是,如果使用数组析构([...list]),则最终返回相同的数组内容,但返回一个新的数组对象,从而触发响应更新。

希望这能帮上忙!

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46868092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档