在打开的组件中处理 NavigatorIOS ButtonPress

Posted

技术标签:

【中文标题】在打开的组件中处理 NavigatorIOS ButtonPress【英文标题】:Handle NavigatorIOS ButtonPress in the opened component 【发布时间】:2015-06-27 11:58:01 【问题描述】:

我的应用中有 Navigatorios,我像这样打开一个新页面,它工作正常:

  var createProgramRoute = 
    component: CreateProgramPage,
    title: "Create Program",
    rightButtonTitle: "Save",
    onRightButtonPress: () => 
      // This part needs to be handled in CreateProgramPage component
    ,
    passProps: ,
  ;
  props.navigator.push(createProgramRoute);

CreateProgramPage 类是这样的

var CreateProgramPage = React.createClass(
  ...

  _onRightButtonClicked() 
    console.log("right button clicked")
  

);

所以我想在点击 NavigatorIOS 的 RightButton 时调用 CreateProgramPage_onRightButtonClicked()。没有这样的例子。他们在示例中所拥有的只是调用导航器的 pop() 而已。

【问题讨论】:

通过 prop 将处理程序向下传递给子组件 你能举个例子吗?因为如果我通过 props 传递一个函数,该函数将是对上一页函数的引用。 【参考方案1】:

A.在初始组件中

this.props.navigator.push(
    title: 'title',
    component: MyComponent,
    rightButtonTitle: 'rightButton',
    passProps: 
        ref: (component) => this.pushedComponent = component,
    ,
    onRightButtonPress: () => 
        this.pushedComponent && this.pushedComponent.foo();
    ,
);

B.在推送的组件中 替换推送组件中的 onRightButtonPress 函数。

componentDidMount: function() 
    // get current route
    var route = this.props.navigator.navigationContext.currentRoute;
    // update onRightButtonPress func
    route.onRightButtonPress =  () => 
        this._onRightButtonClicked();
    ;
    // component will not rerender
    this.props.navigator.replace(route);
,

【讨论】:

【参考方案2】:

我的建议是使用某种 Flux 实现和可以从任何地方调用的 Action。

我个人最喜欢的是 Redux:https://github.com/gaearon/react-redux

即将发布的 1.0 版本的文档非常棒。 http://gaearon.github.io/redux/

【讨论】:

以上是关于在打开的组件中处理 NavigatorIOS ButtonPress的主要内容,如果未能解决你的问题,请参考以下文章

如何在 react-native 中使用 Navigator 组件复制 NavigatorIOS 组件行为?

通过 NavigatorIOS 传递 Redux 状态

React-Native组件之 Navigator和NavigatorIOS

React-Native 将标题从 Navigator 传递到 NavigatorIOS

React Native中如何在不改变路由的情况下改变NavigatorIOS的标题

在 React-native 中,如何更改 NavigatorIOS 的样式