react-native AsyncStorage存储以及this.setState undefined 错误

本文详细介绍了AsyncStorage在React Native项目中的使用方法,包括数据的存储、获取及删除操作,并提供了具体代码示例,有助于开发者快速掌握并应用于实际项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

没用的文章千篇一律,好用的的文章万里无一!

AsyncStorage 对于App来说是全局性的  AsyncStorage是一个简单的、异步的、持久化的以键值对形式进行数据存储的存储系统。它的作用等价于iOS的NSUserDefaluts或Android的SharedPreferences,使用AsyncStorage用来替换老旧的LocalStorage。

引入:

import { AsyncStorage} from 'react-native';

建立:

AsyncStorage.setItem('result','1',function (error) {});

获取:

AsyncStorage.getItem('result', function (error, result) {})

具体案例:

创建一个:setItem

 loginok=()=>{
     AsyncStorage.setItem('result','1',function (error) {
          if (error) {
              console.log('存储失败');
          }else {
              console.log('存储完成');
          }
      });

}

获取一个:getItem

AsyncStorage.getItem('result', function (error, result) {
        if(error){
              console.log('读取失败');
          }else{
              console.log(result);
              if (result!=null) {
                 _that.setState({
                    disable:false,
                    chenckshow:false
                  })

              };
          }
      })

注意:在react-native使用getItem的回调函数时,this会报undefined错误,这时要使用_that转化一下便于直接setState({})。写这个文章主要就是要写这里,便于大家查阅。

销毁一个:removeItem

AsyncStorage.removeItem(‘result’,(err)=>{

   if(err){

     console.log('删除失败')

   }else{

     console.log('删除成功')

   }

})

注:其实RN里面不建议写if   else  这里为了方便,希望没有干扰你的判断。

<think>好的,用户的问题是关于如何将旧版React Navigation中的参数获取方式迁移到新版v6中,特别是他们使用的是React Native 0.68版本。用户提供的代码片段是: this.state.item=this.props.navigation.state.params; this.setState({item:this.props.navigation.state.params}) 用户询问应该改成什么。 首先,我需要确认用户当前使用的React Navigation版本。因为用户提到项目是0.68版本,而React Native 0.68通常会搭配React Navigation v6,所以用户可能已经升级到了v6。在v6中,导航的结构和参数获取方式有较大的变化,特别是参数不再通过navigation.state.params获取,而是通过route.params。 接下来,我需要考虑用户是使用函数组件还是类组件。根据用户的代码,他们使用了this.state和this.setState,这表明他们是在类组件中工作。因此,解决方案需要针对类组件进行调整。 在React Navigation v6中,类组件需要使用withRoute高阶组件来访问route对象,或者通过上下文获取。用户原来的代码直接通过navigation.state.params获取参数,这在v6中已经被废弃,必须改为从route.params中获取。 因此,正确的修改步骤应该是: 1. 导入withRoute。 2. 使用withRoute包装组件,以便访问route属性。 3. 在组件中通过this.props.route.params来获取参数。 4. 更新状态时,使用新的参数来源。 此外,用户可能还需要检查路由配置是否正确迁移到v6,例如使用createNativeStackNavigator等新API。同时,需要注意参数传递是否正确,避免在导航时未正确传递参数导致params为undefined。 另外,用户可能需要处理参数变化的情况,例如在componentDidUpdate中监听参数变化并更新状态。还需要考虑TypeScript类型定义,如果项目使用了TS的话。 最后,需要提醒用户进行必要的依赖安装和配置,例如安装@react-navigation/native-stack,以及处理Android/iOS的权限配置,确保导航功能正常工作。</think>### 适配方案(类组件专用) #### ✅ 修改后的标准写法: ```javascript import { withRoute } from '@react-navigation/native'; class MyScreen extends React.Component { constructor(props) { super(props); // 旧写法:this.state.item = this.props.navigation.state.params; // 新写法: this.state = { item: props.route?.params || {} // 优先使用可选链防止未定义错误 }; } // 若需要监听参数变化 componentDidUpdate(prevProps) { if (prevProps.route.params !== this.props.route.params) { this.setState({ item: this.props.route?.params || {} }); } } render() { // 使用 this.state.item 访问参数 } } export default withRoute(MyScreen); ``` --- ### 🔍 修改说明 | 旧代码 | 新代码 | 修改原因 | |-------|-------|---------| | `this.props.navigation.state.params` | `this.props.route?.params` | v6 参数存储结构变更 | | `navigation.state` | `route` | 核心 API 架构重构 | | 直接赋值给 state | 使用 constructor 初始化 | 更符合 React 生命周期规范 | | 无参数监听 | `componentDidUpdate` | 确保参数更新时状态同步 | --- ### 📌 关键注意事项 1. **必须添加 HOC 包装器**: ```javascript export default withRoute(MyScreen); // 否则 this.props.route 会是 undefined ``` 2. **空值防护处理**: ```javascript // 使用可选链+默认值防止崩溃 this.state = { item: props.route?.params || { defaultKey: 'defaultValue' } }; ``` 3. **参数类型验证**: ```javascript // 建议添加 propTypes MyScreen.propTypes = { route: PropTypes.shape({ params: PropTypes.object }) }; ``` --- ### 🧪 调试验证方法 1. **打印完整参数对象**: ```javascript console.log('Current params:', this.props.route?.params); // 查看参数结构是否符合预期 ``` 2. **模拟参数传递测试**: ```javascript // 在跳转时添加验证参数 navigation.navigate('MyScreen', { testParam: 'verify', timestamp: Date.now() }); ``` 3. **异常情况处理验证**: ```javascript // 测试无参数情况下的默认值 navigation.navigate('MyScreen'); // 确认 this.state.item 有合理默认值 ``` --- ### ❌ 典型错误规避 | 错误写法 | 正确方案 | |---------|---------| | `this.props.route.state.params` | ✅ 直接使用 `this.props.route.params` | | 忘记 `withRoute` 包装 | ✅ 导出时必须用 `withRoute(MyScreen)` | | 直接修改 state 而非使用 setState | ✅ 通过 `this.setState()` 更新状态 | | 未处理组件卸载 | ✅ 在 componentWillUnmount 中清理异步操作 | --- ### 🚀 进阶优化建议 1. **参数解构处理**: ```javascript const { itemId, itemName } = this.state.item; // 替代旧版:const { id, name } = this.props.navigation.state.params; ``` 2. **参数变更副作用处理**: ```javascript componentDidUpdate(prevProps) { if (prevProps.route.params.itemId !== this.props.route.params.itemId) { this.fetchData(this.props.route.params.itemId); // 参数变化时触发数据更新 } } ``` 3. **TypeScript 类型定义**(如使用 TS): ```typescript interface MyScreenParams { itemId: string; itemName?: string; } type Props = { route: RouteProp<{ params: MyScreenParams }>; }; ``` --- ### ✅ 最终验证步骤 1. **基础功能验证**: ```bash # 确保以下操作无报错 - 页面正常显示 - 参数数据正确展示 - 状态更新正常触发 ``` 2. **边界情况测试**: ```bash - 无参数跳转 - 参数包含嵌套对象 - 参数类型为 number/boolean ``` 3. **性能监控**: ```bash # 使用 React DevTools 检查 - 组件渲染次数 - 参数变更时的更新范围 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值