У меня компонент с состоянием, форма. В конструкторе я создаю состояние, затем я повторяю компоненты дочерних элементов. Я клонирую целевых детей и добавляю реквизиты, используяреагировать изменение состояния не повторяет клонированных детей
React.cloneElement(x, {data: modelProperty});
, где modelProperty - это объект с куском this.state на нем. Из-за клонирования я заканчиваю другим экземпляром this.props.children. Поэтому в рендере я делаю свою новую коллекцию детей, которые были украшены куском родителей this.state.
Я ожидаю, что он создаст привязку между состоянием и дочерними элементами, так что при изменении состояния дети, которые выполняются, будут повторно зарегистрированы. Однако, в то время как родительский компонент (форма) делает ререйдер, дети, которые выполняются изменением состояния, не повторно отображают.
Возможно, это немного сбивает с толку, поэтому я отправлю код.
constructor(props) {
super(props);
this.state = {
fields: props.fields,
formIsValid: true
};
this.newChildren = decorateInputs(this.props.children, this.state.fields);
}
затем
const decorateInput = (children, fields) => {
return React.Children.map(children, x => {
if(!x.props){ return x; }
if (x.props.frfProperty) {
var field = fields.filter(f => f.name === x.props.frfProperty)[0];
if (!field) {
throw new Error(`No property on model with name: ${x.frfProperty}!`)
}
return React.cloneElement(x, {data: field});
}
var clonedItems = decorateInput(x.props.children, fields);
return React.cloneElement(x, {children: clonedItems});
})
};
экспорта по умолчанию decorateInput;
затем
render() {
return (<form onSubmit={this.onSubmitHandler.bind(this)} >
{this.newChildren}
</form>)
}
Теперь один быстро исправить, чтобы сделать украшение в методе визуализации, но это делает все дочерние компоненты снова, а не только те, чье состояние изменилось.
Мой основной вопрос: почему поведение повторной визуализации ломается или нет у клонированных детей.
Наконец, я знаю, что есть другие шаблоны, которые будут работать. Мой вопрос касается механики делать это таким образом. то есть я знаю о redux, и я знаю, что у меня может быть собственная оболочка для детей, предоставляемых потребителю. Просто пытаюсь понять это.
Спасибо, R
Интересно. И правда. Это сработало. Я обновил все мои дети, хотя и не только тот, чье состояние я изменил. Но, возможно, этого нельзя избежать из-за рекурсии и клонирования. – Raif
@ Raif Я думаю, что это может быть запах плохого дизайна. Оказание - это просто отражение государства. Если вы измените состояние и хотите отобразить только часть детей, возможно, эти дети вообще не интересуются этим состоянием? Может быть, вы должны перенести их на другой компонент? – mklimek
хорошо, ситуация в том, что это входы в форме, когда событие onChange запускается, оно обновляет состояние только для одного входа. Я бы предпочел не перерисовывать каждый вход на каждое нажатие клавиши – Raif