pinia报错记录

背景:将全选复选框的值用pinia进行状态管理,其中使用计算属性计算isAllSelected值,在点击全选复选框报错。 

报错:TypeError: 'set' on proxy: trap returned falsish for property 'xxx'

报错原因:

由于在 Vue 的响应式系统中对计算属性进行直接赋值导致的。计算属性是只读的,不能直接修改。isAllSelected 是一个计算属性,但你尝试对其进行赋值,这会导致错误。


检查代码发现,复选框这块是直接拿了`element-plus`的代码:其中用`v-model`对数据进行双向绑定,违反了“计算属性不可赋值”的原理,因此报错。

<template>
  <el-checkbox-group v-model="checkList">
    <el-checkbox label="Option A" />
    <el-checkbox label="Option B" />
    <el-checkbox label="Option C" />
    <el-checkbox label="disabled" disabled />
    <el-checkbox label="selected and disabled" disabled />
  </el-checkbox-group>
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const checkList = ref(['selected and disabled', 'Option A'])
</script>

解决方案:

先将`v-model`改成checked,只进行单向的绑定,全选按钮的确可以正确显示,但是点击全选按钮不起作。原因:checked属性不能进行动态显示,它只能决定初始显示的值。

之后改成用`:model-value`,成功绑定。

分析原因:

在使用 el-checkbox 和 pinia 进行状态管理时,v-model 和 :model-value 的行为有所不同。

v-model 的工作原理

v-model 是 Vue 的一个语法糖,它实际上是以下两个指令的组合:

  • :value:用于绑定输入控件的值。
  • @input:用于监听输入控件的值变化事件。

当你使用 v-model 绑定一个 ref 或 reactive 对象时,Vue 会自动处理值的更新和事件的触发。然而,pinia 管理的 ref 对象是不可变的,这意味着你不能直接通过 v-model 来修改它,因为 v-model 会尝试直接修改 ref 的值,而这在 pinia 中是不允许的。

:model-value 的工作原理

:model-value 是一个属性绑定,它只是将值传递给组件,但不会尝试修改它。当你使用 :model-value 绑定一个 pinia 管理的 ref 对象时,组件会读取这个值,但不会尝试修改它。这意味着你可以安全地使用 :model-value 来绑定 pinia 管理的 ref 对象,而不会触发修改操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别问问就花括号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值