千家信息网

Vue.$set失效问题怎么解决

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇"Vue.$set失效问题怎么解决"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2025年02月02日Vue.$set失效问题怎么解决

这篇"Vue.$set失效问题怎么解决"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"Vue.$set失效问题怎么解决"文章吧。

Vue.$set失效

有这样一个需求 添加数据过滤用 左边是控件选择 中间是条件 右边是值

因为会根据控件不同渲染不同的值选项控件

                                                                                                                                          
{  props:{    props: {      type: Object,      default: () => ({        prop: "prop",        value: "value",        type: "type"      })    }  },  data(){    return {      data:{              }    }  },  methods:{    onValueChange(val){      this.$set(this.data, this.props.value, val)    }  }  //...}

代码片段

由于控件ID的不确定性 所有 data并不能提前预设好key 自然无法响应 所以在onValueChange 使用了this.$set动态添加数据实现响应

复现可以发现 值输入框内的数据并不能实时响应

明明用了$set却不能响应 一番排查后发现只要切换控件后 value值就不能响应 但是只要在切换前随便输入点啥 再切换就没问题

又是一番排查后发现

删除@change事件后故障解决

问题出现在 data[props.value] = ""

遂查看Vue源码

//vue/src/core/observer/index.js 源码片段  /** * Set a property on an object. Adds the new property and * triggers change notification if the property doesn"t * already exist. */export function set (target: Array | Object, key: any, val: any): any {  if (process.env.NODE_ENV !== "production" &&    (isUndef(target) || isPrimitive(target))  ) {    warn(`Cannot set reactive property on undefined, null, or primitive value: ${(target: any)}`)  }  if (Array.isArray(target) && isValidArrayIndex(key)) {    target.length = Math.max(target.length, key)    target.splice(key, 1, val)    return val  }  if (key in target && !(key in Object.prototype)) {    target[key] = val    return val  }  const ob = (target: any).__ob__  if (target._isVue || (ob && ob.vmCount)) {    process.env.NODE_ENV !== "production" && warn(      "Avoid adding reactive properties to a Vue instance or its root $data " +      "at runtime - declare it upfront in the data option."    )    return val  }  if (!ob) {    target[key] = val    return val  }  defineReactive(ob.value, key, val)  ob.dep.notify()  return val}

可以发现 在defineReactive之前 判断了key是否存在于对象之内 若存在就跳过了

坑就在这 多次翻阅Vue.$set文档并未发现$set不能为已存在的key添加监测对象

删除 data[props.value] = "" 改为 onValueChange("") 完美解决问题

以上就是关于"Vue.$set失效问题怎么解决"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

问题 内容 控件 数据 切换 不同 对象 文章 源码 片段 知识 篇文章 输入 不确定性 事件 代码 价值 动态 又是 右边 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京航空航天大学 网络安全 网络安全等保做什么 互联网网络安全设施建设标准 科才网络技术有限公司 常见网络安全防御体系 数据库安全加固步骤 苹果设备管理服务器地址怎么填 双阳区智能化网络技术质量保障 蚌埠供电公司网络安全 云服务器备份是备份什么 网络技术好考么 金仓数据库管理工具修改字段报错 加强网络技术人员培训 学校管理数据库er图 青桔共享单车服务器开小差 听景是软件开发 linux 服务器慢 网络安全教育大学生心得体会 工厂erp生产管理软件开发 广东品质软件开发服务价格优惠 三级网络技术要求 日本自动化服务器 数据库的检索和查询的区别 高中网络技术说课 方舟进入服务器怎么退出来 在线网络技术咨询售价 高校网络安全总结报告 艾尔登法环连接服务器出现信息 单位哪个部门管理网络安全 长沙交易软件开发哪家好
0