React hook 使用疑惑

197 天前
 devzhaoyou
const [count, setCount] = useState(0);

const fetch = () => {
  fetchMoreData(count)
};

const handleClick = () => {
  // 每次 fecth 前都要重置一下 count
  setCount(0);
  fetch()
};

这段代码 每次 handleClick 都要重置 count 的值为 0 ,然后使用 fetch 获取数据,fetch 会使用 count 的值; 如果上面的写法的问题是,count 在使用的时候并没有设置为 0

如果改为 useEffect 方式,如果 count 的值没有变化,又不会触发

const [count, setCount] = useState(0);

const fetch = () => {
  fetchMoreData(count)
};

useEffect(() => {
  fetch();
}, [count]);

const handleClick = () => {
  // count 的值之前就是 0 ,上面的 useEffect 不触发
  setCount(0);
};

所以,上面的这种情况该如何处理呢? 刚接触 react 感觉很简单的逻辑,在 react 里处理起来好复杂

2884 次点击
所在节点    React
32 条回复
chanChristin
197 天前
应该是 useState 不会立即更新的问题,你可以换成 useRef 来确认一下,或者是在各处打印一下 useState 的值看看。
NessajCN
197 天前
你没说你需求是啥
icoming
197 天前
这样就行了:

const fetch = () => {
fetchMoreData(0)
};
withoutxx
197 天前
这种要看原始需求。。。
count 不变为什么需要再调用 fetch ,不清楚 fetch 具体逻辑。

简单点就第一种写法,fetch 直接接收 count 参数就可以。
xling
197 天前
跟 react 的 fiber 有关,设置后不会立即更新,可以直接把正确的值传递到你需要的函数
jguo
197 天前
你觉得复杂是因为自己都没有把逻辑理顺。先确定一个根本问题,在什么情况下需要调用 fetchMoreData 。
cat
197 天前
修改前的问题:setCount 是异步的,它还没执行完就会执行 fetch 了;
修改后的问题:count 值没变化,一直都是 0 ,自然就不会再次触发 useEffect ;
codehz
197 天前
网络请求建议直接上 swr 吧,你这个看起来是想做类似分页/无限加载+刷新的效果?那么 swr/infinite 里就可以做了,直接 setcount 然后再 revalidate ,不会有任何冲突,也能实现想要的效果。。。
iOCZS
197 天前
你这个例子不好,你应该说你有个分页请求,刚进来请求 page=0 ,这时候可以下拉刷新,重新请求 page=0 ;也可以上拉加载 page=1
devzhaoyou
197 天前
@iOCZS 是的,现在就是类似的场景
devzhaoyou
197 天前
@jguo 是的,想要什么是知道的。就是没有理清逻辑,还想简单点写。感觉思想得变下,还没适应 react.
devzhaoyou
197 天前
@codehz 大神啊,是的就是这样的需求
iOCZS
197 天前
@devzhaoyou 我的想法是 page 仅做存储,也就是 const page = useRef(0),用实际请求到的数据来刷新页面,const list = useState([])。
wuyiccc
197 天前
react 中 useState 是异步更新的
gaoryrt
197 天前
const fetch = useCallback(() => {
fetchMoreData(count)
}, [count])

这样行不行
wuyiccc
197 天前
既然已经确认 cout 为 0 了,就不要通过 state 去获取了,直接传递函数参数 count=0 吧
evada
197 天前
我觉得 4 楼没问题,可以把 count 当参数传递
santree
197 天前
导致你这个问题的原因是因为在 React 里,setState 都会默认经过收集和批处理的流程,简单来说他不是立即生效的。

为了处理这个问题,如果你的 count 是一个和渲染相关的值,而且你必须要在 handleClick 时强行进行一次重置为 0 并请求最新值进行设置(也就是说界面上必须反映出这个 count -> 0 -> newCount )我的建议是使用 flushSync 这个 api 对状态设置进行包裹,强制同步更新一次状态。

like this:
```typescript
import { flushSync } from 'react-dom';

flushSync(() => {
setCount(0);
});
```
具体可以查看文档: https://react.dev/reference/react-dom/flushSync
santree
197 天前
看之前的回复感觉你更需要把需求理清楚一点,避免这种状态的设置更好。
cookygg
197 天前
const [count, setCount] = useState(0);

const [,update] = useState({})

const fetch = () => {
fetchMoreData(count)
};

useEffect(() => {
fetch();
}, [count]);

const handleClick = () => {
// count 的值之前就是 0 ,上面的 useEffect 不触发
setCount(0);

// 手动更新 也算一个解决
update({})
};

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1035266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX