vue3 ref,reactive请求后的赋值问题以及解决方法

vue3 ref,reactive请求后的赋值问题以及解决方法

​ 开发的过程中,我们一定会进行接口的对接,将响应的结果赋值给我们页面上需要展示或者操作的变量,在vue3中,我们可能会稍微的有点不适应,在赋值的过程中,使用了错误的做法,导致一直失败

  1. 错误代码演示

    <template>
            <ul>
                <li v-for="(p,index) in images2" :key="index">
                    {{p.pic}}
                </li>
                <li v-for="(p,index) in images" :key="index">
                    {{p.pic}}
                </li>
            </ul>
    </template>
    <script>
    import {onMounted,reactive,ref} from 'vue'
    import {postBanner} from '@/api/index'
    
    export default {
       setup() {
            let  images = ref([])
            let images2 = reactive([])
            
            onMounted(async()=>{
                getSwipeAPI()
            })
            function getSwipeAPI(){
                postBanner(1).then((res)=>{
                    images.value = res
                    images2 = res
                })
            }
            console.log(images2);
            console.log(images);
        return { images,images2 };
      },
    }
    </script>
    

    image-20220614155504802

    最开始的想法是通过赋值然后拿到数据,渲染到页面上,但是ref可以拿到数据,reactive拿不到数据

image-20220614155630415

​ 然后我看了一下我的数据,是个对象类型的数据

121321321dsaf

​ 我们知道ref在存储对象类型的数据还是求助了reactive函数

​ 解决办法

1、push

        let images2 = reactive([])
         postBanner(1).then((res)=>{
                images2.push(res)
            })

2、对象赋值

        let images2 = reactive({
			list: []
		})
         postBanner(1).then((res)=>{
                images2.list = res
            })

这样就可以拿到值了

image-20220614160828676

### Vue3 中 `reactive` 重新赋值页面不更新解决方案 当遇到 `reactive` 定义的对象在重新赋值后视图未及时更新的情况时,有几种常见原因和对应的解决办法。 #### 方法一:深拷贝替换对象 如果直接对整个响应式对象进行重置操作,则需要确保新旧对象不是同一个引用。可以通过创建一个新的对象来实现这一点: ```javascript import { reactive } from &#39;vue&#39;; let state = reactive({ data: "初始值" }); // 使用扩展运算符创建新的对象实例 state = reactive({ ...state, data: "新值" }); ``` 这种方法适用于简单的嵌套结构[^1]。 #### 方法二:利用 `toRefs()` 函数转换成 ref 形式的属性访问 对于更复杂的场景,可以考虑使用组合 API 提供的辅助函数 `toRefs()` 将 `reactive` 对象中的各个字段转化为独立的 `ref` 类型,从而允许单独修改这些字段而不影响其他部分的状态管理逻辑。 ```javascript import { defineComponent, reactive, toRefs } from &#39;vue&#39;; export default defineComponent({ setup() { const state = reactive({ user: { name: &#39;&#39;, age: null, }, }); function updateUser(newUser) { Object.assign(state.user, newUser); } return { ...toRefs(state), updateUser, }; } }); ``` 此方式能够有效避免因深层路径变化而导致父级组件未能感知到子节点变更的问题[^2]。 #### 方法三:采用事件驱动模式通知外部监听者 最后一种思路是在内部维护一个标志位用来触发强制刷新机制;或者通过自定义事件的方式告知外界发生了重要状态迁移,进而促使关联区域同步调整显示内容。 ```javascript import { reactive, watchEffect } from &#39;vue&#39;; const state = reactive({ list: [], reloadKey: Date.now(), }); function refreshList(newData) { state.list = newData; state.reloadKey = Date.now(); // 改变 key 来达到重新渲染的效果 } watchEffect(() => console.log(`Current timestamp is ${state.reloadKey}`)); ``` 上述策略特别适合处理列表项频繁变动的情形,在某些情况下甚至能带来性能上的优化效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶子烟卡喉咙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值