Vue — показывать загрузчик во время вычисления вычисляемого свойства

РЕДАКТИРОВАТЬ. Обнаружено, что сортировка выполняется быстро, реальная проблема заключается в производительности рендеринга огромного списка, поэтому уже ответил

Пожалуйста, объясните мне, почему это ничего не делает:

У меня есть массив из тысяч элементов, есть кнопка для их сортировки по какой-то опоре (меняет опору "sortBy". Сортировка элементов занимает почти 2 секунды, по крайней мере, сколько времени после щелчка изменяется список. Во время вычислений (до новых отображается список) я хочу отобразить какой-то элемент «Загрузка». Я не знаю, может быть, у Vue есть какое-то состояние всего приложения, чтобы сказать, что что-то пересчитывается?

<div v-if = "loading">Wait pliz</div>
<div @click = "sortBy='ctg'">SortByCtg</div>
<div v-for = "item in sortedRows">{{item.ctg}} , {{item.name}} .... </div>

и вычисленная опора fn:

data: function(){ 
   return { 
    'sortby': 'name', 
    'sortbyDir': 1, 
    'loading': false,
    'rows': [ {'name':'abc','ctg':'def'}, ...] 
  }
},
computed: {
    sortedRows: function(){
     this.loading = true; //  <<< should show element
     var sortby = this.sortby;
     var sortbyDir = this.sortbyDir;
     var sorted = this.rows;
     sorted = this.rows.sort(function(a, b) { 
      return sortbyDir * a[sortby].localeCompare(b[sortby]); 
     });
    this.loading = false; //  <<< hide element
    return sorted;
  }
},
...

но элемент «загрузка» никогда не отображается. Может быть, сортировка быстрая, а что занимает время, так это сама генерация узлов? Тогда я могу как-нибудь показать загрузчик? Может быть, как-то использовать следующий тик? Я пробовал, но безрезультатно.

В коде, который вы нам показываете, вы не показали, когда sordedRows является вызовом, и является ли this.loading реактивным свойством, и какое начальное значение. Чтобы проверить свое предположение о том, что сортировка происходит настолько быстро, что она просто происходит, вы можете просто прокомментировать this.loading = false и проверить, появляется ли div.

Mario Santini 02.06.2023 08:39

@MarioSantini хорошо, я думал, что это ясно, но добавил, как вы указали

PM_KLS 02.06.2023 08:57

@PM_KLS Эта переменная loading инициализирована в вашем data: function() {}? Я вижу только sortBy и rows как объявленные.

Vitomir 02.06.2023 09:10

@Vitomir уверен, что «загрузка» инициализирована как ложная, добавлена ​​​​в пример кода

PM_KLS 02.06.2023 09:36

ОБНОВЛЕНИЕ - измерено с использованием разницы Date.now(); и в начале и в конце fn , кажется, всего около 15 мс ... так что реальное замедление может быть в другом месте - возможно, при перерисовке самого списка из-за слишком большого количества элементов .... есть идеи?

PM_KLS 02.06.2023 09:45

Вы можете протестировать свой код, добавив тайм-аут к this.loading = false. Если значок не отображается, вы точно знаете, что он не отображается.

Wimanicesir 02.06.2023 09:47

@Wimanicesir это показывает, я только что обнаружил, что сортировка fn быстрая, что значит, что долгое время генерируются узлы в документе (около 3500 строк таблицы на данный момент). Сейчас я ищу возможность проверить, активно ли приложение перерисовывает... идеи?

PM_KLS 02.06.2023 09:54

Здесь есть много вариантов. Я бы посоветовал вам сделать таблицу с разбивкой на страницы, чтобы не загружать слишком много. Я не знаю, какова ваша цель с данными, но вы всегда можете рассмотреть возможность использования Object.Freeze(). Это устраняет реактивность, но должно генерироваться намного быстрее :)

Wimanicesir 02.06.2023 10:06

Первое правило для отображения такого количества записей в таблице — использовать разбиение на страницы, независимо от того, будет ли это с выбором страницы (1, 2, 3 и т. д.) или будет загружаться около 20-30 записей при прокрутке. В своих проектах я всегда использую разбиение на страницы со страницами, а максимальное количество записей на странице — 100. Однако это означает, что вам также придется модифицировать серверную часть, если вы получаете данные из API.

Vitomir 03.06.2023 21:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

«Сортировка элементов занимает почти 2 секунды» и «Может быть, сортировка будет быстрой» противоречат друг другу, но вы не видите индикатора загрузки ни в одном из них. Обычно сортировка заканчивается через несколько мс, вы почти ничего не видите. Другая возможность: если он работает в течение 2 секунд (медленный алгоритм или рендеринг тысяч строк на странице после сортировки), он блокирует основной поток, и вы не увидите никаких изменений на странице.

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

да, я уже обнаружил, что сортировка на самом деле составляет всего ~ 20 мс, поэтому долгое время - это когда элементы перерисовываются. О том, что я не должен изменять данные в cpmputed, в этом весь смысл вычислений ... я использую консольный журнал и вижу, что пересчет происходит ТОЛЬКО, если я нажимаю кнопку, поэтому он действительно делает это «один раз» после нажатия ... но как я могу ждать, пока большой список будет перерисован? могу ли я сказать, что повторный рендеринг закончился?

PM_KLS 02.06.2023 09:58

Это должен был быть комментарий. Тогда вы также увидите, что половина вашего ответа уже сказана :)

Wimanicesir 02.06.2023 09:59

Computed — геттер, он должен изменять только копию данных. Из документа: «Важно помнить, что вычисляемые функции получения должны выполнять только чистые вычисления и не иметь побочных эффектов». Для ускорения рендеринга можно использовать любой из этих приемов: бесконечная прокрутка, нумерация страниц, виртуальный список

Soresu 02.06.2023 10:36
Ответ принят как подходящий

Сортировка выполняется быстро (несколько миллисекунд), что действительно требует времени, так это рендеринг длинного списка

Это должен быть комментарий. Также ОП указал на это в своем комментарии за 18 минут до того, как вы опубликовали этот ответ.

Wimanicesir 02.06.2023 10:23

@Wimanicesir хорошо, я ОП, и я решил ответить на свой вопрос, потому что я вижу, что это не проблема сортировки, проблема производительности рендеринга, поэтому я считаю, что это решено

PM_KLS 02.06.2023 10:29

@ Wimanicesir, ты совершенно не прав. То, что это кратко, не означает, что это не ответ на вопрос. Или правильный ответ. Можно ли его улучшить и/или расширить? Абсолютно! Это должен быть комментарий? Точно нет. Для Stack Overflow публиковать ответы в виде комментариев вредно. Они, как правило, не помогают будущим пользователям, столкнувшимся с той же проблемой, и препятствуют правильной индексации, а также ограничивают пользователей, которые в противном случае ответили бы на вопрос, от публикации ответа.

tao 02.06.2023 10:43

@tao Я пропустил, это был ОП. Однако я могу изменить свой голос только в том случае, если это будет отредактировано. Также это не ответ, это говорит о том, в чем была проблема, но не о том, как ее решить. Я не знаю, как будущие пользователи будут использовать этот «ответ». ИМО, это все еще следует отредактировать в вопросе, поскольку из этого будет получено реальное решение.

Wimanicesir 02.06.2023 10:55

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