# 食谱应用rn-recipe
**Repository Path**: grx330/rn-recipe
## Basic Information
- **Project Name**: 食谱应用rn-recipe
- **Description**: React-Native+Expo项目、React Navigation v6+Redux
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2023-11-10
- **Last Updated**: 2024-01-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
【纯前端项目】
hybrid app,可在安卓/IOS 上运行
### 项目启动
1.输入“npm i”安装依赖包
2.输入“npx expo start”启动(有时会因为网络原因出现 Fetch 错误,如下图)
### 演示效果
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
#### 解决方法
在useEffect中监听state变化,存进ref中(如下图)
#### 具体原因
useState的值在每个rernder中都是独立存在的,而useRef.current则更像是相对于render函数的一个全局变量,每次他会保持render的最新状态。(useState异步更新其值,useRef同步更新)
在类组件中,`setState` 会调用类中的 render 函数,state 对象只是其中的属性发生改变,其对象地址并未改变,因为 state 数据更新是一个异步操作(微任务),所以无法**同步的**获取到最新的 `state`。解决方法是利用 `setTimeout` 的宏任务特性,则可以在其回调函数中获取到最新的 `state`,这是可行的。
在函数组件中,`setState` 后,React 重新调用整个 Index 函数,构建新的 Fiber 树。`setTimeout`虽然是在 `setState` 后调用的,但是还是在第一次的 Index 函数中,此时的 `state` 还是旧的数据。
#### 拓展
其实useReducer也有同样的问题...(在reducer函数中的return类似于调用`setState`,拿不到最新的`state`)
解决方法同样是:在useEffect中监听state变化,存进ref中
非常感谢这两篇文章:
[react useState数据更新不同步问题_react usestate不更新_one.dream的博客-CSDN博客](https://blog.csdn.net/qq_44472722/article/details/123635539)
[react 的 useState 到底该怎么获取最新值??? - 掘金 (juejin.cn)](https://juejin.cn/post/7233720373237776444)