【问题标题】:Obtaining value and setting new value using one function for different input fields使用一个函数为不同的输入字段获取值和设置新值
【发布时间】:2022-01-17 18:56:32
【问题描述】:

使用 vue,我有五个不同类别的输入字段。我想将每个输入字段传递给一个函数,操作值,然后将更新后的值分配给原始输入名称。

问题是,我无法弄清楚如何获取输入字段的值、执行功能并将修改后的值分配给与输入字段关联的对象。

编辑:用当前的努力更新了代码

<template>
 <q-input
    v-model="categoryOne"
    name="categoryOne"
    @change="onSelected($event, categoryOne)"
 ></q-input>
 <q-input
    v-model="categoryTwo"
    name="categoryTwo"
    @change="onSelected($event, categoryTwo)"
></q-input>
</template>
</script>
export default {

setup() {
 let categoryOne = ref(null);
let categoryTwo = ref(null);

function onSelected(event, category) {
   //how would I take the input of each category and perform an 
   action that updates the original value? The only way I can figure 
   this out is to do it one-by-one, which seems sloppy and loses a 
  lot 
   of intended functionality.

   if (category === "categoryOne") { categoryOne.value = 
   categoryOne + 2 }
   if (category === "categoryTwo") { categoryTwo.value = 
   categoryTwo + 2 }
   
    }
  }
  </script>

【问题讨论】:

  • 我认为你的问题没有得到任何回应的原因是它不清楚你的挑战是什么。您已经正确地将事件处理程序onSelected 连接到输入的@change 事件......所以现在您可以在该事件处理程序中做任何您想做的事情。如果您需要有关如何做任何事情的帮助,您必须发布具体问题以及您尝试解决的问题。
  • 明白。我试图用我所知道的来更新。我正在继续考虑
  • 请显示 categoryOne 和 categoryTwo 的结构 - 这些是字符串......还是具有 .value 属性的对象?目前还不清楚。一方面,您将它们与输入一起使用,(并且由于未指定属性type,它应该是一个字符串。然后您将类别作为您的第二个参数传递给您的 onSelected 函数......但是你没有使用它 - 你指的是 categoryOne 和 categoryTwo ...但是这些变量没有被声明。
  • categoryOne 和 categoryTwo 的值将是来自 q-input 文本字段的字符串输入。我已经更新以展示解决您的 cmets 的努力。虽然上述方法适用于手动过程(即需要分别处理每个类别),但我希望该函数能够应用于传入的任何对象,以更新对象的值。感谢您帮助解决这个问题!

标签: javascript vue.js


【解决方案1】:

我认为我理解的问题是更多地询问如何导致两个输入对彼此产生副作用,而不是计算该副作用的细节。

关键是UI控件可以通过v-model双向绑定到data。下面,输入一个控件会产生另一个副作用。

var app = new Vue({
  el: '#app',
  data: {
    valueA: '',
    valueB: '',
  },
  methods: {
    changeA() {
      this.valueB = parseInt(this.valueA) + 2
    },
    changeB() {
      this.valueA = parseInt(this.valueB) + 2
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <h1></h1>
  <input type="text" v-model="valueA" @input="changeA()">
  <input type="text" v-model="valueB" @input="changeB">
</div>

在问题编辑后再次查看,可能是关于副作用的形式,避免使用条件列表。条件列表传统上由一系列if 和可选的elseif 块描述,带有一个开关。使用文字对象和闭包,可以使用更简洁的选项。

这是使用这个想法的 sn-p...

var app = new Vue({
  el: '#app',
  data: {
    valueA: '',
    valueB: '',
  },
  methods: {
    change(inputCategory) {
      // closures representing actions
      const actions = {
        one: () => this.valueB = +this.valueA + 2,
        two: () => this.valueA = +this.valueB + 2
      };
      // execute the closure with a given key
      actions[inputCategory]();
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <h1></h1>
  <input type="text" v-model="valueA" @input="change('one')">
  <input type="text" v-model="valueB" @input="change('two')">
</div>

【讨论】:

  • 谢谢。您答案的修订部分给了我另一个方向。我是新来的,正确的词汇不足以澄清这个问题。使用您的示例,假设我有 ValueC、VD 和 VE。我希望该方法接受用户输入的任何值(一些、全部或无),执行一个函数,并将值返回给原始对象(ValueA-E)。因此,如果 VA = 2 且 VC = 4,则该方法将添加 2,VA 将等于 4,VC 将等于 6。我想避免在 if 语句中单独列出值。
  • @jdost_26 - 你的意思是你想将 2 添加到几个变量而不在代码中按名称提及它们?我们可以忘记输入标签和 vue 并继续努力吗?
  • 抱歉耽搁了。处理程序流是我正在寻找的答案:stackoverflow.com/questions/70795699/…。我意识到我需要解决这个问题才能更好地提出这个问题。感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2019-06-06
  • 2020-02-15
  • 2014-05-26
  • 1970-01-01
  • 2011-11-28
相关资源
最近更新 更多