我有3v-文本场.我希望只有在没有手动输入的情况下,才自动计算(vText1 + vText2)t3.如果用户在t3中写下"230",它应该忽略vTextC.但是,如果用户删除了他们所写的内容,则vTextC应该再次成为文本字段的值.

<template>
    <v-text-field ref="t1" v-model="vText1"/>
    <v-text-field ref="t2" v-model="vText2"/>
    <v-text-field ref="t3" value="vTextC"/>
</template>
<script>
    export default {
       data() {
           return {
               vText1 : 0,
               vText2 : 0
           }
       },
       computed:{
           vTextC(){ return this.vText1 + this.vText2}
       }
    }
</script>

推荐答案

使用@input事件(Vue 3中的@update:modelValue)跟踪输入是否是手动进行的.然后,仅在不处于手动模式时更新值:

const ButtonComponent = {
  template: `
  <v-card class="ma-2 pa-2" style="max-width: 400px;">
    <v-text-field type="number" v-model.number="vText1" dense/>
    <v-text-field type="number" v-model.number="vText2" dense/>
    <v-text-field
      type="number"
      :label="isManual ? 'manual' : 'calculated'"
      v-model.number="vText3"
      @input="updateIsManual"
      dense
    />
  </v-card>
 `,
  data() {
    return {
      vText1: 0,
      vText2: 0,
      vText3: 0,
      isManual: false,
    }
  },
  methods: {
    calculateVText3() {
      if (this.isManual) return
      this.vText3 = this.vText1 + this.vText2
    },
    updateIsManual(value) {
      this.isManual = value !== ''
      if (!this.isManual) {
        this.calculateVText3()
      }
    },
  },
  watch: {
    vText1: 'calculateVText3',
    vText2: 'calculateVText3',
  },
}

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  components: {'button-component': ButtonComponent}
})
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">

<div id="app">
  <v-app>
    <v-main>
     <button-component></button-component>
    </v-main>
  </v-app>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>

请注意,在UX方面,这有点乱,因为用户不知道如何从手动输入返回.请看下面的代码片段,其中使用了一个复选框来使其更加明确:

const ButtonComponent = {
  template: `
  <v-card class="ma-2 pa-2" style="max-width: 400px">
    <v-text-field type="number" v-model.number="vText1" dense/>
    <v-text-field type="number" v-model.number="vText2" dense/>
    <v-text-field
      type="number"
      v-model.number="vText3"
      :readonly="calculateField3"
      @focus="calculateField3 = false"
      dense
    >
      <template #append-outer>
        <v-checkbox
          class="mt-0"
          v-model="calculateField3"
          label="calculate automatically"
          @change="$event && calculateVText3()" 
        />
      </template>
    </v-text-field>
  </v-card>
 `,
  data() {
    return {
      vText1: 0,
      vText2: 0,
      vText3: 0,
      calculateField3: true,
    }
  },
  methods: {
    calculateVText3() {
      if (!this.calculateField3) return
      this.vText3 = this.vText1 + this.vText2
    },
  },
  watch: {
    vText1: 'calculateVText3',
    vText2: 'calculateVText3',
  },
}

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  components: {
    'button-component': ButtonComponent
  }
})
<link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@6.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">

<div id="app">
  <v-app>
    <v-main>
      <button-component></button-component>
    </v-main>
  </v-app>
</div>

<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script>

Vue.js相关问答推荐

我可以将Created()中内置的内容传递给Provide属性吗?

如何在 Vuetify 2 中的轮播项目上放置 href 属性?

如何在vue js模板中添加foreach和for循环

Vue 3 如何通过多个组件传递插槽

使用计算(computed)属性更改视图

如何使用 async/await 在 vue js 中添加标头

如何在Vue js 3中根据API响应替换react 值

在下拉菜单上使用箭头键滚动

Vue watch 意外调用了两次

Object.assign 没有正确复制

Vue.js 中 Chrome 和 Datalist 的性能问题

加载和渲染时对象值上的 Vue.js 未定义错误

从 Url 中删除查询字符串参数

如何在某些路由上隐藏全局组件(例如导航栏)?

Laravel 事件未广播

Vue devServer 代理没有帮助,我仍然收到 CORS 错误

Vue Cli 3 不允许我在 Webpack 中处理 SVG

'vue' 未被识别为内部或外部命令

Vuetify 离线文档

Vue - 重用方法的最佳方式