Sie müssen eine callback
an die untergeordnete Komponente übergeben. Ich habe nur deinen Codepen gegabelt und ein paar Schnipsel wie unten hinzugefügt.
http://codepen.io/andretw/pen/xRENee
ist hier das wichtigste Konzept, eine Rückruffunktion "Eltern"Komponente inStellen und an die"Kind"Komponente
passieren
ie Die Kindkomponente benötigt eine zusätzliche Stütze den Rückruf zu erhalten:
<Form>
<FieldGroup>
<Field rules={'required'} cb={yourCallbackFunc}/>
</FieldGroup>
</Form>
In <FieldGroup />
(Eltern):
class FieldGroup extends React.Component{
constructor(props){
super(props);
this.state = {
color: 'blue'
}
}
cb (msg) {
console.log('doing things here', msg)
}
render() {
const childrenWithProps = React.Children.map(this.props.children,
child => React.cloneElement(child, {
cb: this.cb
})
)
return (
<div class='fields-group'>
<label> field </label>
{ childrenWithProps }
</div>
);
}
};
In <Field />
(Kind):
class Field extends React.Component{
constructor(props){
super(props);
this.state = {
empty: true
}
this.validate = this.validate.bind(this);
}
validate(e){
let val = e.target.value;
console.log(!val);
this.setState({empty: !val});
//here to notify parent to add a color style!
// do call back here or you may no need to return.
this.props.cb(val)
return !val;
}
render() {
return (
<div>
<input type='text' onBlur ={(event) => this.validate(event)}/>
{this.state.empty && 'empty'}
</div>
);
}
};
Und du die Dinge tun, können Sie in der Callback-Funktion wollen . (Sie können auch einen Rückruf von <Form />
an den Enkel übergeben und es funktioniert, aber Sie müssen das Design von ihm ist gut oder nicht zu überdenken.)
ist es mit CloneElement verlangsamt die App? Jetzt müsste jeder Renderer den cb, – Kossel
, zuordnen und zusammenführen. Dieser Teil ist für * das Hinzufügen einer Stütze zu jedem Kind in this.props.children *, Sie können auch die Kommentare unten [diese Antwort] (http: // stackoverflow. com/questions/35835670/react-router-and-this-props-kinder-how-to-pass-state-to-this-props-children). Ich habe den Benchmark dafür nicht gemacht, aber es sollte in Ordnung sein, wenn Sie nur ein paar "this.props.children" in der Komponente haben. –