解决react-native中页面不刷新,再次进入页面,不走componentdidmount的问题

这篇博客介绍了两种在React Native中实现页面刷新的方法:一是利用`navigation`的`didFocus`回调;二是借助`DeviceEventEmitter`进行事件监听和触发。通过`didFocus`监听页面焦点变化以执行初始化逻辑,而`DeviceEventEmitter`则用于组件间的通信和数据刷新,例如在数据修改后触发页面刷新并传递更新信息。

方法一:使用navigation的didFocus函数
 

  componentDidMount() {
    const { navigation } = this.props;
    this.focusListener = navigation.addListener('didFocus', () => {
      this.pageInit();
      //处理自己进入路由的逻辑
    });
  }

方法二:使用react-native的DeviceEventEmitter 函数

1、需要刷新的页面


import { DeviceEventEmitter } from 'react-native';



  componentDidMount() {
    this.handleGetDetail();
    //设置监听,刷新页面
    this.listener = DeviceEventEmitter.addListener('refresh-VehicleGeneral', message => {
      //收到监听后想做的事情
      this.handleGetDetail();
    });
  }


2、修改数据后,触发上面改变的页面

    //调用接口保存
    let params = values;
    modifyVehicle(params).then(res => {
      if(res.status===200){
        Toast.success('保存成功');
        let vehicleInfo = res.body;
        const timeNow = new Date().getTime();
        DeviceEventEmitter.emit('refresh-VehicleGeneral', timeNow);
        DeviceEventEmitter.emit('refresh-VehicleList', timeNow);
        NavigationService.navigate('VehicleGeneral',vehicleInfo)
      }else{
        Toast.fail(res.msg);
      }
    });

 

`react-native-refresh-list-view` 是一个用于 React Native 的可刷新列表组件,支持下拉刷新和上拉加载更多功能。虽然它像 `FlatList` 或 `ScrollView` 那样是官方推荐的组件,但它在一些项目中仍然被广泛使用,尤其是在需要兼容旧版 React Native 项目的场景中。 ### 基本用法 首先,确保你已经安装了该组件: ```bash npm install react-native-refresh-list-view --save ``` 或者使用 yarn: ```bash yarn add react-native-refresh-list-view ``` 然后在你的组件中引入并使用它: ```javascript import RefreshListView from 'react-native-refresh-list-view'; ``` ### 示例代码 以下是一个完整的示例,展示了如何实现一个带有下拉刷新和上拉加载更多的列表组件: ```javascript import React, { Component } from 'react'; import { View, Text, StyleSheet, ActivityIndicator } from 'react-native'; import RefreshListView from 'react-native-refresh-list-view'; export default class RefreshableList extends Component { constructor(props) { super(props); this.state = { data: [], isRefreshing: false, isLoadingMore: false, page: 1 }; } componentDidMount() { this._loadData(); } _loadData = () => { const newData = []; for (let i = 0; i < 10; i++) { newData.push(`Item ${this.state.data.length + i + 1}`); } setTimeout(() => { this.setState({ data: [...this.state.data, ...newData], isRefreshing: false, isLoadingMore: false }); }, 1500); }; _onRefresh = () => { this.setState({ isRefreshing: true, data: [], page: 1 }, () => { this._loadData(); }); }; _onLoadMore = () => { if (!this.state.isLoadingMore) { this.setState( prevState => ({ page: prevState.page + 1, isLoadingMore: true }), () => { this._loadData(); } ); } }; _renderItem = ({ item }) => ( <View style={styles.itemContainer}> <Text>{item}</Text> </View> ); _keyExtractor = (item, index) => index.toString(); render() { return ( <RefreshListView data={this.state.data} renderItem={this._renderItem} keyExtractor={this._keyExtractor} refreshing={this.state.isRefreshing} onRefresh={this._onRefresh} showOnlyLoaded={true} allLoadedView={() => <Text style={{ textAlign: 'center' }}>没有更多数据了</Text>} autoLoadMore={true} onEndReached={this._onLoadMore} ListFooterComponent={ this.state.isLoadingMore ? <ActivityIndicator size="small" /> : null } /> ); } } const styles = StyleSheet.create({ itemContainer: { padding: 16, borderBottomWidth: 1, borderBottomColor: '#ccc' } }); ``` ### 主要属性说明 - `data`: 列表数据源。 - `renderItem`: 渲染每一项的函数。 - `refreshing`: 控制是否正在刷新- `onRefresh`: 下拉刷新触发的回调。 - `showOnlyLoaded`: 是否只显示已加载的数据(避免重复渲染)。 - `allLoadedView`: 当所有数据都已加载完成时显示的视图。 - `autoLoadMore`: 是否自动加载更多数据。 - `onEndReached`: 上拉到底部时触发的回调。 - `ListFooterComponent`: 显示在列表底部的组件,通常用于加载指示器。 ### 注意事项 - `react-native-refresh-list-view` 基于 `ListView` 实现,因此在新版本的 React Native 中可能会有性能或兼容性问题- 如果你正在开发新的项目,建议优先考虑使用 `FlatList` 和 `SectionList` 结合 `RefreshControl` 来实现类似功能。 - 如果你需要更复杂的交互(如动画、自定义刷新样式),可以结合第三方库如 `react-native-pull`[^2] 来增强体验。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值