Ich mache meinen ersten Schritt in ReactJS und versuche, die Kommunikation zwischen Eltern und Kindern zu verstehen ... Ich mache Form, also habe ich die Komponente zum Gestalten von Feldern. Und ich habe auch eine übergeordnete Komponente, die ein Feld enthält und es überprüft. Beispiel:
var LoginField = React.createClass({
render: function() {
return (
<MyField icon="user_icon" placeholder="Nickname" />
);
},
check: function () {
console.log ("aakmslkanslkc");
}
})
var MyField = React.createClass({
render: function() {
...
},
handleChange: function(event) {
//call parent!
}
})
Gibt es eine Möglichkeit, dies zu tun? Und ist meine Logik in reaktiver "Welt" gut? Vielen Dank für Ihre Zeit.
Dazu übergeben Sie einen Rückruf als Eigenschaft an das untergeordnete Element des übergeordneten Objekts.
Zum Beispiel:
var Parent = React.createClass({
getInitialState: function() {
return {
value: 'foo'
}
},
changeHandler: function(value) {
this.setState({
value: value
});
},
render: function() {
return (
<div>
<Child value={this.state.value} onChange={this.changeHandler} />
<span>{this.state.value}</span>
</div>
);
}
});
var Child = React.createClass({
propTypes: {
value: React.PropTypes.string,
onChange: React.PropTypes.func
},
getDefaultProps: function() {
return {
value: ''
};
},
changeHandler: function(e) {
if (typeof this.props.onChange === 'function') {
this.props.onChange(e.target.value);
}
},
render: function() {
return (
<input type="text" value={this.props.value} onChange={this.changeHandler} />
);
}
});
Im obigen Beispiel ruft Parent
Child
mit der Eigenschaft value
und onChange
auf. Der Child
im Gegenzug bindet einen onChange
-Handler an ein Standardelement <input />
und übergibt den Wert an den Callback des Parent
, falls definiert.
Als Ergebnis wird die Parent
-Methode changeHandler
aufgerufen, wobei das erste Argument der Zeichenfolgenwert aus dem <input />
-Feld in Child
ist. Das Ergebnis ist, dass der Status von Parent
mit diesem Wert aktualisiert werden kann, wodurch das <span />
-Element des übergeordneten Elements mit dem neuen Wert aktualisiert wird, wenn Sie ihn in das Eingabefeld von Child
eingeben.
Sie können beliebige übergeordnete Methoden verwenden. Dazu sollten Sie diese Methoden wie ein einfacher Wert von Ihrem Elternteil an Ihr Kind senden. Sie können gleichzeitig viele Methoden des übergeordneten Elements verwenden. Zum Beispiel:
var Parent = React.createClass({
someMethod: function(value) {
console.log("value from child", value)
},
someMethod2: function(value) {
console.log("second method used", value)
},
render: function() {
return (<Child someMethod={this.someMethod} someMethod2={this.someMethod2} />);
}
});
Und verwenden Sie es wie folgt für das Kind (für alle Aktionen oder für Kindmethoden):
var Child = React.createClass({
getInitialState: function() {
return {
value: 'bar'
}
},
render: function() {
return (<input type="text" value={this.state.value} onClick={this.props.someMethod} onChange={this.props.someMethod2} />);
}
});
Wenn Sie dies buchen, da React.createClass
von der Reaktversion 16 nicht mehr unterstützt wird, bietet Ihnen das neue Javascript ES6 weitere Vorteile.
Elternteil
import React, {Component} from 'react';
import Child from './Child';
export default class Parent extends Component {
es6Function = (value) => {
console.log(value)
}
simplifiedFunction (value) {
console.log(value)
}
render () {
return (
<div>
<Child
es6Function = {this.es6Function}
simplifiedFunction = {this.simplifiedFunction}
/>
</div>
)
}
}
Kind
import React, {Component} from 'react';
export default class Child extends Component {
render () {
return (
<div>
<h1 onClick= { () =>
this.props.simplifiedFunction(<SomethingThatYouWantToPassIn>)
}
> Something</h1>
</div>
)
}
}
Vereinfachtes zustandsloses Kind als SE6-Konstante
import React from 'react';
const Child = () => {
return (
<div>
<h1 onClick= { () =>
this.props.es6Function(<SomethingThatYouWantToPassIn>)
}
> Something</h1>
</div>
)
}
export default Child;
Übergeben Sie die Methode von Parent
-Komponente als prop
an Ihre Child
-Komponente .
export default class Parent extends Component {
state = {
Word: ''
}
handleCall = () => {
this.setState({ Word: 'bar' })
}
render() {
const { Word } = this.state
return <Child handler={this.handleCall} Word={Word} />
}
}
const Child = ({ handler, Word }) => (
<span onClick={handler}>Foo{Word}</span>
)