Как получить состояние конечной точки API запросов RTK (isLoading, ошибка и т. Д.) В компоненте React Class?
Хорошо, я думаю, что просмотрел почти все документы RTK Query и прочитал о кешировании RTK Query. Похоже, это довольно большая часть, даже если в данный момент мне это не нужно.
Итак, я пытаюсь выполнить простой запрос с помощью RKT Query в компоненте на основе классов, а затем выбрать в Redux Store состояние isLoading для вызова конечной точки. Однако в настоящее время в
render() {}
моего
LoginPage.jsx
, то
endpoint.<name>.select()(state)
позвонить
mapStateToProps
в пределах
LoginPageContainer.jsx
похоже, не работает. (См. Код ниже).
Глядя на примеры из документации по использованию RTK Query в классах , похоже, что мне не хватает «ключа кеширования» в
.select(<cache_key>)(state)
вызов. Однако я еще не включил теги в свою конечную точку (я считаю, что они мне пока не нужны).
Мой вопрос:
Может ли кто-нибудь пролить свет на то, как правильно использовать конечную точку, сгенерированную запросом RTK
select()
метод, используемый вне React Hooks? Я понимаю идею тегов кеша для автоматического повторного извлечения (но вряд ли, что здесь не так), но я не уверен, как и какой ключ кеша мне здесь не хватает, чтобы просто получить состояние запроса конечной точки в компоненте класса . Спасибо всем!
Код:
// LoginPage.jsx
import React, { Component } from 'react'
import PT from 'prop-types'
import LoginForm from './components/LoginForm'
export default class LoginPage extends Component {
static propTypes = {
loginWithUsername: PT.func.isRequired,
loginWithUsernameState: PT.object.isRequired
}
render() {
// This value never updates
const { isLoading } = this.props.loginWithUsernameState
// always outputs "{"status":"uninitialized","isUninitialized":true,"isLoading":false,"isSuccess":false,"isError":false}"
// Even during and after running the `loginWithUsername` endpoint query
console.log(this.props.loginWithUsernameState)
return (
<div>
{isLoading && 'Loading ...'}
<LoginForm
onSubmit={(values) => this.props.loginWithUsername(values)} />
</div>
)
}
}
// LoginPageContainer.jsx
import { connect } from 'react-redux'
import { teacherApi } from './api'
import LoginPage from './LoginPage'
const { loginWithUsername } = teacherApi.endpoints
const mapStateToProps = (state) => ({
loginWithUsernameState: loginWithUsername.select()(state)
})
const mapDispatchToProps = (dispatch) => ({
loginWithUsername: (payload) => dispatch(loginWithUsername.initiate(payload))
})
export default connect(mapStateToProps, mapDispatchToProps)(LoginPage)
// api.js
import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'
export const teacherApi = createApi({
reducerPath: 'teacherApi',
baseQuery: fetchBaseQuery({ baseUrl: '/teacher/' }),
endpoints: (builder) => ({
loginWithUsername: builder.query({
query: (data) => ({
url: 'login',
method: 'post',
body: data,
headers: { 'Content-Type': 'application/json' }
}),
}),
}),
})
2 ответа
"Ключ кеша" передан в
endpoint.select()
- это та же переменная, которую вы передаете в свой хук:
useGetSomeItemQuery("a")
useGetSomeItemQuery("b)"
const selectSomeItemA = endpoint.select("a")
const selectSomeItemB = endpoint.select("b")
const itemAREsults = selectSomeItemA(state)
const itemBResults = selectSomeItemB(state)
Это приводит к поиску
state => state[apiSlice.reducerPath].queries["getSomeItem('a')"]
, или любое другое поле кэшированных данных для этого элемента.
const result = api.endpoints.getPosts.select()(state)
const { data, status, error } = result
Обратите внимание, что в отличие от автоматически сгенерированных обработчиков запросов производные логические значения, такие как isLoading, isFetching, isSuccess, здесь недоступны. Вместо этого предоставляется необработанное перечисление состояния.
https://redux-toolkit.js.org/rtk-query/usage/usage-without-react-hooks