【问题标题】:Concatenating form input datas with javascript and vuejs使用 javascript 和 vue js 连接表单输入数据
【发布时间】:2019-07-23 15:32:10
【问题描述】:

我有一个带有 vuejs 的表单,并希望在提交来自输入字段的数据时进行连接。我附上了一个jsfiddle,在那里我试图解决concat但没有成功。

我为三个输入字段设置了三个 vue vomponents,其中第一个是下拉列表,其中自定义选项应更改为输入文本字段。

如果我试图连接三个数据,js 会给我未定义的错误。

new Vue({
    el: '#product_id',
    data: {
        selected: '1',
        options: [
            { text: 'Product 1', id: '1', value: '1' },
            { text: 'Product 2', id: '2', value: '2' },
            { text: 'Product 3', id: '3', value: '3' },
            { text: 'Product 4', id: '4', value: '4' },
            { text: 'Custom', id: '5', value: '' }
        ],
        product_i: '',
        resetKey: 0,
    },
    methods:{
        updateComponent(){
            this.resetKey += 1;
            console.log(this.resetKey);
            console.log('test');
        }
    },
}),

new Vue({
    el: "#product_name",
    data: {
        product_n: '',
    }
});

new Vue({
    el: "#product_price",
    data: {
        product_p: '',
    }
});


function combine_product_datas() {
    var id = document.getElementById('input1').value;
    var name = document.getElementById('input2').value;
    var price = document.getElementById('input3').value;
        document.getElementById('joint').value = id + '.' + name + '/' + price;
        alert(document.getElementById('joint').value);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div class="row">
  <div id="product_id">    
    <div :key="resetKey">
      <small>Product id</small>
      <div v-if="selected != ''">
        <select v-model="selected">
          <option v-for="option in options" v-bind:value="option.value">
            {{ option.text }}
          </option>
        </select>
      </div>
      <br>                      
      <div v-else>
        <input id="id" v-model="product_i" value="" type="text" placeholder="Add your product">
        <button v-on:click="updateComponent">Reset</button>
      </div>
  </div>
</div>
<br>                      
<div id="product_name">
  <div>
    <div>
        <small>Product name</small><br>
        <input id="name" v-model="product_n" type="text">
    </div>
  </div>
</div>
<br>                      
<div id="product_price">
  <div>
    <div>
      <small>Product price</small><br>
      <input id="price" v-model="product_p" type="text">
    </div>
  </div>
</div>
<br>                       
<div>
  <div>
    <button type="submit" onclick="combine_product_datas();">Combine datas</button>
  </div>
</div>
<br>                      
<input type="hidden" id="joint">
<br>                      
</div>

【问题讨论】:

  • 请添加导致错误的代码
  • 我尝试使用的代码在之前添加的 jsfiddle 链接上。
  • 嘿 Tikinu,我看看你的代码,如果你只是想让你的 v-if / v-else 逻辑工作,只需删除:
    标签(来自 HTML 代码)和逻辑将工作:) 当您使用 v-if 和 v-else-if 或 v-else 时,您不能在这些代码之间放置任何代码,好吗?希望有帮助;)
  • 谢谢朱利亚诺,确实我删除了 br 标签,这部分工作。串联怎么办?或者,如果我从列表中选择自定义选项并出现输入字段,您能否帮助下拉菜单,我想使用重置按钮重新呈现下拉组件。有可能吗?

标签: javascript vue.js


【解决方案1】:

查看代码,我不太清楚为什么需要三个不同的 Vue 实例。您可以简单地将整个东西放在一个包装器下并使用一个 Vue 实例。然后,您可以将 javascript 函数放在一个实例中,而不必使用文档选择器来获取组合值。修改后的代码是这样的(修改后的js小提琴here):

new Vue({
        el: '#app',
        data: {
            selected: '1',
            options: [
                { text: 'Product 1', id: '1', value: '1' },
                { text: 'Product 2', id: '2', value: '2' },
                { text: 'Product 3', id: '3', value: '3' },
                { text: 'Product 4', id: '4', value: '4' },
                { text: 'Custom', id: '5', value: '' }
            ],
            product_i: '',
            resetKey: 0,
            product_n: '',
          	product_p: ''
        },
        methods:{
          updateComponent(){
            this.resetKey += 1;
            console.log(this.resetKey);
            console.log('test');
          },
          combineData() {
          	const { product_i, product_n, product_p } = this;
            alert(`id: ${product_i}, name: ${product_n}, price: ${product_p}`)
          }
        },
    })
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">

  <small>Product id</small>
  
  <div v-if="selected != ''">
    <select v-model="selected">
      <option v-for="option in options" v-bind:value="option.value">
        {{ option.text }}
      </option>
    </select>
  </div> 
  
  <div v-else>
    <input id="id" v-model="product_i" value="" type="text" placeholder="Add your product">
    <button @click="updateComponent">Reset</button>
  </div>
  
  <div>
    <small>Product name</small><br>
    <input id="name" v-model="product_n" type="text">
  </div>

  <div>
    <small>Product price</small><br>
    <input id="price" v-model="product_p" type="text">
  </div>            

 <button type="submit" @click="combineData()">Combine data</button>
  <span :value="combined"></span>
                   
  <input type="hidden" id="joint">

</div>

【讨论】:

  • 非常感谢凯茜哈!它以这种方式就像一个魅力。你是对的,一个实例比我做的更方便。只是一个小问题......我如何将产品的价值传递给警报?如果选择了自定义选项,它会传递输入字段的内容,但产品 1-4 不会。还有一件小事,我如何使用自定义输入字段中的重置按钮重置下拉元素。我认为密钥和 updateComponent() 应该可以工作,但现在不行。
  • 没问题!因此,要回答您的问题:1)将产品的值传递给警报,无论是自定义输入还是选择,您都可以使用计算变量。我不太确定这是否是最好的方法,但它确实有效。 2)要重置表单,请将整个代码包装在
    元素中(使用任何你想要的 ref,我使用“form”),然后使用 this.$refs.form.reset() 重置表单 -或者您可以直接重置该变量(product_id = '')。您需要添加 e.preventDefault 以防止提交。 js小提琴在这里:link
  • 太棒了!重置有效,但我想我不清楚。我想进行重置,如果单击按钮,下拉菜单将返回。不仅输入字段的内容会被擦除。几乎一切都像我想要的那样工作:) 再次感谢!
  • 哦,这很简单!只需在重置函数中这样说:this.selected = 1
猜你喜欢
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多