2017-01-16 24 views
5

Tôi mới trong React ES6 và tôi nghĩ rằng tôi đang sửa đổi nhà nước một cách sai lầm. Mã của tôi là như thế này khi tôi đặt nhà nước về thành phần cha mẹ:Làm cách nào để chuyển trạng thái gốc cho các thành phần con của nó?

class App extends React.Component { 
constuctor(props) { 
    super(props); 
    this.state = {name:"helloworld"}; 
} 
render() { 
    return( 
    <ChildComponent parentObj={this} /> // parentObj for parent context as props on child components 
); 
} 
} 

Vấn đề của tôi là trong thành phần trẻ khác, tôi phải làm điều đó repeatitively, là có một cách khác để làm việc đó? Tôi không có vấn đề với React.createClass, nhưng tôi muốn mã trong es6 vì vậy tôi có vấn đề này.

+1

[Nâng Nhà nước Up] (https://facebook.github.io/react/docs/lifting-state-up.html) và [Suy nghĩ trong React] (https://facebook.github.io/react/docs/thinking-in-react.html) sẽ cho bạn thấy cách làm việc thành ngữ hơn. –

Trả lời

6

Nếu bạn muốn vượt qua tình trạng {name: "helloworld"} làm điều đó như thế:

class App extends React.Component { 
constuctor(props) { 
    super(props); 
    this.state = {name:"helloworld"}; 
} 
render() { 
    return( 
    <ChildComponent {...this.state} /> 
); 
} 
} 

và trong thành phần con bạn có thể làm:

<Text>{this.props.name}</Text> 

Nhưng nếu bạn muốn vượt qua các đạo cụ của các thành phần để nó trẻ:

class App extends React.Component { 
    constuctor(props) { 
     super(props); 
     this.state = {name:"helloworld"}; 
    } 
    render() { 
     return( 
     <ChildComponent {...this.props} /> 
    ); 
    } 
    } 

và trong thành phần con bạn có thể làm:

<Text>{this.props.stuff}</Text>//place stuff by any property name in props 

Bây giờ, nếu bạn muốn cập nhật trạng thái của thành phần gốc từ thành phần con, bạn sẽ cần chuyển hàm cho thành phần con:

class App extends React.Component { 
    constuctor(props) { 
     super(props); 
     this.state = {name:"helloworld"}; 
    } 
    update(name){ 
     this.setState({name:name})// or with es6 this.setState({name}) 
    } 
    render() { 
    return( 
     <ChildComponent {...this.props, update: this.update.bind(this)} /> 
    ); 
    } 
    } 

và sau đó trong thành phần con bạn có thể sử dụng này: this.props.update('new name')

CẬP NHẬT

sử dụng constructor es6 hơn và loại bỏ

class App extends React.Component { 
    state = {name:"helloworld"}; 

    // es6 function, will be bind with adding .bind(this) 
    update = name => { 
     this.setState({name:name})// or with es6 this.setState({name}) 
    } 

    render() { 
    // notice that we removed .bind(this) from the update 
    return( 
     <ChildComponent {...this.props, update: this.update} /> 
    ); 
    } 
    } 
+0

Tôi hiểu điều này, nhưng tôi có thể thay đổi trạng thái từ các thành phần con không? –

+0

không trực tiếp, bạn có thể vượt qua một chức năng, hãy gọi nó là cập nhật, tôi sẽ chỉnh sửa câu trả lời để cho bạn thấy! – challenger

+0

là nó rõ ràng như thế nào? hoặc đã quá muộn! : p – challenger

0

nếu bạn muốn gửi toàn bộ trạng thái:

return(<ChildComponent {...this.state} />); 

Nhưng điều này có thể là một ý tưởng tồi :)

chỉnh sửa: trong kịch bản của bạn, điều này sẽ gửi một 'tên' tài sản để thành phần con với giá trị 'helloworld'

+0

có, tôi hiểu rằng nó gửi thuộc tính 'tên' nhưng tôi phải làm điều đó để tôi có thể sử dụng this.setState trên các thành phần con, nó hoạt động, nhưng bằng cách nào đó tôi nghĩ đó là 'sai' cách –

+0

tại sao lại là một ý tưởng tồi? –

+0

Nếu bạn gửi trạng thái từ cha mẹ xuống con một cách lặp lại, thì mô hình thành phần của bạn có thể không tốt :) –

Các vấn đề liên quan