Какой предпочтительный способ сортировки итерации в React?

Вот ситуация в псевдокоде:

{this.props.myIterable.map((iterable) => {
    return ( <div>iterable.somevalue</div> )
}).sort((a,b) => {return b - a})

Другими словами, я отображаю некоторые props и добавляю что-то в dom на основе их значений, что, конечно, стандартно. Однако поворот в том, что я хочу отсортировать их определенным образом, чтобы они добавлялись в определенном порядке.

Вот вопрос:

1) Этот код работает, но мне кажется, что я нарушаю некоторые принципы React. Я или это нормально?

2) Если это не рекомендуется, каковы альтернативы? Должен ли я написать метод внутри компонента, который я использую для выполнения этой операции? Должен ли я выполнять сортировку заранее, скажем, всякий раз, когда я добавляю элемент в реквизиты? Или что-то другое?

Это все довольно теоретически, но я поискал и не смог найти никаких ресурсов по этому поводу, поэтому я был бы очень признателен, если бы выслушал некоторые мнения. Спасибо.

изменить: b - a на самом деле

return b.props.children[0].props.children[1] - a.props.children[0].props.children[1]

Я не могу поверить, что b - a - правильное сравнение элементов ReactDOM.

Bergi 07.05.2018 21:48

@Bergi, я бы предположил, что это просто заполнитель реальной логики

Patrick Roberts 07.05.2018 21:48

@Bergi отредактировал для уточнения. Я использую реквизит сравниваемых детей.

yoursweater 07.05.2018 21:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
53
2

Ответы 2

Отсортируйте по somevalue (будущие дети), а затем составьте карту.

Примечание 1: Вы должны попытаться отсортировать исходное состояние (когда вы получаете данные с сервера, устанавливаете состояние и т. д.) Перед его передачей. Сортировка в методе рендеринга будет происходить при каждом рендеринге и может вызвать проблемы с производительностью.

Заметка 2: не забудьте добавить уникальный ключ к каждому элементу.

{this.props.myIterable
  .sort((a,b) => b.somevalue - a.somevalue)
  .map((iterable) => (<div key = {iterable.key}>iterable.somevalue</div>))
}

И обязательно добавьте ключ в div

Stephan Bijzitter 07.05.2018 21:53

Спасибо за ответ. В чем функциональная разница между выполнением сортировки перед отображением?

yoursweater 07.05.2018 21:54

Для начала вам не нужен a.props.children[0].props.children[1], кроме того, react работает с моделью, а модель меняет вид. Сортируйте модель, а не вид.

Ori Drori 07.05.2018 21:58

Да, сортировка как часть рендера разумна.

Если элементов много или ваша функция рендеринга часто вызывается, это может привести к проблемам с производительностью. В этом случае вы можете либо реализовать shouldComponentUpdate (или использовать PureComponent), либо создать новое состояние с именем sortedIterable (или что-то еще) и вычислить его в getDerivedStateFromProps. Таким образом, вам нужно вычислять сортировку только один раз за каждое изменение итерации.

Другие вопросы по теме