Как правильно ожидать выборки в классе react

#javascript #arrays #reactjs #object #ecmascript-6

#javascript #массивы #reactjs #объект #ecmascript-6

Вопрос:

У меня есть класс, в котором я должен проверить наличие элемента для отображения в одной html-форме (скажем, гиперссылка) или обычный текст.

Я получаю объект в качестве реквизита. Мне трудно использовать выборку, чтобы правильно распознать, существует ли элемент на основе кода возврата

     this.props.item.map(function(item) {
          fetch(url item)(). then (
              if(statusCode === 200)
                 //display hyperlink
                 return <a href=url item>{item.a:item.b}</a>
              else
                 //normal text
                 return <disp>{item.a:item.b}</disp>
          )
         // But its expecting a return here!
         //return <disp>{item.a:item.b}</disp>
    })
  

Комментарии:

1. почему вы используете map, если вы ничего не делаете с возвращаемыми значениями (не то, что вы возвращаете какие-либо) — map кажется неправильным выбором

2. Будьте осторожны при программной отправке запросов на пользовательские URL-адреса из вашего приложения, это может привести к некоторым рискам для безопасности. По крайней мере, похоже, что это пользовательские URL-адреса, если я правильно понимаю.

3. @JaromandaX Что бы вы порекомендовали мне использовать?

4. @PatrickRoberts , Да, это просто добавление к базовому URL. без xss

Ответ №1:

Проблема в том, что это асинхронный код.

У вас есть пара проблем:

Во-первых, (если я прав, предполагая, что это функция Array.prototype.map) .map функция должна что-то возвращать. Функция map преобразует один массив в другой массив того же размера.

Во-вторых, и это более важно, fetch возвращает Promise .

Поэтому, даже если вы изменили свой код на:

 this.props.item.map(function(item) {
     return fetch(url item)(). then (
          if(statusCode === 200)
             //display hyperlink
             return <a href=url item>{item.a:item.b}</a>
          else
             //normal text
             return <disp>{item.a:item.b}</disp>
      )         
})
  

Все, что вы получите, это массив обещаний.

Что я рекомендую вам сделать, так это начать использовать react-redux, и лично я рекомендую использовать redux-saga.

Основная концепция redux и других решений для управления состоянием заключается в том, что ваши компоненты React отвечают только за отображение данных и реагирование на взаимодействие с пользователем (обычно путем отправки действия redux). Они не должны нести ответственность за фактическую выборку или манипулирование данными. Для этого и предназначено ваше промежуточное программное обеспечение для управления состоянием (например, redux-saga).

Я не буду вдаваться в подробности здесь, но это должно направить вас в правильном направлении.

Комментарии:

1. Этот ответ правильный, но вам не нужно рекомендовать целую библиотеку для решения этой проблемы. Общий совет правильный, с дополнительным примечанием о том, что данные должны извлекаться внутри componentDidMount() и в обратных вызовах пользовательских событий, а не в render() методе. render() Функция должна обрабатывать отображение значка загрузки во время выполнения асинхронной выборки. Для этого вам не нужны react-redux или react-saga, они просто упрощают структуру таким образом.

2. @PatrickRoberts — Конечно, это справедливое замечание, и оно отвечает на более насущный вопрос. Однако смешивание вашей выборки данных / бизнес-логики с вашими компонентами — это верный способ создать действительно беспорядочный и сложный в работе код.

3. И последнее замечание: когда пакет извлекаемых данных будет завершен, используйте setState() метод после того, как все это загружено (скорее всего, с помощью Promise.all() агрегирования ваших обещаний), чтобы дать указание компоненту React повторно отобразить себя, используя вновь доступные данные в его состоянии.

4. Да, и одна вещь, которая мне нравится в react-redux, — это то, что она предоставляет способ записать вашу бизнес-логику в HOC, который можно использовать для создания вашего компонента, позволяя логике быть разделяемой. Но для компонента не жизненно важно работать с асинхронными источниками данных.