Почему можно указать элементы React (объекты JavaScript) в качестве дочерних элементов компонента React?

Результатом вызова React.createElement(...) является объект следующего вида:

{
    $$typeof: Symbol(react.element),
    key: null,
    props: {children: Array(2)},
    ref: null,
    type: "div",
    _owner: null,
    _store: {validated: true},
    _self: null,
    _source: null,
    __proto__: Object
}

Я считаю, что это представление элемента DOM в виртуальном DOM React (пожалуйста, дайте мне знать, если это неверно).

Создавая функциональность для динамического добавления элементов на страницу, я по ошибке попытался сохранить массив реагирующих элементов в объекте состояния:

class Form extends Component {
  constructor(props) {
    super(props)
    this.state = { things: [], count: 0 }
  }
  updateForm(obj, cb) {...} 
  render() {
    return (<>
        {this.props.render({
          updateForm: this.updateForm.bind(this),
          ...this.state
        })}
    </>)
  }
}

const makeThing = props =>
  <div>
    I am a thing. count is: {props.count}
  </div>

const App = () =>
  <Form 
  render = {
    props => (
      <div>
        {props.things.map(t => t)} // RENDERING ELEMENTS DIRECTLY
        <button onClick = {() => props.updateForm({things: [...props.things, makeThing(props)]})}>Add thing</button>
        <button onClick = {() => props.updateForm({count: props.count + 1})}>Increase count</button>
      </div>
    )
  } />

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

Почему это вообще возможно? Конечно, НИКОГДА не бывает случая, когда я действительно хотел бы это сделать... Т.е. должна быть ошибка?

Почему это должно быть ошибкой? Я не уверен, что понимаю вопрос - я не понимаю, почему он находится в состоянии, поскольку вы никогда не используете вещи в состоянии, единственное, что здесь происходит, это то, что вы создаете массив объектов (через map) которые затем визуализируются. Примерно так создаются и визуализируются динамические объекты, например, столбцы и ячейки в BlueprintJS <Table> часто создаются таким образом. Можете ли вы более конкретно рассказать о своих опасениях?

Dave Newton 30.05.2019 14:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
271
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Единственное предостережение заключается в том, что более эффективно (и лучше с точки зрения разделения проблем) передавать свои viewData и обработчики, а затем использовать их для рендеринга ваших компонентов в тот момент, когда вам это действительно нужно.

Ничего плохого, скажем так.. т.е. добавление вещей в DOM. но это явно нереакция. если это сделано ... то это, вероятно, по ошибке

Zach Smith 30.05.2019 15:52

@ZachSmith Как это «явно не реагирующий способ»? Сохранение ссылок на компоненты — это очень React, например, карта состояний компонентов, набор строк данных и т. д. Это происходит постоянно в React.

Dave Newton 30.05.2019 15:57

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

Zach Smith 30.05.2019 16:06

@ZachSmith Дело не в том, что они «предварительно визуализированы», они не визуализируются до тех пор, пока не будут выполнены - их props не то, что вы думаете, они должны быть. React не знает ваш намерение, только ваш код. У React нет возможности узнать, что вы имел в виду должны делать, поэтому нет никакой причины, по которой это должно быть ошибкой — это не вина React, что вы передаете неправильные реквизиты.

Dave Newton 30.05.2019 16:48

Что вы подразумеваете под казнью в данном случае? Они являются объектом, поэтому их нельзя выполнить, скажем...

Zach Smith 30.05.2019 16:57

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