2016-07-26 149 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