Это хук, который я написал, чтобы использовать существующий класс «загрузчик данных», который обрабатывает аутентификацию и сам выборку данных, чтобы лучше разобраться в таких вещах, как загрузка флагов и ошибок.
export const useApi = (endpoint: string, options: object = {}) => {
const [data, setData] = useState(null)
const [isLoading, setIsLoading] = useState(false)
const [error, setError] = useState(null)
const loader = DataLoader.instance
useEffect((): (() => void) | undefined => {
if (!endpoint) {
console.warn('Please include an endpoint!')
return
}
let isMounted = true // check component is still mounted before setting state
const fetchUserData = async () => {
isMounted && setIsLoading(true)
try {
const res = await loader.load(endpoint, options)
if (!res.ok) {
isMounted && setData(res)
} else {
throw new Error()
}
} catch (error) {
isMounted && setError(error)
}
isMounted && setIsLoading(false)
}
fetchUserData()
return () => (isMounted = false)
}, [endpoint])
return { data, isLoading, error }
}
Имеет ли это смысл? Я тогда использую это так:
const { data, isLoading, error } = useApi(Endpoints.user.me)
Предполагая, что все в порядке, как правильно набрать потребителя? Когда я пытаюсь использовать определенное свойство в data
, TypeScript будет жаловаться, что «объект может быть нулевым».
Большое спасибо заранее.