用udeEffect // 深拷贝 --解决 useState 异步改变数据,数据更新不及时

   近期做tabs 切换时,发现由于useState 异步更新,导致tabs 显示的总是上一步的结果,简单记录一下解决方法。

用useRef保存也可解决

一、 useEffect 解决

   1. useState 介绍

useState是让函数组件可以定义自己的state
useState调用会返回一个数组, 分别是变量和改变变量的方法
useState需要接收一个参数,是变量的初始值
useState改变数据是异步的

  2. useState 和 useRef 区别

 3. 异步更新问题

      如图,需要在切换tabs 时 显示对应的数据,但目前点击100米时,显示的是上一次点击的800米的数据,以下代码为点击tabs 的改变事件,

  const onChange = (key: string) => {
    // console.log('key》》',key);
    // key, 切换tabs 的值
    // newData, 切换tabs对应渲染的内容
    if (key === 'longJump') {
      setNewData(longJumpData)
    }
    if (key === 'solid') {
      setNewData(solidData)
    }
    if (key === 'eightHundred') {
      setNewData(eightHundredData)
    }
    if (key === 'oneHundred') {
      setNewData(oneHundredData)
    }
  };

  4. useEffect 介绍

 useEffect用于处理副作用,代替生命周期
 useEffect没有返回值,里面需要传入一个函数作为参数,useEffect还可以接收第二个参数,是一个数组(依赖数组)

 ① useEffect里面只传入了一个函数,在挂载和更新时起作用,相当于类组件的componentDidMount和componentDidUpdate
 ② 如果第二个参数是空数组,挂载时起作用,相当于类组件的componentDidMount
 ③ 如果第二个参数有内容,监听参数变化时起作用,相当于vue的watch
 ④ 如果第一个函数参数里面返回一个函数,卸载时起作用,相当于类组件的componentWillUnmount

useEffect(() => {
    // getData().then((res) => {
    //   console.log(res);
    // });

    // todo 在useEffect里面使用async的方式请求封装好的接口,需要写函数自执行
    (async () => {
      const res = await getData();
      console.log(res);
    })();
  }, []);

 5. 用udeEffect 解决 useState 异步改变数据,数据更新不及时

useEffect(()=>{
    if (current === 'longJump') {
      setNewData(longJumpData)
    }
    if (current === 'solid') {
      setNewData(solidData)
    }
    if (current === 'eightHundred') {
      setNewData(eightHundredData)
    }
    if (current === 'oneHundred') {
      setNewData(oneHundredData)
    }
  },[current])
  
// tabs 的切换事件,key/current-tabs切换后的key
  const onChange = (key: string) => {
    setCurrent(key)
  };
  

二、 深拷贝解决

浅拷贝 基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象; 改变新对象会使原数据一同改变

场景:添加数据,修改变量,页面更新不及时

错误写法:以下两种方法,其中一个是浅拷贝,引用了对象的地址,相当于两种都是修改了useState变量自身,用变量自身去push ,变量自身已经改变,再set时相当于没有变化,这个时候生命周期监听不到

  正确写法:深拷贝出来另一个数组 去改变数组  在set

import { cloneDeep } from 'lodash';

const handleOk = () => {

    addFacilityForm.validateFields()
      .then((values) => {
       
        const newFacilityList = cloneDeep(facilityList);

        newFacilityList.push(values)
      
        setFacilityList(newFacilityList)

      })
    setIsModalOpen(false);
  };

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 你遇到的问题是在使用vue-awesome-swiper时,异步加载的数据无法显示。根据你提供的代码,可以看出你在mounted生命周期钩子中使用了axios来获取数据,并将数据赋值给了data属性。然而,你没有将获取到的数据传递给swiper组件进行展示。你需要在获取到数据后,将数据赋值给data属性,然后在模板中使用v-for指令来遍历数据并展示图片。具体的做法是在获取到数据后,将数据赋值给data属性,然后在swiper组件的swiper-slide标签中使用v-for指令来遍历data数组,并将每个元素作为图片的src属性值。这样就可以实现异步加载数据并展示的效果。 #### 引用[.reference_title] - *1* *3* [vue-awesome-swiper中的数据异步加载](https://blog.csdn.net/weixin_30533797/article/details/101165867)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [基于swriper4.的vue-awesome-swiper 插件异步数据加载的loop循环问题](https://blog.csdn.net/weixin_42454941/article/details/81711180)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值