Я реализовал пользовательский useFetch
хук, так что извлекайте информацию из моего приложения:
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
Тогда мне пришло в голову ... это будет использоваться во всем приложении.Как он узнает, какие данные / загрузка / ошибка относятся к какому вызову?Когда я использую useFetch
в первый раз, а затем сразу за ним где-то в приложении следует другое использование, отслеживает ли React, какие внутренние переменные состояния принадлежат какому вызову ловушки?
Тогда я подумалвозможно, мне нужно сделать что-то более похожее на линии Redux и самостоятельно отслеживать все вызовы пользовательского хука с помощью хука useReducer
:
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
сам как во 2-м примере?Или React обрабатывает это во внутренностях, и 1-й пример - это все, что мне нужно?