我应该在componentWillReceiveProps内调用动作吗?

凯文·李

我的直觉告诉我没有,但是我一直在想更好的方法。

当前,我有一个显示项目列表的组件。根据提供的内容props,此列表可能会更改(即过滤更改或上下文更改)

例如,给定new this.props.type,状态将更新如下:

componentWillReceiveProps(nextProps) {
        if (nextProps.type == this.state.filters.type) return

        this.setState({
            filters: {
                ...this.state.filters,
                type: nextProps.type,
            },
            items: ItemsStore.getItems().filter(item => item.type == nextProps.type)
        })
}

一切都很好,但是现在我的要求已经改变,我需要添加一个新的过滤器。对于新的过滤器,我必须执行API调用以返回有效项目ID的列表,并且我只想在同一列表组件中显示具有这些ID的项目。我应该怎么做呢?

我曾考虑过从中调用适当的操作componentWillReceiveProps,但这似乎并不正确。

componentWillReceiveProps(nextProps) {
        if (nextProps.type == this.state.filters.type && nextProps.otherFilter == this.state.filters.otherFilter) return

        if (nextProps.otherFilter != this.state.filters.otherFilter) {
            ItemsActions.getValidIdsForOtherFilter(nextProps.otherFilter)
            // items will be properly updated in store change listener, onStoreChange below
        }

        this.setState({
            filters: {
                ...this.state.filters,
                type: nextProps.type,
                otherFilter: nextProps.otherFilter,
            },
            items: ItemsStore.getItems().filter(item => item.type == nextProps.type)
        })
},

onStoreChange() {
     let validIds = ItemsStore.getValidIds()

     this.setState({
         items: ItemsStore.getItems().filter(item => item.type == this.state.filters.type && validIds.indexOf(item.id) > -1)
     })
}
阿曼

2018年1月22日更新:

最近,ReactRFC-PR被合并了,因为componentWillReceiveProps在即将到来的异步渲染模式中使用它时可能无法保存,因此不推荐使用。例如,可以从此生命周期挂钩调用流量动作。

调用动作(即副作用的正确位置是在React完成渲染之后,因此意味着componentDidMountcomponentDidUpdate

如果该动作的目的是获取数据,那么React将来可能会支持针对这些事情的新策略。同时,坚持使用上述两个生命周期挂钩是安全的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我应该在乎模拟对象的调用次数吗

来自分类Dev

我应该在ObjectOutputSream的close()之前调用reset()吗?

来自分类Dev

我应该在动作创建者中处理错误吗

来自分类Dev

我应该在调用setInterval()之前先调用clearInterval()吗?

来自分类Dev

我应该在进行jQuery ajax调用之前对数据进行编码吗?

来自分类Dev

我们应该在不同的调用之间重用cublasHandle_t吗?

来自分类Dev

我应该在Dispose()方法中调用GC.Collect()吗?

来自分类Dev

性能:我应该在经常调用的函数中使用全局变量吗?

来自分类Dev

我应该在Android AsyncTask中调用super.onPostExecute(result)吗?

来自分类Dev

我应该在构造函数中调用成员函数吗

来自分类Dev

我应该在库调用中使用自己的typedef吗?

来自分类Dev

我应该在调用session.evict(obj)之前提交休眠事务吗

来自分类Dev

我应该在单元测试时从正在测试的类中调用方法吗?

来自分类Dev

我应该在每个节点JS文件中调用dotenv吗?

来自分类Dev

我应该在子类中使用super()调用父类方法吗

来自分类Dev

应该在我的自定义>>运算符中调用istream :: clear()吗?

来自分类Dev

我可以/应该在Kotlin中顺序编写这些相互依赖的Volley调用吗?

来自分类Dev

我应该在Android AsyncTask中调用super.onPostExecute(result)吗?

来自分类Dev

我应该在同一测试中测试从Im测试方法调用的方法吗?

来自分类Dev

我应该在C#dllimport本机方法调用中为参数释放内存吗?

来自分类Dev

我应该在单元测试中模拟$ this-> doSomething()调用吗?

来自分类Dev

应该在UITableViewCell中调用deinit吗?

来自分类Dev

应该在longjmp()之后调用free()吗?

来自分类Dev

我应该在哪里调用使用数据的方法?

来自分类Dev

我应该在使用throw时使用throw吗?

来自分类Dev

我应该在模型中抛出HttpStatus异常吗?

来自分类Dev

我应该在界面上公开Stream <T>吗?

来自分类Dev

我应该在交易中包含SELECT吗?

来自分类Dev

我应该在嵌套块中使用weakSelf吗?

Related 相关文章

  1. 1

    我应该在乎模拟对象的调用次数吗

  2. 2

    我应该在ObjectOutputSream的close()之前调用reset()吗?

  3. 3

    我应该在动作创建者中处理错误吗

  4. 4

    我应该在调用setInterval()之前先调用clearInterval()吗?

  5. 5

    我应该在进行jQuery ajax调用之前对数据进行编码吗?

  6. 6

    我们应该在不同的调用之间重用cublasHandle_t吗?

  7. 7

    我应该在Dispose()方法中调用GC.Collect()吗?

  8. 8

    性能:我应该在经常调用的函数中使用全局变量吗?

  9. 9

    我应该在Android AsyncTask中调用super.onPostExecute(result)吗?

  10. 10

    我应该在构造函数中调用成员函数吗

  11. 11

    我应该在库调用中使用自己的typedef吗?

  12. 12

    我应该在调用session.evict(obj)之前提交休眠事务吗

  13. 13

    我应该在单元测试时从正在测试的类中调用方法吗?

  14. 14

    我应该在每个节点JS文件中调用dotenv吗?

  15. 15

    我应该在子类中使用super()调用父类方法吗

  16. 16

    应该在我的自定义>>运算符中调用istream :: clear()吗?

  17. 17

    我可以/应该在Kotlin中顺序编写这些相互依赖的Volley调用吗?

  18. 18

    我应该在Android AsyncTask中调用super.onPostExecute(result)吗?

  19. 19

    我应该在同一测试中测试从Im测试方法调用的方法吗?

  20. 20

    我应该在C#dllimport本机方法调用中为参数释放内存吗?

  21. 21

    我应该在单元测试中模拟$ this-> doSomething()调用吗?

  22. 22

    应该在UITableViewCell中调用deinit吗?

  23. 23

    应该在longjmp()之后调用free()吗?

  24. 24

    我应该在哪里调用使用数据的方法?

  25. 25

    我应该在使用throw时使用throw吗?

  26. 26

    我应该在模型中抛出HttpStatus异常吗?

  27. 27

    我应该在界面上公开Stream <T>吗?

  28. 28

    我应该在交易中包含SELECT吗?

  29. 29

    我应该在嵌套块中使用weakSelf吗?

热门标签

归档