2016-07-30 1 views
5

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

Среди прочего: неизменность реквизита.

Если я правильно понял, то компоненты более или менее эквивалентны объектам в объектно-ориентированном программировании.

В объектно-ориентированном программировании вы передаете данные в объекты с помощью параметра method. В React вы получили реквизит для передачи данных в компоненты.

Если вы передадите параметр Java-методу, вы можете изменить эти данные в теле метода. Нет проблем.

В реактиве не возможно, потому что реквизит неизменен.

Вся литература и все, что я видел, упоминает эту неизменность как важное понятие. Но пока никто мне не сказал почему.

Может кто-нибудь скажет мне: Какая огромная выгода от непреложного реквизита?

Или, соответственно: что было бы большим недостатком, чтобы не иметь неизменяемости? Что может случиться, если реквизит изменен?

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

+0

http://www.stackoverflow.com/questions/34385243/why-is-immutability-so-importantor-needed-in-javascript/34387971#34387971 –

ответ

7

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

Начните с рассмотрения своих компонентов не с точки зрения объектов, а вместо этого, как функций (как в математическом термине). Ваш компонент является функцией его свойств. Более конкретно, это функция вывода .Он принимает реквизит и возвращает HTML (фактически он возвращает виртуальные деревья, но это не имеет значения)

Функции в математике . Вы даете им вход, они дают вам выход. У них нет побочных эффектов и они не используют никаких других входов. И это дает вам некоторые большие преимущества:

  1. Чистые функции предсказуемый. Каждый вход будет иметь точно такой же выход. Будучи предсказуемым, означает, что они могут быть оптимизированы и использовать такие вещи, как memoization, чтобы кэшировать их результат или не выполнять части вашего пользовательского интерфейса, если их реквизит не изменился с , вы знаете, что они не изменятся.
  2. В зависимости от введенного вами ввода чрезвычайно помогает при отладке, когда что-то не так, поскольку вам не нужно беспокоиться о глобальном состоянии. Вам остается только побеспокоиться о свойствах, переданных вам.
  3. Вам не нужно беспокоиться о заказе, в котором выполняется чистая функция, так как у них есть никаких побочных эффектов.
  4. Это позволяет действительно классно проявлять опыт работы, например Отладка времени путешествия и компоненты с возможностью «горячей замены».

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

+0

Побочные эффекты означают, что он изменяет состояние системы в целом? –

+0

Да. Если функция выполняет что-то иное, чем то, что она должна (например, она что-то сохраняет на «окне» или увеличивает счетчик где-то, это означает, что он имеет побочный эффект. Если, с другой стороны, он принимает его и ** ТОЛЬКО ** возвращает результат, это означает, что он не имеет побочных эффектов. – Dogoku

+0

Представьте, что произойдет, если базовые команды unix, такие как cd, cp, rm, будут иметь побочные эффекты, которые вы не можете контролировать. Невозможно было бы уверенно и безопасно использовать компьютер Это одна и та же идея: ваши компоненты должны делать только то, что они предназначены, и не более того. В случае React они не должны изменять глобальное состояние, и они не должны менять свой реквизит, и они должны возвращать только рендер html – Dogoku

3

(После прочтения следующих Why can't I update props in react.js?)

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

Можно сделать гораздо менее понятный код, если вам разрешено в компоненте A изменять состояние компонента B, напрямую меняя опоры.

Надеюсь, это ответ на вопрос почему.

3

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

Именно по этой причине в функциональном программировании чистые функции и неизменные типы являются нормой. Легко рассуждать - чистая функция - это чистое отображение ввода и вывода, и все.

+0

Предположим, у меня есть верхний компонент, некоторые средние компоненты , И нижний компонент, который, наконец, отображает данные. Если кто-то делает копию пропеллера где-то посередине, меняет копию, а затем передает эту копию вниз. Если теперь произойдет ошибка, я буду в ситуации: я не могу точно сказать, где проблема! Нет никакой гарантии, что данные с более высокого уровня текут без изменений. Поэтому я до сих пор не вижу большой пользы. –

+0

почему бы вам не знать? Если вы получите реквизит, вы узнаете, что проблема связана с тем, где реквизит был изменен или источником реквизита? Если вы всегда следите за тем, чтобы переданные вами данные были неизменными через какую-либо библиотеку или через Object.freeze, тогда вы точно знаете, что источником ошибки является компонент, который получил эти данные или сделал копию. Это определенно не от компонента верхнего уровня, который инициировал реквизит. –

+0

Я думаю, наконец, я понял ... Иногда нужно немного вперед и назад. Большое спасибо. :) –

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