当前位置: 首页 > 知识库问答 >
问题:

vue3 中的 ref 在template中使用必须加.value才生效,为什么?

华聪
2024-09-11

下面按钮,测试3 那个 disabled 不生效,为什么?但是后面 {{options.isDisabled}} 显示是 false,必须要像 测试4 那样加上 .value 才可以,但是 测试1 没有加 .value 确实正常的,这是为什么?

<script setup>
const isDisabled = ref(false);
const options = {
    options: reactive({
        isDisabled: false
    }),
    isDisabled: ref(false),
}
</script>

<template>
<button type="button" :disabled="isDisabled">测试1 {{isDisabled}}</button>
<button type="button" :disabled="options.options.isDisabled">测试2 {{options.options.isDisabled}}</button>
<button type="button" :disabled="options.isDisabled">测试3 {{options.isDisabled}}</button>
<button type="button" :disabled="options.isDisabled.value">测试4 {{options.isDisabled.value}}</button>
</template>

共有2个答案

贺立果
2024-09-11

https://blog.csdn.net/gtLBTNq9mr3/article/details/124937788

葛哲彦
2024-09-11

用法就很奇怪,为啥要用普通的对象来包裹一层呢。
一般来说多个 options 直接用 ref 声明多个变量就可以了呀。

<script setup>
import { ref } from 'vue'
const optionA = ref({
    options: { ... },
    disabled: false
})
const optionB = ref({
    options: { ... },
    disabled: false
})
</script>

<template>
  <div>
    <button type="button" :disabled="optionA.disabled">
      测试A {{optionA.disabled}}
    </button>
    <button type="button" :disabled="optionB.disabled">
      测试B {{optionB.disabled}}
    </button>
  </div>
</template>

如果还是想保留在原本的options的情况下,用 ref 或者 readonly 包裹以下就行了

<script setup>
import { ref, reactive, readonly } from 'vue'
const isDisabled = ref(false);
const options = readonly({
    options: reactive({
        isDisabled: true
    }),
    isDisabled: ref(false)
})

const onChangeA = () => isDisabled.value = true
</script>

<template>
  <button type="button" :disabled="isDisabled">测试1 {{isDisabled}}</button>
  <button type="button" :disabled="options.options.isDisabled">测试2 {{options.options.isDisabled}}</button>
  <button type="button" :disabled="options.isDisabled">测试3 {{options.isDisabled}}</button>
  <button type="button" :disabled="options.isDisabled" @click="onChangeA">测试4 {{options.isDisabled}}</button>
</template>

EDIT

如果说需要有不同的方法给不同的组件调用就是以下这样组合业务逻辑就好了。

<script setup>
import { ref } from 'vue'

// 业务块A
const optionA = ref({
    options: { ... },
    disabled: false
})
const onChangeA = () => optionA.value.disabled = true

// 业务块B
const optionB = ref({
    options: { ... },
    disabled: false
})
const onChangeB = () => optionB.value.disabled = true
</script>

<template>
  <button type="button" :disabled="optionA.disabled" @click="onChangeA">测试1 {{optionA.disabled}}</button>
  <button type="button" :disabled="optionB.disabled" @click="onChangeB">测试2 {{optionB.disabled}}</button>
</template>

Vue3中组合式API,其中的一个优势不就是为了解决选项式API中的这个痛点嘛。

62783026-810e6180-ba89-11e9-8774-e7771c8095d6.png

#更灵活的代码组织 - 组合式 API 常见问答 | Vue.js


如果说你觉得这样可能一个SFC文件中会有特别多的业务逻辑,可能会觉得不好维护。
如果放在一个对象中维护,IDE就可以把相关业务逻辑的折叠起来。继续按照你原本的开发习惯使用 readonly 包裹起来。
或者是把业务逻辑都提取到一个单独的JS文件中,然后 import 使用:

<script setup>
import { optionA, onChangeA } from './optionA'
import { optionB, onChangeB } from './optionB'
</script>

<template>
  <button type="button" :disabled="optionA.disabled" @click="onChangeA">测试1 {{ optionA.disabled }}</button>
  <button type="button" :disabled="optionB.disabled" @click="onChangeB">测试2 {{ optionB.disabled }}</button>
</template>
// optionA.js
import { ref } from 'vue'
// 业务逻辑A
const optionA = ref({
  options: {},
  disabled: false
})
const onChangeA = () => optionA.value.disabled = true
export { optionA, onChangeA }

// optionB.js
import { ref } from 'vue'
// 业务逻辑B
const optionB = ref({
  options: {},
  disabled: false
})
const onChangeB = () => optionB.value.disabled = true
export { optionB, onChangeB }

�� Vue SFC Playground

 类似资料:
  • 使用创建项目后,我无法导入clojure。contrib。核心,以便在中使用dissoc。 load-libs显示clojure.contrib.corelib未加载: 但是,如果我在项目中向添加依赖项。clj,我可以要求clojure。contrib。核心和使用dissoc的广告。从我从这个答案中读到的,这应该是没有必要的。我做错了什么?

  • 问题内容: 我正在尝试写入,但是,直到我致电,实际上才发送任何数据。即使我设置为false,也仍然不会发送。有人知道为什么吗?API文档中没有任何内容对此进行描述。 URLConnection上的Java API文档:http : //download.oracle.com/javase/6/docs/api/java/net/URLConnection.html Java的关于读取和写入URLC

  • 问题内容: 我已经在应用程序中构建了一些迁移类来创建所需的表,但是却不断出错。我需要运行以下命令: 只有这样,它才能再次按预期工作。我做错了什么会产生此错误,或者这是迁移的正常行为? 以下是运行迁移过程时遇到的错误: 问题答案: 好的,我想我知道您遇到的问题。 基本上,由于Composer无法看到您正在创建的迁移文件,因此您必须运行dump- autoload命令,该命令不会下载任何新内容,而是查

  • 本文向大家介绍在.vue文件中style是必须的吗?那script是必须的吗?为什么?相关面试题,主要包含被问及在.vue文件中style是必须的吗?那script是必须的吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 style 不是必须的,script 是必须的,而且必须要写上

  • 我需要在我的网站上集成英里/距离搜索,我正在使用MongoDB地理空间索引,然而,我得到了一些,无法解决。下面是我使用的模式和命令... 下面是我的索引... 然而,当我在mongo shell中运行following命令时,我得到了一个错误······ 错误:

  • 问题内容: 我希望这个问题不会太笼统。我知道,要在您上进行绘制,您需要重写该方法,并将所有绘制代码​​放入该方法中。我的问题是为什么!为什么Java似乎不允许/提供使用诸如或方法的绘图?在delphi中,一切都变得如此简单。一定有一个原因我无法弄清楚。 问题答案: 那是因为这就是它的工作方式。它是以此方式设计的。但是我想你的问题是关于“为什么” 请记住,Swing大约在15年前问世。批评之一是该A