代码之家  ›  专栏  ›  技术社区  ›  KitKarson

reactjs-在不重新渲染的情况下切换可见性

  •  0
  • KitKarson  · 技术社区  · 8 年前

    我使用reactjs+nextjs+semantic ui react

    我有这样的json响应。

    [
        {
            "artist": "Cardi B",
            "dob": "01/01/1990",
            "albums":[
                {
                    "title": "Invasion of privacy",
                    "year": "2018"
                }
            ],
            "country": "usa"
        },
        {
            "artist": "Michael Jackson",
            "dob": "01/01/1950",
            "albums":[
                {
                    "title": "Thriller",
                    "year": "1981"
                },
                {
                    "title": "Blood On The Dance Floor",
                    "year": "1995"
                }           
            ],
            "country": "usa"
        }
    ]
    

    我想让每一位艺术家都坐在一排桌子上。单击艺术家行的某个单元格时,将显示艺术家的相册。

    我有两个组件。一张给艺术家,一张给专辑。 AlbumTable 组件基本上是包装在内部的另一个表 <Table.Row> . 基本上下面的代码工作得很好。

    toggleVisibility(index){
        let oldSt = this.state.AlbumStatus;
        oldSt[index] = !oldSt[index];
        this.setState({AlbumStatus: oldSt});
    }
    
    
    renderResult(){
        let rows = this.props.artists.map((r, index) =>{
            return(
                 <Table.Body key={index}>
                      <Table.Row >
                            <Table.Cell>{r.artist}</Table.Cell>
                            <Table.Cell>{r.dob}</Table.Cell>
                            <Table.Cell onClick={() => this.toggleVisibility(index)}>+</Table.Cell>                 
                            <Table.Cell>{r.country}</Table.Cell>                            
                      </Table.Row>
                      <AlbumRow result={r.albums} hiddenStatus={!this.state.AlbumStatus[index]} />
                  </Table.Body>
            );
        });
        return rows;
    }
    
    
    render(){
        return(
          <Table > 
                <Table.Header >
                  <Table.Row>
                    <Table.HeaderCell >Artists</Table.HeaderCell>
                    <Table.HeaderCell >Dob</Table.HeaderCell>
                    <Table.HeaderCell >Albums</Table.HeaderCell>                                    
                  </Table.Row>
                </Table.Header>
                {this.renderResult()}
           </Table>             
        );      
    }
    

    我的要求是只有在单击艺术家行的“+”符号时才显示唱片集。我可以使用上面的代码切换可见性。

    问题:

    如果单击“michael jackson”行的“+”符号,则会显示相应的唱片集。不过,所有艺术家的专辑也将重新呈现。这是预期的吗??是否会对大型数据集造成性能问题?什么是不影响性能的最佳方法?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Dave Lunny    8 年前

    可能不是什么大问题,除非你注意到大数据集会让事情变得滞后。说到表现,如果你觉得自己有问题,就先衡量一下( read more on measuring React performance )不要浪费时间试图过度优化,直到你知道你有问题。

    曾经有人建议把每一行分成 PureComponent :

    import React, { PureComponent } 'react';
    
    class AlbumTableRow extends PureComponent {
        render() {
            const {
                key,
                artist,
                dob,
                country
                albums,
                albumsHiddenStatus,
                onToggleVisibility,
            } = this.props;
            return(
                <Table.Body key={key}>
                    <Table.Row >
                        <Table.Cell>{artist}</Table.Cell>
                        <Table.Cell>{dob}</Table.Cell>
                        <Table.Cell onClick={onToggleVisibility}>+</Table.Cell>
                        <Table.Cell>{country}</Table.Cell>
                    </Table.Row>
                    <AlbumRow result={albums} hiddenStatus={albumsHiddenStatus} />
                </Table.Body>
            );
        }
    }
    
    export default AlbumTableRow;
    

    纯组分 应该 只有当道具 价值观 改变。然后您应该更改父组件代码,如下所示:

    getOnToggleVisibility = (index) => () => this.toggleVisibility(index);
    
    renderResult(){
        let rows = this.props.artists.map((r, index) =>{
            return (
                <AlbumTableRow
                    key={index}
                    artist={r.artist}
                    dob={r.dob}
                    country={r.country}
                    albums={r.albums}
                    albumsHiddenStatus={!this.state.AlbumStatus[index]}
                    onToggleVisibility={this.getOnToggleVisibility(index)}
                />
            );
        });
        return rows;
    }
    

    注意,我添加了 getOnToggleVisibility 方法,它接受该索引并返回 onToggleVisibility 知道要使用的正确索引的函数。