如何在 React Native 中重新加载 TabNavigator 上的视图点击

2023-11-22

我想在用户每次更改选项卡时重新加载 tabNavigator。当用户更改选项卡时,不会调用 React Native 的生命周期方法。那么如何在 TabNavigator 中重新加载选项卡:

下面的示例有两个选项卡:1) 主页 2) 事件。现在我想在用户从主页选项卡返回时刷新事件选项卡。

世博会链接: 世博会选项卡导航器

Code :

import React, {Component} from 'react';
import  {View, StyleSheet, Image, FlatList, ScrollView, Dimensions } from 'react-native';
import { Button, List, ListItem, Card  } from 'react-native-elements' // 0.15.0
//import { Constants } from 'expo';
import { TabNavigator, StackNavigator } from 'react-navigation'; // 1.0.0-beta.11

//image screen width and height defs
const windowWidth = Dimensions.get('window').width;
const windowHeight = Dimensions.get('window').height;


export default class App extends Component {
  render() {
    //const { navigate } = this.props.navigation;
    return (
      <TabsNav  />
      )
  }
  }


class MyHomeScreen extends Component {
  render() {
    return (
      <View>
            <Image
              resizeMode="cover"
              style={{    width: windowWidth * .85,    height: windowHeight * 0.3}}
              source={{uri: 'http://www.ajaxlibrary.ca/sites/default/files/media/logo.png?s358127d1501607090'}}
            />
            <Button
              onPress={() => this.props.navigation.navigate('Notifications')}
              title="Go to notifications"
            />
      </View>

    );
  }
}

class AplEvents extends Component {
  static navigationOptions = {
    tabBarLabel: 'Events List',
    tabBarIcon: ({ tintColor }) => (
      <Image
        source={{uri: 'https://facebook.github.io/react/img/logo_og.png'}}
        style={[styles.icon, {tintColor: tintColor}]}
      />
    ),
  };

    constructor(props) {
    super(props);

    this.state = {
      data: [],
      error: null,
    };
  }

  // when component mounts run the function fetch
  componentDidMount() {
    this.makeRemoteRequest();
  }

  makeRemoteRequest = () => {
    const url = `http://www.ajaxlibrary.ca/?q=calendar-test`;

    fetch(url)
      .then((res) => res.json())
      .then((res) => {
        this.setState({
          data: [...this.state.data, ...res.nodes],
          error: res.error || null,
        });
      })
      .catch(error => {
        this.setState( error );
      });
  };


  render() {
    const { navigate } = this.props.navigation;
    return (
         <List containerStyle={{ marginTop: 0, borderTopWidth: 0, borderBottomWidth: 0 }}>
        <FlatList
          data={this.state.data}
          renderItem={({ item }) => (
            <ListItem
              //squareAvatar
              title={`${item.node.title}\n${item.node.Program_Location}`}
              subtitle={item.node.Next_Session}
              avatar={{ uri: item.node.Image }}
              containerStyle={{ borderBottomWidth: 0 }}
             // save params to pass to detailed events screen
              onPress={() => navigate('Details', {title: `${item.node.title}`,
                                                body: `${item.node.Body}`,
                                                date: `${item.node.Date}`,
                                                Next_Session: `${item.node.Next_Session}`,
                                                Program_Location: `${item.node.Program_Location}`,
                                                Nid: `${item.node.Nid}`,
                                                Image: `${item.node.Image}`,
                                                Run_Time: `${item.node.Run_Time}`})}
            />
          )}
          keyExtractor={item => item.node.Nid}
        />
        </List>
    );
  }
}

class EventDetails extends Component {
      static navigationOptions = {
    title: 'EventDetails'
  };
  render() {
    const { params } = this.props.navigation.state;

    let pic = {
      uri: `${params.Image}`
    };
    //const pic = { params.Image };
    return (

          <ScrollView>

              <Card
                title={params.title}
              >
                  <Image
                      resizeMode="cover"
                       style={{    width: windowWidth * .85,    height: windowHeight * 0.3}}
                      source={pic}
                  />

                  <Button style={{marginTop: 10}}
                      icon={{name: 'date-range'}}
                      backgroundColor='#03A9F4'
                      fontFamily='Lato'
                      buttonStyle={{borderRadius: 0, marginLeft: 0, marginRight: 0, marginBottom: 0}}
                      title='Add to Calendar'
                  />
                    <ListItem
                     title="Event Description"
                     subtitle={params.body}
                     hideChevron='true'
                    />
                    <ListItem
                     title="Date"
                     subtitle={`${params.Next_Session}\n Run Time - ${params.Run_Time}`}
                     hideChevron='true'
                    />
                    <ListItem
                     title="Location"
                     subtitle={params.Program_Location}
                     hideChevron='true'
                    />
              </Card>
          </ScrollView>
    );
  }
}


const styles = StyleSheet.create({
  icon: {
    width: 26,
    height: 26,
  },
});

const EventStack = StackNavigator({
    EventList: {
        screen: AplEvents,
          navigationOptions: {
            title: "APL Event Listing",
          }
    },
    Details: {
        screen: EventDetails,
    },
  TabsNav: { screen: MyHomeScreen}
  });

const TabsNav = TabNavigator({
  Home: {
    screen: MyHomeScreen,
        navigationOptions: {
            tabBarLabel: 'Home',
                 tabBarIcon: ({ tintColor }) => (
                <Image
                    source={{uri: 'https://upload.wikimedia.org/wikipedia/de/thumb/9/9f/Twitter_bird_logo_2012.svg/154px-Twitter_bird_logo_2012.svg.png'}}
                    style={[styles.icon, {tintColor: tintColor}]}
                />
                ),
        },
  },
  EventList: {
    screen: EventStack,
            navigationOptions: {
            tabBarLabel: 'Events',
                 tabBarIcon: ({ tintColor }) => (
                <Image
                    source={{uri: 'https://upload.wikimedia.org/wikipedia/de/thumb/9/9f/Twitter_bird_logo_2012.svg/154px-Twitter_bird_logo_2012.svg.png'}}
                    style={[styles.icon, {tintColor: tintColor}]}
                />
                ),
        },
  },
}, {
  tabBarOptions: {
    activeTintColor: '#e91e63',
  },
});

React Native Tab Navigation 有一个 option 属性,如下所示unmountOnBlur将其设置为true每次您单击选项卡时,它都会重新加载选项卡屏幕。

<Tab.Screen name={"Profile"} component={ProfileScreen} options={{unmountOnBlur: true}} />

文档/参考资料 -RN 底部选项卡导航器文档

.

更新 - 有一个名为 as 的钩子useIsFocused in '@react-navigation/native'。 将其与 useEffect 一起使用,可以在每次聚焦或使用屏幕时重新渲染屏幕。

import { useIsFocused } from '@react-navigation/native';

const isFocused = useIsFocused();

useEffect(() => { yourApiCall(); }, [isFocused])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 React Native 中重新加载 TabNavigator 上的视图点击 的相关文章

随机推荐

  • ActiveMQ 和 maxPageSize

    我想将 maxPageSize 设置为比默认值 200 更大的数字 这就是我在 activemq xml 文件中设置的方式
  • 在 Linux 上执行 int 3 中断是停止整个进程还是仅停止当前线程?

    假设架构是x86 操作系统是基于Linux的 给定一个多线程进程 其中单个线程执行int 3指令 中断处理程序是否停止执行整个进程或仅停止执行该指令的线程int 3操作说明 由于问题是 Linux 特定的 所以让我们深入研究内核源代码 我们
  • 静态变量失去价值

    我面临一个关于我在整个项目中使用的静态变量的问题 它包含文件中的一些字段 在某些情况下 变量会失去其价值 但并非总是如此 我读过有关静态变量生命周期的内容 她在 3 种情况下丢失了值 1 类被卸载 2 JVM 关闭 3 进程死亡 所以我有一
  • 调整主窗口大小时,静态控件轻微闪烁

    简介及相关信息 我有一个复杂的绘画要在我的主窗口中实现WM PAINT处理程序 我提交了下面的图片来说明 主窗口有静态控件 而不是具有样式的按钮SS NOTIFY 当用户单击它们时 程序中会发生某些操作 下图显示了主窗口中静态控件的位置 橙
  • 如何在 ios swift 项目中使用两个不同的 GoogleService-info.plist 文件进行开发和生产?

    我需要使用两个不同的 GoogleService info plist 来处理开发和产品构建 目前我通过更改编辑方案中的 构建配置 来分离开发和产品 但现在我需要两个不同的 plist 文件开发人员和产品人员使用谷歌分析 pushwoosh
  • Android:应用内购买收据验证谷歌播放

    我使用谷歌钱包作为我的支付网关 在购买产品后谷歌给了我以下回复 orderId 12999763169054705758 1371079406387615 packageName com example app productId exam
  • Python 列表索引超出 split 返回值的范围

    我正在编写一个简单的脚本 尝试从 txt 输入文件的第二列中提取第一个元素 import sys if len sys argv gt 1 f open sys argv 1 r print file opened line for lin
  • 在 MySQL 中使用 INDEX 与 KEY 有什么区别?

    我知道如何使用 INDEX 如下面的代码所示 我知道如何使用外键 and 首要的关键 CREATE TABLE tasks task id int unsigned NOT NULL AUTO INCREMENT parent id int
  • 在不同状态下使用两个图像的切换按钮

    我需要使用两个图像而不是开 关状态制作一个切换按钮 在关闭状态下 我设置了背景图像 但是当我使用背景图像时 无法删除关闭文本 我无法通过单击切换按钮将另一个图像设置为开启状态 我是安卓新手 我希望你们能帮助我摆脱这个问题 Do this
  • div 的 Stripe 类

    我有一长串多个 div 比方说 20 div 全部包进另外一个 div div class xyz text text div div class xyz text text div div class xyz text text div
  • Apache 403 错误,(13)权限被拒绝:访问/被拒绝,Fedora 16

    我刚刚在 Fedora 16 上设置了 apache 但我无法让我的虚拟主机工作 虽然 localhost phpmyadmin 工作正常 我在我的 httpd conf 中得到了这个
  • C 中的向量化三角函数?

    我希望计算高度并行的三角函数 以 1024 为单位 并且我想至少利用现代架构所具有的一些并行性 当我编译一个块时 for int i 0 i
  • Android AlarmManager - RTC_WAKEUP 与 ELAPSED_REALTIME_WAKEUP

    有人可以向我解释一下两者之间的区别吗AlarmManager RTC WAKEUP and AlarmManager ELAPSED REALTIME WAKEUP 我已阅读文档 但仍然不真正理解使用其中之一的含义 示例代码 alarmMa
  • 如何在 PostScript 中获取字符串的高度度量?

    您可以使用当前字体获取字符串的宽度stringwidth尽管这实际上将偏移坐标推送到堆栈上 但 y 值似乎总是无用的 有没有办法确定字符串的确切高度 可能包括或不包括下降部分 stringwidth正如它所说 不返回字符串的高度 在我查看的
  • 使用 jest 模拟 AWS.DynamoDB.DocumentClient 的构造函数

    我有一个如下所示的函数 function connect const secret secret const key key const region region const client new AWS DynamoDB secret
  • git hooks 及其工作原理

    所以我试图让 hudson 使用 post receive hook 进行构建 在我的本地 git 存储库中 我将 post receive sample 设置为 post receive chmod 755 并添加到行中 usr bin
  • 为什么不锁定基于价值的类别

    The docs说你不应该锁定基于值的 Java 类的实例 例如Optional因为代码 如果它试图区分对基于值的类的相等值的两个引用 通过诉诸同步间接地 可能会产生不可预测的结果 为什么Java的基于值的类不应该被序列化 断言 由于未来的
  • 创建通用 UIViewController 初始化

    我正在尝试创建一个UIViewController我可以使用它来初始化新实例的扩展 对于我的项目中的每个视图控制器 我都有一个相应的故事板 i e EditSomethingViewController swift EditSomethin
  • “架构 x86_64 的未定义符号:”

    我正在尝试在 mac os x Mavericks 10 9 3 64 位上编译此库 http www openfec org downloads html 我完全按照自述文件进行操作 并收到此错误 链接 C 共享库 bin Release
  • 如何在 React Native 中重新加载 TabNavigator 上的视图点击

    我想在用户每次更改选项卡时重新加载 tabNavigator 当用户更改选项卡时 不会调用 React Native 的生命周期方法 那么如何在 TabNavigator 中重新加载选项卡 下面的示例有两个选项卡 1 主页 2 事件 现在我