2017-03-04 26 views
2

我目前正在经历一个关于Reactjs的知识湖。我有一个由列组成的组件。列数是可变的(用户可以改变它)。在这一栏中,有一些项目包含YouTube嵌入视频。

当我更改列数时,父元素正在刷新并且子组件正在更新:视频播放器被刷新(因此视频暂停并且正在搜索0)。
我想有一个系统,当我改变列数时能够保持我的孩子不更新。
我想,当我改变我的列数时,React会重用一些可用的childs组件,并通过其他子组件改变他们的道具。因为有时视频不会中断。处理更改列数的子组件更新

子组件

export default class Article extends Component { 

    static propTypes = { 
     visible: React.PropTypes.bool.isRequired, 
     title: React.PropTypes.string.isRequired, 
     link: React.PropTypes.string.isRequired, 
     userId: React.PropTypes.number.isRequired, 
     contentId: React.PropTypes.number.isRequired, 
     typeId: React.PropTypes.number.isRequired, 
     typeName: React.PropTypes.string.isRequired, 
     date: React.PropTypes.number.isRequired, 
     username: React.PropTypes.string.isRequired, 
     description: React.PropTypes.string, 
     imageUrl: React.PropTypes.string 
    }; 

    shouldComponentUpdate(nextProps) { 
     return nextProps.link !== this.props.link; 
    } 

    render() { ... } 

} 

父组件

class Home extends UserComponent { 

    static propTypes = { 
    mode: React.PropTypes.number.isRequired, 
    columnCount: React.PropTypes.number.isRequired, 
    userList: React.PropTypes.array.isRequired, 
    }; 

    state = { 
    contents: [], 
    columnCount: 0, 
    userList: [], 
    } 

    ... 

    renderArticles = (columnCount, columnNumber) => { 
    if (this.state.contents.length > 0) 
     return this.state.contents.map((content, key) => { 
     if ((key + columnNumber) % columnCount !== 0) return null; 
     let username = 'unknown'; 
     let typeName = 'unknown'; 

     this.state.userList.forEach((user) => { 
      if (user.userId === content.userId) username = user.username; 
     }) 

     const types = Type.getTypes(); 
     if (types) { 
      types.forEach((type) => { 
      if (content.typeId === type.id) typeName = type.name; 
      }) 
     } 
     return (
      <Article 
      key={content.id} 
      visible={true} 
      title={content.title} 
      link={content.link} 
      userId={content.userId} 
      typeId={content.typeId} 
      contentId={content.id} 
      date={content.date} 
      description={content.description} 
      imageUrl={content.imageUrl} 
      username={username} 
      typeName={typeName} 
      /> 
     ); 
     }); 
    else 
     return null; 
    } 

    render() { 
    const { columnCount } = this.props.columnCount === 0 ? this.state : this.props; 
    const containers = []; 
    var i = 0; 
    do { 
     containers.push(
     <div key={i} className={styles.containers}> 
      {this.renderArticles(columnCount, i)} 
     </div> 
    ); 
     i++; 
    } while (i < columnCount); 

    return (
     <div className={styles.container}> 
     {containers} 
     </div> 
    ); 
    } 
} 

function mapStateToProps(state) { 
    return { 
    columnCount: state.articleColumnFilter.columnCount 
    }; 
} 

function mapDispatchToProps(dispatch) { 
    return bindActionCreators(articleColumnActions, dispatch); 
} 

export default connect(mapStateToProps, mapDispatchToProps)(Home); 
+0

是否'shouldComponentUpdate'曾经被解雇过吗? –

+0

@ArshabhAgarwal对某些孩子来说,是的。我已经放弃了这个功能,我已经把视频播放器放入了一个弹出窗口(比如youtube android应用程序)。 – Kornflexx

回答