You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3如何使readonly对象仅允许修改指定键(如target)?

Vue3 实现只读对象允许修改指定属性的方法

有两种实用的方法可以实现你要的效果,让readonly对象除指定键外保持只读:

方法一:直接修改原reactive对象

因为readonly()返回的是原reactive对象的只读代理视图,原对象的修改会同步到readonly对象中。你可以直接修改原对象的指定属性,readonly对象的对应值会自动更新:

import { reactive, readonly } from 'vue'

const obj = reactive({
  name: 'example',
  target: 'DOM',
})

const readonlyObj = readonly(obj)

// 直接修改原对象的target属性
obj.target = 'Modal'
console.log(readonlyObj.target) // 输出 'Modal'

// 尝试修改readonlyObj的其他属性依然会被拦截
readonlyObj.name = 'test' // 控制台抛出警告,修改无效

方法二:自定义Proxy包装对象

如果需要对外暴露一个统一的对象,让调用者可以直接修改指定属性(无需感知原对象),可以用Proxy包装readonly对象,拦截set操作,只允许修改指定键:

import { reactive, readonly } from 'vue'

const obj = reactive({
  name: 'example',
  target: 'DOM',
})

// 指定允许修改的键列表
const writableKeys = ['target']
const readonlyObj = new Proxy(readonly(obj), {
  set(_, key, value) {
    if (writableKeys.includes(key)) {
      // 直接修改原reactive对象的对应属性
      obj[key] = value
      return true
    }
    console.warn(`属性 "${key}" 为只读,无法修改`)
    return false
  }
})

// 现在可以直接修改readonlyObj.target
readonlyObj.target = 'Modal'
console.log(readonlyObj.target) // 输出 'Modal'

// 修改其他属性会被拦截并提示
readonlyObj.name = 'new example' // 控制台警告,修改无效

内容的提问来源于stack exchange,提问作者rozsazoltan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:18:15