- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个我在完全不同的上下文中看到的问题,没有任何直接的解决方案。一些人还问我,我正在展示一些示例,说明如何让导航执行我想要的代码,因为他们中的大多数人已经使用第三方解决方案或使用创建了自己的导航标题<View>
.
为了让问题有一些上下文,这就是我们正在努力完成的:
class Example extends Component {
componentRouteMapper() {
switch(route.id) {
case 'home' return <Home navigator={navigator} { ...this.props } />
}
}
navigationBarRouteMapper = {
LeftButton: (route, navigator, index, navState) => {
return <TouchableOpacity onPress={this.onLeftPressed.bind(this)}>
<Text>Left Button</Text>
</TouchableOpacity>
},
RightButton: (route, navigator, index, navState) => {
// ... Same as left
},
Title: (route, navigator, index, navState) => {
return <Text>{route.id}</Text>
}
}
render() {
return <Navigator initialRoute={{id: 'home'}}
renderScene={this.componentRouteMapper}
navigationBar={
<Navigator.NavigationBar { ...this.props }
routeMapper={this.navigationBarRouteMapper}/>
}
}
}
您自然会希望能够在呈现的组件的上下文中处理导航栏逻辑。在这种情况下:<Home />
我们将希望能够共享来自该组件事件实例的状态/ Prop 。执行上面的代码会导致错误,即使你有 onLeftPressed()
在您的主页组件中声明,如下所示:
export default class Home extends Component {
onLeftPressed() {
console.log('Pressed left button')
}
render() {
return <View>
<Text>Home Component</Text>
</View>
}
}
所以手头的问题是......你怎么称呼onRightPressed()
来自 navigationBarRouteMapper
最佳答案
这实际上很简单,虽然还有其他方法,例如在路由器中注入(inject)组件,但考虑到我的应用程序使用 Redux
传入 connect()
Route 对象的方法有点麻烦。
因此,我想出了一个简单而有效的解决方案,无论您使用什么来管理您的状态,它都可以正常工作。 注入(inject)。没错,只需将您需要调用的任何内容直接注入(inject)您的 navigation
目的。
navigation
可以通过 this.props.navigator
从您的组件中访问对象对我们来说幸运的是,Javascript 对象是可变的,并且本质上是通过引用传递的。这意味着我们对导航器对象所做的任何更改都将反射(reflect)在注入(inject)到 navigationBarRouteMapper
的导航器中。
所以,首先让我们更改一点代码:
navigationBarRouteMapper = {
LeftButton: (route, navigator, index, navState) => {
return <TouchableOpacity onPress={navigator.__onLeftNavButtonPressed}>
<Text>Left Button</Text>
</TouchableOpacity>
},
RightButton: (route, navigator, index, navState) => {
// ... Same as left
},
Title: (route, navigator, index, navState) => {
return <Text>{navigator.navTitle || route.id}</Text>
}
}
您会注意到我已经更改了 onPress
来自 {this.onLeftPressed.bind(this)}
的值至 {navigator.__onLeftNavButtonPressed}
现在显然您可以更改正在使用的名称,但我喜欢双下划线前缀。
您还会看到我将标题更改为返回 {navigator.navTitle || route.id}
而不仅仅是 route.id
这意味着它将使用 navTitle
来自导航器的属性(如果可用),如果不可用,则它将使用堆栈顶部的路由 ID。
现在让我们修改我们的 <Home />
组件,以便我们的 navigationBarRouteMapper 执行我们想要的代码。
class Home extends Component {
constructor(props) {
super(props)
var navigator = this.props.navigator
navigator.navTitle = 'Home'
navigator.__onLeftNavButtonPressed = this.onLeftPressed.bind(this)
}
onLeftPressed() {
console.log('Pressed left button')
}
render() {
return <View>
<Text>Home Component</Text>
</View>
}
}
如您所见,唯一发生变化的是我们添加了一个 constructor(...)
。将函数和标题注入(inject) navigator
目的。现在,如果您单击左侧按钮,您将执行onLeftPressed
。在你的 Home
中运行组件。
但是您可以通过创建自定义组件子类来进一步抽象它。例如:
import React, { Component } from 'react'
export default class NavComponent extends Component {
constructor(props) {
super(props)
console.warn('Constructed')
var navigator = this.props.navigator
navigator.navbarTitle = this.__onNavTitleRequested();
navigator.__onLeftNavButtonPressed = this.__onLeftNavButtonPressed.bind(this)
navigator.__onRightNavButtonPressed = this.__onRightNavButtonPressed.bind(this)
}
__onLeftNavButtonPressed() {
}
__onRightNavButtonPressed() {
}
}
这可确保始终设置左右导航按钮功能,即使它们不执行任何操作也会防止由于尝试调用未定义函数而导致的应用程序错误。您还会注意到有对 __onNavTitleRequested
的引用但是没有默认函数,这是为了确保子类必须有 __onNavTitleRequested
已定义,否则应用程序将无法正常运行。这是为了避免在标题栏中出现标题不正确的组件,因为如果您不设置标题,它将始终使用最后设置的标题。
实现这个的例子如下:
import React from 'react'
import NavComponent from './path/to/nav-component.js'
export default class Home extends NavComponent {
__onNavTitleRequested() {
return 'Home'
}
__onLeftNavButtonPressed() {
console.log('Left navigation button pressed')
}
__onRightNavButtonPressed() {
console.log('Right navigation button pressed')
}
render() {
return <View>
<Text> Home Component </Text>
</View>
}
}
这将向左/右按钮注册一个事件并设置主页组件的标题。您也可以将更多信息注入(inject) Navigator 对象,例如,如果您想要一个 __hasNavigationBar
函数返回 true 或 false 以隐藏整个导航栏,或者可能是 __rightNavButton
函数返回要显示在右侧按钮上的组件,而不仅仅是一个 TouchableOpacity 按钮。
正如我之前所说,还有其他方法可以做到这一点,但考虑到我正在以这种方式在我的应用程序中使用 Redux 似乎是最简单的,而且我没有遇到任何问题。
关于javascript - 从 react-native 的 Navigator 按钮调用组件函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39254219/
在这种情况下,我们在应用程序中同时使用react-native-gesture-handler Touchable和react-native Touchable。 (通过Touchables,我的意思
我有一个 MainFooter包含页脚和迷你播放器的组件,单击时动画显示为全 View 。我有一个问题,每当我们点击一个页脚选项卡时,播放器最大化然后卡在那里,没有响应。 此外,播放器内部的向下箭
我在 native react 之上使用 native 基础组件,我想知道如何在 UI 中使卡片呈圆形而不是矩形。有圆形的 Prop 吗? 最佳答案 好吧,实际上没有人能回答这个问题,但幸运的是我在
我在 native react 之上使用 native 基础组件,我想知道如何在 UI 中使卡片呈圆形而不是矩形。有圆形的 Prop 吗? 最佳答案 好吧,实际上没有人能回答这个问题,但幸运的是我在
我是 react-native 的新手,所以我认为“HTML”而不是“native”可能有点太多了,所以我的问题看起来很愚蠢。 我使用 react-native-router-flux 进行路由,并使
当我使用这个例子在我的应用程序上实现 Image-slider 时,我遇到了这个错误。 import React,{Component} from 'react' import {View,T
我正在为我们的产品使用“Native Base”组件,并且效果很好, 但我有一点被卡住了,它是关于将 Items 放入 Nativebase Picker 的问题。我的代码是这样的 渲染方法代码 -
正如文档中所建议的,我将一些长的数据获取代码移动到 native 模块中以释放 JS 线程,但我观察到这仍然阻塞了 UI。为什么会这样,我能做些什么来避免这种情况? 从 JS 调用 native 模块
我正在使用一个名为 react-native-svg 的框架在 React Native View 中绘制 SVG 元素。 我的目标是,当我点击 View 时(我在全局 View 上使用 PanRes
在 IOS 中发现错误 Native Module cannot be null 我不使用 react-native-push-notification 最佳答案 这通常发生在您未能将第三个库链接到您
当应用程序关闭时,我可以获得由 Linking.getInitialURL() 点击的深层链接网址。 .当应用程序处于后台状态时,则不会安装任何内容。所以,我什至无法通过 Linking.addEve
1) 说原生库是什么意思?什么样的图书馆?那些将用作 gradle 依赖项? 2)如何链接这些?我在使用 link 或 rnpm 时遇到了麻烦。 最佳答案 链接 native 库意味着您要将已经实现的
我需要帮助来构建我的 react 原生项目。我尝试过react-native run-android,但出现以下错误: react-native : The term 'react-native' i
我需要帮助来构建我的 react 原生项目。我尝试过react-native run-android,但出现以下错误: react-native : The term 'react-native' i
我是 React-Native 的新手,到目前为止我很喜欢它。我正在尝试创建一个屏幕(用于跨平台应用程序),右上角有一个菜单图标,单击时,我想打开一个菜单,希望使用 react-native-menu
RN doco 和其他示例展示了如何从 native iOS View Controller 启动 React-Native View ,但反之则不然。谁能解释一下我该怎么做? 最佳答案 我能够弄清楚
对于 react-native - WebStorm 用户: 我正在使用 Jet Brains IDE WebStorm 开始一个带有 React Native 的项目。 在项目 => node_mo
在升级过去的 react-native 0.60 之后......我被警告我应该取消链接所有手动链接的第 3 方库(因为 RN 现在通过自动链接处理它)。 但是,当我运行 react-native u
你可以使用像 https://github.com/tolu360/react-native-google-places 这样的库吗?在世博项目中?我假设任何 npm 库都可以添加,但是像这个 goo
我主要喜欢 React Native。自 0.22 以来一直在使用它。目前为 0.35。 但是为什么链接原生库就像抽奖一样呢?我很少在第一次拍摄时让它发挥作用,而破裂的东西通常是完全不同的东西。 每个
我是一名优秀的程序员,十分优秀!