React Redux получает данные из динамического селектора

#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) || ([]) ))}