2016-07-26 7 views
0

ich eine übergeordnete Komponente haben, PlanList:Reagieren Kind Komponente Zustand ist undefiniert

class PlanList extends Component { 
    constructor(props) { 
    super(props); 
    this.renderPlans = this.renderPlans.bind(this); 
    this.planListFilter = <PlanListFilter onChange={this.handleFilterChange.bind(this)} /> 
    } 

    loadPlans() { 
    console.log(this.planListFilter); 
    // returns: Object {$$typeof: Symbol(react.element), key: null, ref: null, props: Object, _owner: ReactCompositeComponentWrapper…} 

    console.log(this.planListFilter.state); 
    // returns: undefined 
    // I expect it to return the state object i defined in the PlanListFilter constructor 

    // here I would apply the filters to the PlanTable 
    } 

    handleFilterChange(event) { 
    this.loadPlans(); 
    } 

    render() { 
    return (
     <div className="PlanList"> 
     {this.planListFilter} 
     <PlanTable /> 
     </div> 
    ) 
    } 
} 

und ein Kind Komponente, PlanListFilter:

class PlanListFilter extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     search: '', 
    }; 
    this.handleSearchChange = this.handleSearchChange.bind(this); 
    } 

    handleSearchChange(event) { 
    this.setState({search: event.target.value}); 
    this.props.onChange(event); 
    } 

    render() { 
    return (
     <FormControl type="text" placeholder="Search" onChange={this.handleSearchChange} value={this.state.search} /> 
    ); 
    } 
} 

Wenn der Text auf der Formcontrol zu ändern, die onChange Eigenschaft ist wie erwartet abgefeuert, aber im übergeordneten Objekt state des Kindes ist undefined. Ich erwarte, dass es mit dem richtigen Status gefüllt wäre.

+0

offensichtlich, es ist nicht im Konstruktor definiert .. – webdeb

+0

Ja, es ist: 'Konstruktor (Requisiten) { Super (Requisiten); this.state = { suche: '', }; ' – Ben174

+1

oh, ich sehe, du machst ein paar verrückte scheisse .. es ist nicht wie reagieren funktioniert .. – webdeb

Antwort

2

In React Daten fließt in eine Richtung, wenn Ihr Elternteil über Änderungen in der untergeordneten wissen sollte, müssen Sie einen Handler als Prop zu dem Kind übergeben, so dass es aus dem Kind aufgerufen wird.

class Papa extends React.Component { 
    constructor(p, c) { super(p, c) } 
    handleFilterChange(valueFromChild) { 
    // 
    } 
    render() { 
    return <Child filterHandler={this.handleFilterChange} /> 
    } 
} 

const Child = ({filterHanlder}) => (
    <button onClick={() => filterHandler('valueToParent') } >Click Me</button> 
) 
+0

Also die kurze Antwort ist: Ich habe den Staat falsch verwendet. Diese sollten Eigenschaften sein und die oberste Komponente sollte den Status besitzen. Es sollte die Eigenschaften von untergeordneten Objekten basierend auf seinem Status festlegen. – Ben174

+0

Ja, Sie sollten auch einen Blick auf ** Redux ** @ Ben174 werfen – webdeb