2016-07-26 204 views
0

我有一个父组件,PlanList:阵营子组件的状态不定

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> 
    ) 
    } 
} 

和子组件,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} /> 
    ); 
    } 
} 

当改变在FormControl的文本,该onChange属性按预期发射,但在父母对象中,子女的stateundefined。我预计它会填充正确的状态。

+0

显然,它不是在构造定义.. – webdeb

+0

是的,它是: '构造(道具){ 超级(道具); this.state = { search:'', };' – Ben174

+1

哦,我明白了,你正在做一些疯狂的狗屎..它没有怎么反应的作品.. – webdeb

回答

2

React数据在一个方向上流动,如果你的父母应该知道孩子的变化,你必须将一个处理器作为一个道具传递给孩子,所以它会从孩子内部调用。

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

所以简单的答案是:我使用的状态是错误的。这些应该是属性,最顶层的组件应该拥有这个状态。它应该根据其状态设置子对象的属性。 – Ben174

+0

是的,你也应该看看** redux ** @ Ben174 – webdeb