vue.js v-model验证和显示字段

时间:2018-03-03 22:10:07

标签: javascript forms validation vue.js v-model

在此代码中:

<button type="button @click="editing=true">Edit</button>
<form v-show="editing" @submit="onSubmit">
   <textarea v-model="text"></textarea>
</form>
<div> Current value: {{text}} </div>

new Vue({ //...
   data: {
     editing: false,
     text: 'initial value..'
   }
   methods: {
     onSubmit: function() { if (this.value.length < 5) alert("error") }
   }
}

如何确保{{text}}仅显示经过验证的值?我是否必须创建两个数据成员 - 一个用于表单,另一个用于显示?这将导致我的代码中的一些混乱(我有很多大型表格) 也许有一个v模型更新钩子用于验证?
这个问题的关键点 - 如果可以避免拥有两个数据成员。

2 个答案:

答案 0 :(得分:1)

对于v-model

<textarea></textarea>会转换为:

<textarea
    v-bind:value="text"
    v-on:input="text = $event.target.value">

所以你最后一个问题的答案是否定的,没有钩子。你要么不使用v-model来实现类似上面的代码或使用 第二个变量,用于保存您在问题中考虑的最后一个有效字符串。后者可以如下:

const app = new Vue({
  el: "#app",
  data: {
    editing: false,
    text: 'Initial value..',
    lastValid: 'Initial value..',
  },
  watch: {
    text(value) {
      if (value.length > 4) {
        this.lastValid = value;
      }
    },
  },
})
<script src="https://unpkg.com/vue"></script>

<div id="app">
  <div>
    <form>
      <textarea v-model="text "></textarea>
    </form>
    <div> Current value (legth > 4): {{lastValid}} </div>
  </div>
</div>

答案 1 :(得分:1)

你可以保存最后一个有效输入(在这种情况下长度> = 5)并在每个keydown事件上更新它,然后在提交时发送最后一个存储的有效值

&#13;
&#13;
new Vue({
 el: '#app',
 data() {
  return {
   text: 'initial value..',
   lastValid: 'initial value..'
  }
 },
 methods: {
  submit() {
    alert(this.lastValid)
  },
  textChange($event) {
    let newText = $event.target.value
    this.lastValid = newText.length < 5 ? this.lastValid : newText
  }
 }
})
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.13/vue.js"></script>

<div id="app">
  <form>
    <textarea v-model="text" @keydown="textChange"></textarea>
    <input type="submit" value="Send" @click="submit" />
  </form>
  {{ lastValid }}
</div>
&#13;
&#13;
&#13;