了解React中的钩子设置状态

卡米尔(Kamil Sienkiewicz)

我正在尝试了解React Hooks,并遇到了一个问题。我想获取数据,先显示30个条目,然后在后台获取其余数据。我的逻辑:

useEffect(() => {
    (async function () {
        setIsLoading(true);
        try {
            const data = sortById(await fetch('url'));
            const prep = await prepareData(data, (pageNumber - 1) * elementsPerPage, pageNumber * elementsPerPage);
            setData(prep);
            setIsLoading(false);
            const backgroundData = await fetchMissingData(prep, elementsPerPage)
            setData(backgroundData);
        } catch (e) {
            setError(e);
            setIsLoading(false);
        }
    })();
}, [])

data 是来自API的响应,那么我正在使用它向prepareData中的对象添加一些内容-该对象本身正在调用另一个API,因此当所有请求完成时

return Promise.all(result).then(done => {
    return done;
})

我正在获取对象数组,但是只有前30个对象充满了我需要的数据。准备好数据后,我将状态data设置loading为false。在那一刻,数据应该在页面上呈现(?)。然后,我将在后台获取其余数据,而无需再次获取相同的数据(前30个条目),并data针对我在应用程序中需要的每个条目再次进行设置

问题在于,数据是在最后一次渲染之后呈现的setData-应用程序正在等待每次提取完成。我的逻辑错误在哪里?

aga井原里

setState,就像在类组件中一样,它是异步调用(它不会立即起作用,但会告诉组件应使用不同的上下文再次呈现)。

例如,


useEffect(() => {
    (async function () {
        setIsLoading(true);
        try {
          setIsLoading(false);
          ...
        } catch (e) {
            setError(e);
            setIsLoading(false);
        }
    })();
}, [])

isLoading永远不会出现true在它的组件中,导致您同时给它true两者带来相同的效果false(假设您的代码可以逐行工作,而JS无法保证,并且您可能会遇到副作用)。同样的事情是data因为您打了setData两次电话

因此,您可以考虑将效果分为两个效果,而isLoading则是第二个效果要运行的标志


  useEffect(() => {
    (async function () {
        setIsLoading(true);
        try {
            const data = sortById(await fetch('url'));
            const prep = await prepareData(data, (pageNumber - 1) * elementsPerPage, pageNumber * elementsPerPage);
            setData(prep);
        } catch (e) {
            setError(e);
            setIsLoading(false);
            // in case there is e at first effect,second effect wont run
        }
    })();
}, [])

useEffect(() => {
    if (isLoading) {
    (async function () {
        try {
                                                        //data now is equal to prep
            const backgroundData = await fetchMissingData(data, elementsPerPage)
            setData(backgroundData);
        } catch (e) {
            setError(e);
        }
    })();
    setIsLoading(false);
   }
}, [isLoading, data])

如果isLoading标志已经用于UI渲染或其他用途,并且不能作为第二效果的标志,则可以创建唯一isSecondEffectShouldRun或类似的标志(使用data它本身将导致无限循环...)

希望对您有所帮助:)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用React useState钩子设置多个状态值

来自分类Dev

在获取数据后如何设置状态React钩子

来自分类Dev

无法使用React钩子将TextField的状态设置为undefined

来自分类Dev

在函数调用之前设置 React 钩子状态

来自分类Dev

在React中设置状态

来自分类Dev

在React.Component范围中模拟钩子useState的状态问题

来自分类Dev

在React Js中设置状态

来自分类Dev

React钩子替换旧状态

来自分类Dev

用react钩子操纵状态,

来自分类Dev

React Native-如何使用钩子而不是'this.state'设置此状态?

来自分类Dev

在React中使用useState钩子为多个设置状态渲染一次

来自分类Dev

使用useState钩子未设置状态 ReactJS

来自分类Dev

无法在React中的componentWillReceiveProps中设置状态

来自分类Dev

无法在React中的componentWillReceiveProps中设置状态

来自分类Dev

了解React的钩子useEffect函数。何时调用useffect中的回调函数(即取消订阅)?

来自分类Dev

react native-用react钩子通知子组件中状态更新的父组件?

来自分类Dev

在React的状态字典中设置字典

来自分类Dev

在React的useEffect依赖数组中设置状态

来自分类Dev

如何在React中设置对象状态

来自分类Dev

React JS在功能组件中设置状态

来自分类Dev

在React中设置状态值的差异

来自分类Dev

在 React 中的特定组件上设置状态

来自分类Dev

使用无状态React在异步函数中设置状态

来自分类Dev

在React中为常见状态创建一个钩子

来自分类Dev

React onSubmit等待函数中的异步IIFE用钩子更新状态

来自分类Dev

如何在react.js的回调中调用UseState钩子的状态更新器函数

来自分类Dev

我应该使用全局状态还是React钩子的本地状态?

来自分类Dev

了解React钩子的使用效果和最佳实践

来自分类Dev

了解React钩子的使用效果和最佳实践

Related 相关文章

  1. 1

    使用React useState钩子设置多个状态值

  2. 2

    在获取数据后如何设置状态React钩子

  3. 3

    无法使用React钩子将TextField的状态设置为undefined

  4. 4

    在函数调用之前设置 React 钩子状态

  5. 5

    在React中设置状态

  6. 6

    在React.Component范围中模拟钩子useState的状态问题

  7. 7

    在React Js中设置状态

  8. 8

    React钩子替换旧状态

  9. 9

    用react钩子操纵状态,

  10. 10

    React Native-如何使用钩子而不是'this.state'设置此状态?

  11. 11

    在React中使用useState钩子为多个设置状态渲染一次

  12. 12

    使用useState钩子未设置状态 ReactJS

  13. 13

    无法在React中的componentWillReceiveProps中设置状态

  14. 14

    无法在React中的componentWillReceiveProps中设置状态

  15. 15

    了解React的钩子useEffect函数。何时调用useffect中的回调函数(即取消订阅)?

  16. 16

    react native-用react钩子通知子组件中状态更新的父组件?

  17. 17

    在React的状态字典中设置字典

  18. 18

    在React的useEffect依赖数组中设置状态

  19. 19

    如何在React中设置对象状态

  20. 20

    React JS在功能组件中设置状态

  21. 21

    在React中设置状态值的差异

  22. 22

    在 React 中的特定组件上设置状态

  23. 23

    使用无状态React在异步函数中设置状态

  24. 24

    在React中为常见状态创建一个钩子

  25. 25

    React onSubmit等待函数中的异步IIFE用钩子更新状态

  26. 26

    如何在react.js的回调中调用UseState钩子的状态更新器函数

  27. 27

    我应该使用全局状态还是React钩子的本地状态?

  28. 28

    了解React钩子的使用效果和最佳实践

  29. 29

    了解React钩子的使用效果和最佳实践

热门标签

归档