react的列表最优搜索方案

发布于 2022-09-06 03:57:57 字数 940 浏览 17 评论 0

一个列表过滤功能 过滤条件 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发生变化时候遍历一次
优点是代码量少,逻辑简单

方案二

在每次搜索条件onChange的时候和在queryData的时候就根据搜索条件去setState或者dispatch去改变subArr

方案三

在componentWillReceiveProps时候进行操作

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

这样就性能比方案一好,但这显得componentWillReceiveProps有点臃肿
目前我采用的是方案三

大神们给个建议

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

旧时浪漫 2022-09-13 03:57:57
  1. 保持组件简单,是我们毕生的追求,

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

当我们需要精确的控制计算,来提高性能的时候。 可以使用reselect。
详情请参考blog为什么我们需要reselect

书间行客 2022-09-13 03:57:57

使用reselect创建有记忆功能的selector函数,这样只有当你的searchValue和 fullArr发生改变时,mapStateToProps才会重新计算,否则就直接使用上次缓存的对象,因为是同一个对象,redux也不会重新render当前组件。

农村范ル 2022-09-13 03:57:57

关于方案三,臃肿不是个大问题,conponentWillReceiveProps需要注意的是性能消耗,你这里是完全可行的,也可以把代码封装成一个方法去调用来减少视觉混乱。

不过我有一点不太明白,这个filter完全可以不借助外部参数实现,只在render的时候根据searchValue来决定不同的渲染值即可,这样是不是更简便?还是有什么我没想到的问题?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文