2016-01-25 2 views
0

Я читал о том, что Реакт был очень быстрым. Недавно я написал приложение для тестирования, реагирующего на угловые. К сожалению, я обнаружил, что реакция выполняется медленнее, чем угловая. http://shojib.github.io/ngJS/#/speedtest/react/1Проблема с реакцией

Вот исходный код для реакции. Я очень недавно реагирую. Я уверен, что я делаю что-то не так с моим кодом реакции здесь. Я нахожу это необычно медленным. https://jsbin.com/viviva/edit?js,output

Посмотрите, могут ли какие-либо специалисты по реагированию найти узкие места.


Update 1:

  1. Убрано использование контекста.
  2. Лучшее использование setState.
  3. Лучшее использование shouldComponentUpdate.

Я все еще не могу сделать это быстрее, чем угловой или даже близко к нему. https://jsbin.com/viviva/96/edit?js,output


Update 2:

Я сделал большую ошибку, создав 2d массивов в компоненте клеток. Поэтому я перевел их на микс. Теперь я считаю, что реагирование быстрее, чем угловатое в DOM-манипуляциях. https://jsbin.com/nacebog/edit?html,js,output


Update 3:

Моя ошибка снова. Я сделал это неправильно, что сделало это быстрее. После анализа это было неверно. Если кто-нибудь может помочь мне понять, если это может быть быстрее. Я знаю, что реагировать не очень хорошо на большие массивы. В этом случае речь идет о четырех трехмерных массивах. https://jsbin.com/viviva/100/edit?html,css,js

+0

url должен работать сейчас. https://jsbin.com/viviva/100/edit?html,css,js – user730009

ответ

1

Это очень надуманный пример, на мой взгляд.

  • Как указано выше, вы используете контекст неправильно.
  • Нет необходимости в mixin: количество столбцов и строк может и должно передаваться в виде реквизита. create2DArray, getRandomNumber должны быть объявлены в верхней части вашего скрипта как простые глобальные функции.
  • Неправильное положение. Вы не должны изменять состояние, подобное этому this.state.some = 'whatever', вам нужно использовать setState

    this.setState ({some: 'whatever'});

+0

Что не так в использовании миксинов? – user730009

+0

В миксинах нет ничего плохого. Я просто говорю, что я не думаю, что они необходимы в этом конкретном примере. Кроме того, API для mixins МОЖЕТ уйти в будущем, здесь интересно прочитать: https://medium.com/@dan_abramov/mixins-are-dead-long-live-higher-order-components-94a0d2f9e750#.c584pmbtp – Raspo

1

Эффект Реагента преувеличен. Это достаточно быстро для большинства реальных случаев использования. Основным недостатком является рендеринг больших списков.


Также это всегда возвращает true (если обновление не инициировано setState). Вам нужно поменьше сравнить реквизит.

shouldComponentUpdate: function(nextProps, nextState) { 
    return this.props !== nextProps; 
    } 

И вы должны использовать реквизит в местах, где вы используете контекст.

+0

Я не знаю, может ли контекст ухудшить производительность. Но я считаю, что контекст очень полезен. Если я хочу передать информацию от родителя к внуку, не передавая его сначала ребенку, я могу добиться этого с помощью контекста. Если у меня более сложная иерархия, я бы не хотел передавать информацию всем дочерним узлам, хотя я имел в виду эту информацию только для узлов внуков. – user730009

+0

@ user730009 контекст не предназначен для передачи данных ко всему дереву, а для передачи данных, которые не часто меняются на все дерево. Если ваши данные контекста изменяются, вы должны быть очень осторожны с обновлением всего этого дерева, потому что повторная рендер не запускается. Если вы хотите передать данные глубокому ребенку без шаблона, вам следует подумать о Flux или Redux –

+0

. Также React не лучший для отображения больших списков, но есть потенциальные оптимизации, которые еще не были очень экспериментированы. Я сделал несколько здесь: http://stackoverflow.com/questions/30976722/react-performance-rendering-big-list-with-purerendermixin –

1

Вы используете контекст неправильно, документация гласит:

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

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

Вам необходимо убедиться, что shouldComponentUpdate является значимым предикатом. См. https://facebook.github.io/react/docs/advanced-performance.html

Если вы исправите эти две вещи, это будет лучшим показателем эффективности Реакта по сравнению с угловым. На данный момент у вас есть хорошо настроенный Ferrari, работающий против модели T Ford (удерживаемой вместе с жевательной резинкой).

Смежные вопросы