鍍金池/ 問答/網(wǎng)絡(luò)安全  HTML/ react的列表最優(yōu)搜索方案

react的列表最優(yōu)搜索方案

一個列表過濾功能 過濾條件 name == searchValue

方案一
在connect

const mapStateToProps = ({itemStore}, ownProps) => {
    const { searchValue, fullArr } = itemStore
    const subArr = fullArr.filter(item => item.name.indexOf(searchValue) > -1)
    return {
        ...itemStore,
        subArr,
    }
}

這樣每次store或者ownProps發(fā)生變化時候遍歷一次
優(yōu)點是代碼量少,邏輯簡單

方案二

在每次搜索條件onChange的時候和在queryData的時候就根據(jù)搜索條件去setState或者dispatch去改變subArr

方案三

在componentWillReceiveProps時候進行操作

// 使用redux規(guī)定每次查詢都返回一個新的list
componentWillReceiveProps(nextProps) {
    const { searchValue, fullArr } = this.props
    if(
        nextProps.fullArr !== fullArr ||
        nextProps.searchValue !== searchValue
    ){
        const subArr = .....
        this.setState({
            subArr,
        })
    }
}

這樣就性能比方案一好,但這顯得componentWillReceiveProps有點臃腫
目前我采用的是方案三

大神們給個建議

回答
編輯回答
赱丅呿
  1. 保持組件簡單,是我們畢生的追求,

  2. 性能也不是首先需要考慮方向

當我們需要精確的控制計算,來提高性能的時候。 可以使用reselect。
詳情請參考blog為什么我們需要reselect

2018年2月11日 14:38
編輯回答
深記你

使用reselect創(chuàng)建有記憶功能的selector函數(shù),這樣只有當你的searchValue和 fullArr發(fā)生改變時,mapStateToProps才會重新計算,否則就直接使用上次緩存的對象,因為是同一個對象,redux也不會重新render當前組件。

2017年9月10日 21:15
編輯回答
敢試

關(guān)于方案三,臃腫不是個大問題,conponentWillReceiveProps需要注意的是性能消耗,你這里是完全可行的,也可以把代碼封裝成一個方法去調(diào)用來減少視覺混亂。

不過我有一點不太明白,這個filter完全可以不借助外部參數(shù)實現(xiàn),只在render的時候根據(jù)searchValue來決定不同的渲染值即可,這樣是不是更簡便?還是有什么我沒想到的問題?

2018年7月3日 11:20