Squeak.ru - шаблоны программирования

Обновление состояния из дочернего компонента reactjs

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

У меня есть два компонента,

  1. NewPurchaseOrder (родительский комп.)
  2. SelectWarehouse (дочерний комп.)

Компонент SelectWarehouse отобразит раскрывающийся список доступных складов в компоненте NewPurchaseOrder.

У родительского компонента есть одно состояние warehouseId для отслеживания выбранного склада, для обновления состояния родительских компонентов (inventoryId) из дочернего компонента, я делаю это,

Родительский компонент

<SelectWarehouse
  updateTarget={ ( ghostValue ) => {
    this.setState( {
      warehouseId: ghostValue // updating the state from child comp. value
    }, () => {
      console.log( 'yokygoky', this.state.warehouseId )
    } )
  } }
/>

Дочерний компонент

handleChangeWarehouse( e ) {
  this.setState( {
    selectedWarehouse: e.target.value
  }, () => {
    this.props.updateTarget( e.target.value ) // Updating the parent props
  } )
}

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

<SelectWarehouse
  updateTarget={ warehouseId }
/>

А затем обновите inventoryId из дочернего компонента.

Возможно ли это?

Я протестировал его, отправив только состояние без везения, также невозможно связать этот контекст только с простым состоянием.

04.06.2017

  • У вас будет только один SelectWarehouse ребенок? Или вы готовитесь к возможности иметь несколько SelectWarehouse дочерних элементов, поэтому вы хотите динамически определять ключи состояния? 04.06.2017

Ответы:


1

Простой ответ на ваш вопрос: Нет. Но почему?

То, что вы спрашиваете, очень похоже на концепцию двусторонней привязки, которая поддерживается в таких фреймворках, как Angular и Vue.js. Это означает, что данные будут передаваться от дочернего компонента к родительскому с одной привязкой. React не поддерживает это и настоятельно не рекомендует использовать такой подход. Он всегда предпочитает однонаправленный поток данных.

Таким образом, с React вы можете легко отправлять свои данные сверху вниз по дереву компонентов, используя props. Но если вы хотите обратное перенаправление снизу вверх, единственный вариант, который у вас есть, - это обратные вызовы. Вы можете передать обратный вызов как опору своему дочернему компоненту, и он вызовет обратный вызов с соответствующими данными, когда данные будут готовы. Иногда это сложно, когда нам нужна связь между глубоко вложенными компонентами. Вот где вам нужно использовать библиотеку управления состоянием, такую ​​как Redux или React context. который не рекомендуется использовать, если вы не опытный разработчик.

Чтобы лучше понять это, я предлагаю вам прочитать Thinking in React раздел из официальных документов React. Они считают, что такой подход упрощает понимание того, как работает программа, чем волшебное двустороннее связывание.

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

Также,

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

В вашем случае, вероятно, вам придется смириться с этим, выполнить рефакторинг в другой формат, предложенный другими ответами, или использовать стороннюю библиотеку, например response-binding (я не использовал его, поэтому не могу рекомендовать).

04.06.2017

2

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

Итак, первый метод, который вы использовали, - это правильный способ сделать это.

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

Родитель

updateTarget = (newValue) => {

    this.setState( {
      warehouseId: newValue // updating the state from child comp. value
    }, () => {
      console.log( 'yokygoky', this.state.warehouseId )
    } )
}
<SelectWarehouse
  updateTarget={ ( ghostValue ) => this.updateTarget(ghostValue) }
/>
04.06.2017

3

Неправильно обновлять состояние родительского компонента непосредственно из дочернего. Первая версия <SelectWarehouse /> с updateTarget как func правильная.

Кроме того, нет необходимости сохранять WarehouseId в состоянии дочернего компонента. Складской идентификатор может быть передан дочернему компоненту в качестве реквизита.

<SelectWarehouse
  updateTarget={( ghostValue ) => {
    this.setState( {
      warehouseId: ghostValue
    })
  }}
  warehouseId={this.state.warehouseId}
/>
04.06.2017

4

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

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

Родитель

updateTarget = (value) => {

   this.setState( {
     warehouseId: value 
   })
}
<SelectWarehouse
 updateTarget= {this.updateTarget }
/>

Ребенок

handleChangeWarehouse( e ) {
  this.setState( {
    selectedWarehouse: e.target.value
  }, () => {
    this.props.updateTarget( e.target.value )       
  })
}
04.06.2017
Новые материалы

Угловая структура архитектуры
Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

«Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

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

Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

Создайте API с помощью Python FastAPI
Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

Веселье с прокси-сервером JavaScript
Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

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