【问题标题】:How to use :value and v-model on the same element in Vue.js如何在 Vue.js 中的同一元素上使用 :value 和 v-model
【发布时间】:2019-05-13 07:04:49
【问题描述】:

我想更新一些输入字段

所以我创建了一个输入元素:

new Vue({
  el: '#app',
  data: {
    record: {
      email: 'example@email.com'
    },
    editing: {
      form: {}
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <input type="text" :value="record.email" v-model="editing.form.email">
  <pre>{{ editing.form.email }}</pre>
</div>

在这个输入元素中,我添加了:value attr 和v-model

不幸的是,我收到了一个错误:

在同一元素上与 v-model 冲突,因为后者已经 在内部扩展为值绑定

用数据填充输入字段然后更新它的最佳解决方案是什么?

我还尝试添加 :name="..." 而不是 :value="..."

http://jsfiddle.net/to9xwL75/

【问题讨论】:

    标签: vue.js


    【解决方案1】:

    不要将:valuev-model 一起使用。

    使用mounted() 更新您的模型并预填充输入值:

    data() {
      return {
        record: {
          email: ''
        }
      }
    },
    mounted() {
      setTimeout(() => {
        this.record.email = 'example@email.com'
      }, 500)
    }
    

    【讨论】:

      【解决方案2】:

      您可能希望将 初始/默认值 放在 data 对象上,双向绑定应该适用于 v-model。只需删除 editing.form.email 并尝试以下操作:

      <div id="app">
        <input type="text" v-model="record.email">
        <pre>{{ record.email }}</pre>
      </div>
      
      new Vue({
        el: '#app',
      
        data() {
          return {
            record: {
              email: 'example@email.com'
            }
          }
        }
      })
      

      如果您需要使用动态值填充此字段,您可以添加一个处理程序方法并在获取数据时更新输入元素:

      methods: {
          getData() {
              axios.get('/some-url')
                  .then(data => {
                      this.record.email = data.email;
                  });
          }
      }
      

      【讨论】:

      • 我想他想用从 API 获取的数据来设置初始输入值。您不能简单地使用您的解决方案在数据中分配请求的响应。
      • 是的,我正在使用 API 获取数据。当我单击“编辑”按钮时,我想在特定显示元素上设置 v-if 条件并将其更改为具有预填充数据的输入元素。但我认为这是我的逻辑错误,使两个对象 editor.form 和一个记录。
      【解决方案3】:

      正如 Alexander 所说,不要将 :value 和 v-model 一起使用。这是因为 v-model 创建了一个two-way binding。它结合了:value 和@change。绑定输入后,您应该忘记输入并专注于模型。

      如果 'example@email.com' 是占位符,为什么不使用 placeholder attribute

      【讨论】:

        【解决方案4】:

        您好,我通过这种方式解决了这个问题:

         <input
           placeholder="Name"
           class="block w-full bg-grey-lighter text-grey-600 border placeholder 
           gray-500 border-indigo-200 rounded-lg h-10 px-4 focus:ring focus:ring- 
           indigo-300 "
           type="text"
           v-model="form.name" 
        />
        
        
        data:() => ({
           form:{
              name: "",
              note: "",
              selected: 0,
              gender: 0
        
           }
        }),
        porps: {
          contact: {
             type: Object
           }
        },
        whatch: {
           contact: {
              immediate: true,
              handler(val, oldVal) {
                 this.form =  {
                      name: val.name,
                      note: val.note,
                      selected: val.seleted,
                      gender: val.gender
                  }
              }
           }
        }
        

        【讨论】:

        • 虽然此代码可以解决问题,但including an explanation 确实有助于提高您的回答质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,因为这会降低代码和解释的可读性。阅读How to Answer
        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 2020-09-26
        • 2019-07-28
        • 2020-03-13
        • 2020-07-18
        • 2018-02-20
        • 2019-05-07
        相关资源
        最近更新 更多