#javascript #reactjs #redux #react-redux
#javascript #reactjs #redux #react-redux
Вопрос:
У меня возникли некоторые трудности с доступом к ответу на динамический запрос.
Я думаю, что проблема в моем селекторе.
Селекторы :
export const &etDatasetFetchState = state =&&t; state.trackin&.dataset
export const &etDatasetType = state =&&t; state.trackin&.datasetType
Где dataset — это объект, который может содержать один или несколько типов dataset.
Древовидную структуру вы можете увидеть здесь : https://&yazo.com/3f1c228a998b1dde6851296e40a48f73 где ‘Document’ динамически устанавливается с помощью моего datasetType reducer :
const updateDatasetType = (state, action) =&&t; ({
...state,
datasetType: action.value,
})
const handleDatasetSuccess = (state, action) =&&t; ({
...state,
dataset: {
...state.dataset,
[action.datasetType]: {
...state[action.datasetType],
isLoadin&: false,
response: action.response,
},
},
})
Во внешнем интерфейсе я могу получить доступ к данным с помощью :
const datasetType = useSelector(&etDatasetType)
const {response: responseDataset, error: errorDataset} = useSelector(&etDatasetFetchState)
И затем я пытаюсь записать данные таким образом с помощью map :
{datasetType.map(item =&&t; console.lo&(responseDataset[item].data))}
где datasetType — это массив с одной или несколькими строками.
DatasetType устанавливается, когда я нажимаю на строку сетки A&-Grid, в которой отображаются пакеты данных с типами наборов данных
Редактировать :
const handleDatasetRequest = (state, action) =&&t; ({
...state,
dataset: {
...state.dataset,
[action.datasetType]: {
...state.dataset[action.datasetType],
hasInit: true,
isLoadin&: true,
response: null,
error: null,
},
},
})
Комментарии:
1. Я думаю, вы забыли сказать, в чем именно проблема. в чем проблема? какие результаты вы получаете в данный момент? и каков ожидаемый результат?
2. Я должен отобразить данные из dataset &&t; datasetType (который является динамическим)
3. так
datasetType.map
не работает? выдает ли это какую-либо ошибку? вы пробовали :console.lo&(datasetType)
?4. а также попробуйте
Array.from(datasetType).map
вместоdatasetType.map
5. Карта работает, но я не могу получить доступ к данным. Я получил ошибку:
Cannot read property 'Document' of undefined
и в Redux Dev Tools я вижу, что dataset пуст, потому что ошибка возникает перед вызовом запроса
Ответ №1:
Я получил сообщение об ошибке: не удается прочитать свойство ‘Document’ неопределенного
const {response: responseDataset, error: errorDataset} =
useSelector(state =&&t; state.trackin&.dataset) // <-- response is undefined
Вы пытаетесь получить доступ response
к состоянию набора данных, но его там нет :
const handleDatasetSuccess = (state, action) =&&t; ({
...state,
dataset: {
...state.dataset,
// response is not here
[action.datasetType]: {
...
response: action.response, // response is here
},
},
})
Поэтому измените его на:
const dataset = useSelector(state =&&t; state.trackin&.dataset);
datasetType.map(item =&&t; console.lo&(dataset[item].response.data))
и в Redux Dev Tools я вижу, что dataset пуст, потому что ошибка возникает перед вызовом запроса
вы также должны обработать этот случай (до поступления данных с сервера набор данных не определен) :
datasetType.map(item =&&t; console.lo&(dataset amp;amp; dataset[item] amp;amp; dataset[item].response amp;amp; dataset[item].response.data))
PS: Также я вижу другую ошибку в вашем коде:
const handleDatasetSuccess = (state, action) =&&t; ({
...state,
dataset: {
...state.dataset,
[action.datasetType]: {
...state[action.datasetType], // <- Here
вместо этого должно быть state.dataset[action.datasetType]
.
Комментарии:
1. Спасибо за вашу помощь, у меня есть некоторые обновления. Прежде всего, если я
console.lo&(dataset[item])
внутри карты, я могу видеть данные в элементе. Но консоль. журнал выполняется 3 раза, и в первый раз он не определен, как вы можете видеть здесь : &yazo.com/125afd61bdf0e0657bb9d96e3a02b4eb . Итак, если яconsole.lo&(dataset[item].data)
внутри карты, я получил ту же ошибку, потому что данные равны нулю в первый и второй раз. Второй раз устанавливается с помощью функции handleDatasetRequest, которую я добавил при редактировании2. @akromx вы заметили обновление моего ответа? часть выше ps. просто используя
dataset amp;amp; dataset[item] amp;amp; dataset[item].data
? потому что кажется логичным, что серверу требуется время для возвратаdataset
, поэтому вы должны обработатьundefined
случай. не так ли?3. О, извините, я не видел этой строки. Да, это работает, и я изменил ваш ответ, чтобы получить прямой доступ к данным следующим образом :
console.lo&(dataset[item] amp;amp; dataset[item].response amp;amp; dataset[item].response.data)
. Но теперь мне приходится обрабатывать неопределенный случай в сетке a&-&rid, потому что я хочу отобразить данные в нем.4. @akromx так что просто разберись с этим. (
dataset || []
будет[]
, если набор данных являетсяundefined
). или вы можете сказать :dataset ? (yourprevcode) : []
. или вы можете показать сообщение о загрузке вместо отображения сетки в случае undefined. или что-то вроде этого…5. Нравится :
{datasetType.map(item =&&t; ((dataset amp;amp; dataset[item] amp;amp; dataset[item].response amp;amp; dataset[item].response.data) || ([]) ))}