Родитель передает состояние дочернему - React js

ObjectList имеет массив объектов, которые отображаются в виде списка. Когда пользователь щелкает элемент списка, этот объект отправляется обратно в ObjectEditor, чтобы пользователь мог просмотреть его и продолжить редактирование. Проблема в том, что я не уверен, как передать этот объект в ObjectEditor, потому что событие щелчка происходит в ObjectList.

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

Я новичок в React, поэтому мне бы хотелось пока не использовать Redux, пока я не рассмотрю React.

Я сильно урезал код для ясности.

Список объектов:

      constructor(props){
       super(props);
       this.state = { objects: [
          {title: '', items: [], anotherThing:''},
          {title: '', items: [], anotherThing:''}
        ]}
      }

      viewObject = (index) => {
      let object = {...this.state.object[index]};
     // Then some code that passes the object to the ObjectEditor Component
       }

      render(){
        return(
          <div>

           <li key = {index} onClick = { () => this.viewObject(index) } >
           // A list of titles from state
           </li>

          <ObjectEditor />
          </div>
        )
      }

Редактор объектов:

       constructor(props){
       super(props);
       this.state = {title:'', items: [], anotherThing:''}
       }

    // various event handlers that update the state based off form inputs

      render(){
        return(
          <div> 

            // Various form fields which get pushed to state

            <button>Save & Add New</button> 

            // function that maps through state and renders it to the page
          </div>
        )
      }
    }
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
30
1

Ответы 1

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

class Parent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            objects: [
                { title: '', items: [], anotherThing: '' },
                { title: '', items: [], anotherThing: '' }
            ],
            editObject: {},
        }
    }

    viewObject = (index) => {
        let object = { ...this.state.object[index] };
        this.setState({editObject: object}); // sets the state if the clicked item.
        // Then some code that passes the object to the ObjectEditor Component
    }

    handleChangeEvent = (e) => {
        // handle change
    }

    render() {
        return (
            <div>

                <li key = {index} onClick = {() => this.viewObject(index)} >
                // A list of titles from state
                </li>

                <ObjectEditor viewObject = {this.state.viewObject} handleChangeEvent = {this.handleChangeEvent} />
            </div>
        )
    }
}


class ObjectEditor extends React.Component {
    render() {
        return (
            // render some sort of editor
            // display data based on the props passed down
            // when user edits in the form, call up to the parent's change handler
        );
    }
}

К сожалению, ObjectEditor должен иметь состояние, потому что он использует библиотеку перетаскивания, которая позволяет пользователям изменять порядок элементов. Может, пора взглянуть на Redux.

George Bleasdale 05.12.2018 22:35

не могли ли ваши родители справиться с этой логикой?

Chaim Friedman 05.12.2018 22:36

Ваш вопрос подсказал мне идею! Я добавил значение currentItem в состояние ObjectLists, которое изменялось при нажатии на элемент, затем я передал его в ObjectEditor в качестве реквизита и использовал componentWillReceiveProps. Спасибо!

George Bleasdale 05.12.2018 22:43

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