Почему реквизиты в React доступны только для чтения?

В документации React сказано: React is pretty flexible but it has a single strict rule: all React components must act like pure functions with respect to their props.

Это почему?

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


person L. Pier Roberto    schedule 20.07.2018    source источник
comment
Я думаю, потому что они хотели, чтобы поток был однонаправленным, чтобы избежать двусмысленности.   -  person Revansiddh    schedule 20.07.2018
comment
Возможный дубликат Почему я не могу обновить реквизиты в react.js? Другой возможный дубликат: stackoverflow. ком/вопросы/47471131/   -  person Revansiddh    schedule 20.07.2018
comment
Возможный дубликат Почему реквизиты React неизменяемы   -  person Shubham Khatri    schedule 20.07.2018
comment
Реквизиты — это то, что мы передаем от одного компонента к другому, и возможно, что props передается нескольким компонентам. Если мы позволим компоненту обновлять реквизиты напрямую, тогда он отобразит все дочерние компоненты, которым переданы реквизиты, чего можно было бы ожидать, но это может работать в нескольких сценариях в зависимости от проекта.   -  person Milind Agrawal    schedule 10.02.2020


Ответы (2)


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

На самом деле, свойства компонента — это конкретно «состояние другого компонента (родительского компонента)». Таким образом, реквизиты должны управляться их владельцем компонента. Вот почему все компоненты React должны вести себя как чистые функции по отношению к своим реквизитам (а не напрямую изменять свои реквизиты).

Я покажу вам простой пример:

class ParentComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      p1: {a:1, b:2},
    }

   render() {
      return <ChildComponent p1={this.state.p1} />     
   }
}

В ChildComponent, если вы хотите мутировать "переданный реквизит p1" (p1 - это объект с его собственной ссылкой) (например, в ChildComponent вы пишете: p1.a=3), очевидно, "p1 - свойство состояния ParentComponent" также видоизменен. Но в этом случае ParentComponent не мог повторно отобразиться, потому что вы не активировали действие setState() в ParentComponent. Таким образом, это создаст множество неконтролируемых ошибок для нестабильного приложения React.

Я надеюсь, что сейчас вы понимаете, почему React говорит:

Строгое правило: все компоненты React должны вести себя как чистые функции по отношению к своим свойствам (не изменять напрямую свои свойства).


Бонус: для правильного изменения (мутации) реквизита необходимо использовать «обратный вызов fnc prop» в ChildComponent. Прямо сейчас он хорошо соблюдает концепцию React Component.

class ParentComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      p1: {a:1, b:2},
  }

  this.changeP1 = () => {
     this.setState({p1: {a:3, b:4}});
  }

   render() {
      return <ChildComponent p1={this.state.p1} changeP1={this.changeP1} />     
   }
}
person SanjiMika    schedule 10.02.2020

документы

Реагировать документы сказали

Все компоненты React должны вести себя как чистые функции по отношению к своим свойствам. Конечно, пользовательский интерфейс приложения динамичен и меняется со временем. В следующем разделе мы введем новое понятие «состояние». Состояние позволяет компонентам React изменять свои выходные данные с течением времени в ответ на действия пользователя, сетевые ответы и что-либо еще, не нарушая это правило.

person MJ Studio    schedule 10.02.2020