2015-04-29 28 views
14

Tôi đang cố gắng xây dựng một ứng dụng Todo rất đơn giản trong React Native. Nó bao gồm hai khung nhìn: một với một danh sách các nhiệm vụ, một với một lĩnh vực đầu vào (để thêm một cái mới). Điều hướng được đảm bảo bằng một số NavigatorIOS và các nút trên đó (có thể là UIBarButtonItem với UIKit).Thao tác định tuyến NavigatorIOS trên một thành phần

Trên giao diện danh sách, có một Thêm nút bên phải trên Navigator, trên quan điểm với lĩnh vực văn bản, có nút quay lại ở bên trái và một Xong một ở bên phải. Khi nhấp vào xong, nó sẽ thêm một nhiệm vụ mới với nội dung của trường văn bản.

Sự cố là, nút và hành động của chúng được xác định khi tạo thành phần NavigatorIOS và tôi không tìm cách đính kèm phương thức được xác định trong thành phần khác dưới dạng thao tác nút.

Như một ví dụ, đây là NavigatorIOS

class TodoList extends Component { 

    render() { 
     return (
      <NavigatorIOS 
       ref="nav" 
       style={styles.navbar} 
       initialRoute={{ 
        component: ItemList, 
        title: 'Todo list', 
        rightButtonTitle: 'Add', 
        onRightButtonPress:() => { 
         this.refs.nav.push({ 
          title: 'Add a new task', 
          component: AddTodo, 
          rightButtonTitle: 'Done', 
          onRightButtonPress:() => { 
           console.log('done !'); 
          } 
         }); 
        } 
       }} 
      /> 
     ); 
    } 
} 

của tôi, tôi không đặt ở đây hai của tôi thành phần khác ItemListAddTodo như không có gì thú vị về nó được.

Điều tôi cần là một cách để làm cho các thành phần giao tiếp (như trong mẫu ủy quyền) với thành phần điều hướng.

Có lẽ điều đó là không thể, hoặc tôi hoàn toàn sai lầm về mô hình được sử dụng với React Native, vì vậy hãy bình luận nếu có điều gì đó không rõ ràng về câu hỏi của tôi.

Sửa 05/26

Trên thực tế, Facebook đội nhận thức được rằng một cái gì đó là mất tích để xử lý trường hợp sử dụng với NavigatorIOS thành phần.

Từ Eric Vicenti (đăng vào ngày 3 tháng 2 năm 2015) trên an issue on GitHub chính xác bao gồm câu hỏi của tôi.

Hiện nay cách tốt nhất để làm điều đó là để tạo ra một EventEmitter trong chủ sở hữu của NavigatorIOS, sau đó bạn có thể vượt qua nó xuống để trẻ em sử dụng route.passProps. Đứa trẻ có thể kết hợp trong Subscribable.Mixin và sau đó trong componentDidMount, bạn có thể

this.addListenerOn(this.props.events, 'myRightBtnEvent', this._handleRightBtnPress); 

Rõ ràng là API này cần cải thiện. Chúng tôi đang tích cực làm việc API định tuyến trong Relay và hy vọng phản ứng-bộ định tuyến, nhưng chúng tôi muốn NavigatorIOS có thể sử dụng độc lập. Có lẽ chúng ta nên thêm một emitter kiện bên trong đối tượng navigator, vì vậy các thành phần trẻ có thể đăng ký hoạt động hàng hải khác nhau:

this.addListenerOn(this.props.navigator.events, 'rightButtonPress', this._handleRightBtnPress); 
+0

Tôi đã gặp vấn đề kiến ​​trúc chính xác này và đã giải quyết nó bằng cách mở rộng NavigationBar để tôi có thể xác định các hành động trong thành phần con. Tôi cũng đã nghiên cứu khả năng sử dụng các sự kiện sao cho cha mẹ đang phát ra các sự kiện bấm vào menu và đứa trẻ có thể lắng nghe các sự kiện và hành động, không chắc đó là cách tiếp cận đúng, quan tâm để xem những gì người khác nói. –

+0

@AaronSaunders Xin cảm ơn vì bình luận của bạn! Bạn đã mở rộng 'NavigatorIOS', hoặc' NavigationBar' là một thành phần bên trong của 'NavigatorIOS'? Tôi đã cố gắng để mở rộng các hoa tiêu, nhưng như callbacks đang trên 'initialRoute' prop (và sâu hơn), tôi không nhận được làm thế nào để lộ chúng. – Blackus

Trả lời

1

A. Trong thành phần ban đầu

this.props.navigator.push({ 
    title: 'title', 
    component: MyComponent, 
    rightButtonTitle: 'rightButton', 
    passProps: { 
     ref: (component) => {this.pushedComponent = component}, 
    }, 
    onRightButtonPress:() => { 
     // call func 
     this.pushedComponent && this.pushedComponent.myFunc(); 
    }, 
}); 

B. Trong đẩy thành phần
thay thế onRightButtonPress func trong thành phần được đẩy.

componentDidMount: function() { 
    // get current route 
    var route = this.props.navigator.navigationContext.currentRoute; 
    // update onRightButtonPress func 
    route.onRightButtonPress = () => { 
     // call func in pushed component 
     this.myFunc(); 
    }; 
    // component will not rerender 
    this.props.navigator.replace(route); 
}, 
Các vấn đề liên quan