vue定义在computed的变量无法更新

在Vue的详情页面中,通过路由参数加载items数组中的商品信息。首次加载正常,但后续切换商品时,数据未实时更新,仍显示旧商品信息。问题出在computed属性的缓存特性,即使this.focus和this.idx改变,item并未更新。原因是使用了keepalive路由设置,导致页面不会被销毁。解决方案是将keepalive设为false,确保每次切换商品时页面重新渲染。

情境是这是线上商城的详情页面,商品详情是items数组,点击分类页面的商品,路由跳转到详情页面,路由参数是商品在items中的序号。
但是问题是只有第一次点击商品i的时候可以正常加载items[i]的数据到html中,退出后点击商品j,发现加载的还是商品i的信息,只有刷新后才会更新成商品j的信息。
部分代码:

        <shopPanel
            :key = "nums"
            :goodname="item.text"
            :tag="item.tag"
            :sale="item.sale"
            :price="item.price"
            :ori="item.ori_price"
        >
        </shopPanel>

和computed定义的,注意这里定义的数据item,是不能够修改的,想修改只能用set来修改。我这里测试时发现明明item关联的两个属性this.focus和this.idx改变了,那为什么item没有改变呢?而且是刷新后就能改变。

        computed: mapState({
            items:'items', //商品详情信息
            item(){
                console.log(this.focus+" "+this.idx);
                return this.items[this.focus].children[this.idx]
            }
        }),

最后的原因竟然是定义路由的时候选择了keepalive,页面不会销毁,改成false就行。

        path: '/item/item01',
        name:'itemdetail',
        meta: {
            title: '商品1',
            keepAlive: false,
            showTab: false
        },
        component: (resolve) => require(['../page/itemdetail/item01'], resolve),
### Vue 3 中 `computed` 属性自动更新的原因及解决方案 在 Vue 3 中,如果遇到 `computed` 属性未能按预期自动更新的情况,通常是因为存在某些特定原因阻止了其正常工作。以下是几种常见情况及其对应的解决办法。 #### 1. 确认依赖项已正确定义 确保所有的依赖数据都在计算属性内部得到了引用。任何未被显式提及的变量变更都会触发重新评估过程[^2]。 ```javascript // 正确做法:所有依赖都应在函数体内访问 const count = ref(0); const doubledCount = computed(() => { console.log('doubledCount is recalculated'); return count.value * 2; }); ``` #### 2. 验证更改是否经由响应式系统传播 对于对象或数组类型的响应式资源来说,直接操作它们的方式(比如修改数组下标)可能绕过了Vue内置的通知机制,进而造成视图同步的问题。应当采用适当的方法来实现安全的数据变动: - 对于对象而言,在 Vue 3 中可以直接利用解构赋值或是扩展运算符(`...`)来进行整体替换; - 数组则推荐使用变异方法(mutator methods),如 push(), pop() 等,因为这些会通知观察者发生改变;也可以创建新实例再赋给原变量[^1]。 ```javascript let obj = reactive({a: 1}); obj = {...obj, b: 2}; // 更新整个对象而是单独字段 let list = reactive([1]); list.push(2); // 使用变异方法使列表增长 ``` #### 3. 考虑缓存行为的影响 由于性能优化目的,默认情况下计算属性会被缓存起来直到某个依赖发生了实际变化才再次执行求值逻辑。因此即使调用了相关联的状态也会立刻引起重算。这属于设计上的特点而非缺陷。 #### 4. 排查潜在名称冲突 有时开发者会在模板里定义局部作用域内的标识符与全局状态中的键名相同,这样就可能导致优先级覆盖现象的发生,最终使得原本应该生效的计算属性失效。建议调整命名策略以规避此类干扰。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值