阅读 497

react useState 异步 数据获取不到

useState中的 setXXXXX 属于异步函数,在useState第一次存储的时候,会有存储不上的时候

因为react中state的更新是异步的,我们setState后,react并不会立即将值做出改变,而是将其暂时放入pedding队列中。react会合并多个state,然后只render 一次,所以不要在循环里用useState,它有可能只render最后一次set的值

  • 初始代码

1.png

  • console.log

2.png

方法一 : 利用 ref

  • 官网中的一段话:如果你刻意地想要从某些异步回调中读取最新的 state,你可以用 一个 ref 来保存它,修改它,并从中读取

const App = () => {   const [arr, setArr] = useState([0]);   let ref = useRef();   useEffect(() => {     ref.current = arr;     console.log(arr);   });   const handleClick = () => {     Promise.resolve().then(() => {       const now = [...ref.current, 1];       ref.current = now;       setArr(now);     })       .then(() => {         setArr([...ref.current, 2]);       });   }   return (       <button onClick={handleClick}>change</button>   ); } 复制代码

方法二 :使用(回调)方式传参

const handleClick = () => {     Promise.resolve().then(() => {       setArr(prevState => [...prevState, 1]); // 这里也可以不改,使用 setArr([...arr, 1])     }).then(() => {         setArr(prevState => [...prevState, 2]); // 这里必须改成回调函数传参方式,否则会读取旧状态,导致异常       }); } 复制代码

3.png

方法三 : 处理办法添加一个 副作用(useEffect()

  • 异步获取数据存在的问题, 我这里通过useEffect用存储2次, 没办法 ,解决问题就行了,其他的也不重要

const [categtry, setCategtry] = useState([]); const [categData, setCategData] = useState([]);   useEffect(() => {     getCollaCategory();   }, []);   useEffect(() => { // 这个useEffect很关键,第一次赋值但是获取不到,所以要再赋值一次    if (categtry) {      setCategData(categtry);    } }, [categtry]);   const getCollaCategory = async () => {    const { resp } = await call(service.getCollaCategory);    if (resp.Code === 0) {     // 第一次虽然在这里赋值了,但是外部想拿到 categtry这个变量还是空的       setCategtry(resp.CategoryTree.SubCategoryList);    } } 复制代码



作者:Karsuo
链接:https://juejin.cn/post/7019482437373657101


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐