Результатом вызова 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>
)
} />
Впоследствии я узнал, что указывать предварительно созданные элементы реакции как дочерние элементы какого-либо компонента просто не очень хорошая идея.
Почему это вообще возможно? Конечно, НИКОГДА не бывает случая, когда я действительно хотел бы это сделать... Т.е. должна быть ошибка?
Я не вижу никаких проблем с тем, что вы опубликовали. Вы можете создавать свои компоненты где угодно и как угодно и передавать их повсюду. Это просто объекты, поэтому они могут переходить в состояние, если хотите.
Единственное предостережение заключается в том, что более эффективно (и лучше с точки зрения разделения проблем) передавать свои viewData и обработчики, а затем использовать их для рендеринга ваших компонентов в тот момент, когда вам это действительно нужно.
Ничего плохого, скажем так.. т.е. добавление вещей в DOM. но это явно нереакция. если это сделано ... то это, вероятно, по ошибке
@ZachSmith Как это «явно не реагирующий способ»? Сохранение ссылок на компоненты — это очень React, например, карта состояний компонентов, набор строк данных и т. д. Это происходит постоянно в React.
В этом случае функция карты добавляет предварительно визуализированные элементы в качестве дочерних. Таким образом, они никогда не перерисовываются, а это означает, что они не обновляются при изменении «количества».
@ZachSmith Дело не в том, что они «предварительно визуализированы», они не визуализируются до тех пор, пока не будут выполнены - их props
не то, что вы думаете, они должны быть. React не знает ваш намерение, только ваш код. У React нет возможности узнать, что вы имел в виду должны делать, поэтому нет никакой причины, по которой это должно быть ошибкой — это не вина React, что вы передаете неправильные реквизиты.
Что вы подразумеваете под казнью в данном случае? Они являются объектом, поэтому их нельзя выполнить, скажем...
Почему это должно быть ошибкой? Я не уверен, что понимаю вопрос - я не понимаю, почему он находится в состоянии, поскольку вы никогда не используете вещи в состоянии, единственное, что здесь происходит, это то, что вы создаете массив объектов (через
map
) которые затем визуализируются. Примерно так создаются и визуализируются динамические объекты, например, столбцы и ячейки в BlueprintJS<Table>
часто создаются таким образом. Можете ли вы более конкретно рассказать о своих опасениях?