Ik zet mijn eerste stap in ReactJS en probeer de communicatie tussen ouder en kinderen te begrijpen.
Ik ben vorm aan het maken, dus ik heb de component voor het opmaken van velden. En ik heb ook een bovenliggende component die een veld bevat en het controleert. Voorbeeld:
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!
}
})
Is er een manier om dit te doen. En is mijn logica goed in de “wereld” van reactjs? Bedankt voor uw tijd.
Antwoord 1, autoriteit 100%
Hiervoor geef je een terugbelverzoek door aan het kind van de ouder.
Bijvoorbeeld:
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} />
);
}
});
In het bovenstaande voorbeeld roept Parent
Child
aan met de eigenschap value
en onChange
. De Child
op zijn beurt bindt een onChange
-handler aan een standaard <input />
-element en geeft de waarde door aan de Parent
‘s callback als het is gedefinieerd.
Als resultaat wordt de Parent
‘s changeHandler
methode aangeroepen met als eerste argument de stringwaarde van de <input />
veld in het Child
. Het resultaat is dat de status van de Parent
kan worden bijgewerkt met die waarde, waardoor het element <span />
van de ouder wordt bijgewerkt met de nieuwe waarde terwijl u deze typt in het invoerveld van Child
.
Antwoord 2, autoriteit 46%
2019 Update met react 16+ en ES6
Dit plaatsen omdat React.createClass
is verouderd vanaf versie 16 van react en de nieuwe Javascript ES6 je meer voordelen geeft.
Ouder
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>
)
}
}
Vereenvoudigd staatloos kind als ES6-constante
import React from 'react';
const Child = (props) => {
return (
<div>
<h1 onClick= { () =>
props.es6Function(<SomethingThatYouWantToPassIn>)
}
> Something</h1>
</div>
)
}
export default Child;
Antwoord 3, autoriteit 35%
U kunt alle bovenliggende methoden gebruiken. Hiervoor moet je deze methoden van je ouder naar je kind sturen zoals elke eenvoudige waarde. En u kunt veel methoden van de ouder tegelijk gebruiken. Bijvoorbeeld:
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} />);
}
});
En gebruik het als volgt in het kind (voor elke actie of voor elke kindmethode):
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} />);
}
});
Antwoord 4, autoriteit 6%
Functie gebruiken || staatloze component
Oudercomponent
import React from "react";
import ChildComponent from "./childComponent";
export default function Parent(){
const handleParentFun = (value) =>{
console.log("Call to Parent Component!",value);
}
return (<>
This is Parent Component
<ChildComponent
handleParentFun={(value)=>{
console.log("your value -->",value);
handleParentFun(value);
}}
/>
</>);
}
Kindercomponent
import React from "react";
export default function ChildComponent(props){
return(
<> This is Child Component
<button onClick={props.handleParentFun("YoureValue")}>
Call to Parent Component Function
</button>
</>
);
}
Antwoord 5, autoriteit 2%
Geef de methode van de Parent
-component door als een prop
naar uw Child
-component.
dat wil zeggen:
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>
)
Antwoord 6
Reageer 16+
Kindercomponent
import React from 'react'
class ChildComponent extends React.Component
{
constructor(props){
super(props);
}
render()
{
return <div>
<button onClick={()=>this.props.greetChild('child')}>Call parent Component</button>
</div>
}
}
export default ChildComponent;
Oudercomponent
import React from "react";
import ChildComponent from "./childComponent";
class MasterComponent extends React.Component
{
constructor(props)
{
super(props);
this.state={
master:'master',
message:''
}
this.greetHandler=this.greetHandler.bind(this);
}
greetHandler(childName){
if(typeof(childName)=='object')
{
this.setState({
message:`this is ${this.state.master}`
});
}
else
{
this.setState({
message:`this is ${childName}`
});
}
}
render()
{
return <div>
<p> {this.state.message}</p>
<button onClick={this.greetHandler}>Click Me</button>
<ChildComponent greetChild={this.greetHandler}></ChildComponent>
</div>
}
}
export default MasterComponent;