- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经实现了一个自定义 useFetch
Hook ,因此可以在我的应用程序中进行提取:
import { useEffect, useState } from 'react'
const useFetch = ({ url, defaultData = null }) => {
const [data, setData] = useState(defaultData)
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(res => {
setData(res)
setLoading(false)
})
.catch(err => {
setError(err)
setLoading(false)
})
}, [])
return [data, loading, error]
}
export default useFetch
然后我想到...这将在整个应用程序中使用。它如何知道哪个data/loading/error属于哪个调用?当我第一次使用 useFetch
,然后在应用程序中的其他地方紧随其后进行另一个使用时,React 是否跟踪哪些内部状态变量属于哪个钩子(Hook)调用?
然后我想也许我需要沿着 Redux 路线做更多的事情,并在 useReducer
钩子(Hook)的帮助下跟踪对自定义钩子(Hook)的所有调用:
import { useEffect, useReducer } from 'react'
const reducer = (state, action) => {
const { url, data, err } = action
const currentState = state[url]
switch (action.type) {
case 'fetching':
return { ...state, [url]: { ...currentState, loading: true } }
case 'success':
return { ...state, [url]: { ...currentState, loading: false, data } }
case 'fail':
return { ...state, [url]: { ...currentState, loading: false, err } }
default:
return state
}
}
const useFetch = ({ url, defaultData = null }) => {
const [state, dispatch] = useReducer(reducer, {}, { type: 'fetching', url })
const { data: d, loading: l, err: e } = state[url]
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(data => dispatch({ type: 'success', url, data }))
.catch(err => dispatch({ type: 'fail', err }))
}, [])
return [d || defaultData, l, e]
}
export default useFetch
我是否需要像第二个示例一样手动跟踪对 useFetch
的所有调用?或者 React 是否在其内部处理这个问题,而第一个示例就是我所需要的?
最佳答案
每个自定义 Hook 都有自己的状态,并且不会在同一 Hook 的不同实例之间共享状态。因此,您不需要跟踪哪个状态属于哪个钩子(Hook)。
Hook 只会在不同实例之间共享逻辑,而不共享数据,就像 HOC 和 Render Props
一样。
所以第一个例子就可以正常工作了。
在您的情况下,多次调用 useFetch
实际上会导致多次调用 useState
和 React FAQs用 useState
解释状态的独立性,这确实回答了你的疑问
React keeps track of the currently rendering component. Thanks to the Rules of Hooks, we know that Hooks are only called from React components (or custom Hooks — which are also only called from React components).
There is an internal list of “memory cells” associated with each component. They’re just JavaScript objects where we can put some data. When you call a Hook like useState(), it reads the current cell (or initializes it during the first render), and then moves the pointer to the next one. This is how multiple useState() calls each get independent local state.
关于reactjs - 自定义 React `useFetch` Hook - 我需要维护多个状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53382115/
React 的半新内容。我有一个 useFetch Hook ,它具有所有的获取功能,我想在用户单击“加载更多项目”按钮时调用它来获取下一页的项目。 显然, { useFetch(...) }}>l
我有一个 api,它为我提供了如下方法: 按用户名搜索用户(用户名,限制) getRandomPremiumUsers(限制) getYoungUsers(maxAge, 限制) 我正在实现一个钩子(
我是 nuxt3 的新手,我不了解 useFetch 中 key 选项的作用(使用)可组合 它说; /* key: a unique key to ensure that data fetching
我有很多 React 经验,但我是 Hooks 的新手。 我有以下 useFetch Hook ,我在此 useAsync 之后修改了它钩子(Hook): import { useState, use
我已经实现了一个自定义 useFetch Hook ,因此可以在我的应用程序中进行提取: import { useEffect, useState } from 'react' const useFe
我只是不知道如何处理这里的错误: const { error, data } = useFetch('https://example.app/api/contact', { method: "P
我只是不知道如何处理这里的错误: const { error, data } = useFetch('https://example.app/api/contact', { method: "P
当我在NUXT环境中运行此代码时:。它提供了以下结果:。当我将SSR:FALSE添加到nuxt-config文件时,它已经被解析了。我对此感到困惑。
我刚开始学习 nuxtjs(对 vue.js 有一些经验),我遇到了以下问题: 我有一个简单的 todo-[id].vue 页面。它应该从 API 获取待办事项并呈现在页面上: import Sec
我刚开始学习 nuxtjs(对 vue.js 有一些经验),我遇到了以下问题: 我有一个简单的 todo-[id].vue 页面。它应该从 API 获取待办事项并呈现在页面上: import Sec
我构建了一个 useFetch 函数,该函数与此密切相关:https://www.robinwieruch.de/react-hooks-fetch-data这是它的简化版本:How to corre
我已经从 nuxt 3 官方文档中设置了 nuxt 3,并使用唯一的 useFetch() 可组合项来获取 app.vue 文件中的数据,但它返回错误 Error: fetch failed()当我们
编辑:我使用的是Nuxt 3.7.1版。我有一个Nuxt网站。我有一个服务器端点来获取内容。当页面第一次加载时,会显示当前数据。如果我刷新页面,则不会调用useFetch(基于网络日志),并显示旧数据
我是一名优秀的程序员,十分优秀!