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

Vue3 script setup中ref()状态互相赋值的正确写法是什么

Vue 3 <script setup> ref 赋值规则说明

ref() 调用后会返回一个带 .value 属性的响应式引用对象,用 let 声明的变量存储的是这个对象的引用地址,而非内部包裹的实际值,两种赋值写法的逻辑完全不同:

两种写法的实际效果

  • 写法1:stateOne.value = stateTwo.value
    这是值拷贝操作,赋值后stateOne和stateTwo仍然是两个完全独立的ref实例,只是两者内部存储的值暂时相等。后续修改任意一个ref的.value,都不会对另一个产生影响,是绝大多数业务场景下的正确用法。
    效果示例:

    <script setup>
    import { ref } from 'vue'
    let stateOne = ref('1')
    let stateTwo = ref('2')
    
    stateOne.value = stateTwo.value
    console.log(stateOne.value) // 输出 '2'
    stateTwo.value = '修改stateTwo'
    console.log(stateOne.value) // 仍然输出 '2',不受stateTwo修改影响
    </script>
    
  • 写法2:stateTwo = stateOne
    这是变量引用替换操作,会直接把stateTwo变量原本存储的ref实例覆盖,让它指向stateOne对应的那个ref对象。此时两个变量本质是同一个ref的别名,修改任意一个的.value,两个变量访问到的值都会同步变化,最初创建的存值为'2'的ref实例会被直接回收。
    效果示例:

    <script setup>
    import { ref } from 'vue'
    let stateOne = ref('1')
    let stateTwo = ref('2')
    
    stateTwo = stateOne
    console.log(stateTwo.value) // 输出 '1'
    stateOne.value = '修改stateOne'
    console.log(stateTwo.value) // 同步输出 '修改stateOne',指向的是同一个ref实例
    </script>
    

    这种写法如果出现在非顶层作用域,很容易导致模板绑定的响应式丢失,除非明确需要给同一个响应式状态起别名,否则不推荐使用。

选择建议

  • 常规需要两个独立响应式状态、仅同步初始值的场景,统一用refA.value = refB.value的写法。
  • 只有明确需要多个变量名指向同一个ref实例时,才用直接给ref变量赋值的写法,这类场景在实际业务中占比极低。

注意:如果需要两个状态保持长期响应式关联(一个变另一个自动跟着变),不要用上述两种写法,应该用computed来派生状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:21:40