vue.js - v-model 和子组件?

标签 vue.js vuejs2

我有一个表单并使用 v-model 绑定(bind)输入:

<input type="text" name="name" v-model="form.name">

现在我想提取输入并使其成为自己的组件,然后如何将子组件的值绑定(bind)到父对象form.name

最佳答案

As stated in the documentation ,

v-model 是语法糖:

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

为自定义组件实现 v-model 指令:

  • 为组件指定一个 value 属性
  • 使用 computed setter 创建一个计算属性对于内部值(因为您不应该从组件内部修改 prop 的值)
  • 为返回 value 属性值的计算属性定义一个 get 方法
  • 为计算属性定义一个 set 方法,每当属性发生变化时,它会发出一个带有更新值的 input 事件

这是一个简单的例子:

Vue.component('my-input', {
  template: `
    <div>
      My Input:
      <input v-model="inputVal">
    </div>
  `,
  props: ['value'],
  computed: {
    inputVal: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('input', val);
      }
    }
  }
})

new Vue({
  el: '#app',
  data() {
    return { 
      foo: 'bar' 
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.3/vue.min.js"></script>
<div id="app">
  <!-- using v-model... -->
  <my-input v-model="foo"></my-input>
  
  <!-- is the same as this... -->  
  <my-input :value="foo" @input="foo = $event"></my-input>

  {{ foo }}
</div>

感谢 @kthornbloom用于发现先前实现的问题。

Vue 3 中的重大变化

Per the documentation ,Vue 3 中的 v-model 实现发生了重大变化:

  • value -> modelValue
  • 输入 -> update:modelValue

关于vue.js - v-model 和子组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47311936/

相关文章:

javascript - 如何将 "this"以及 v-model 从输入传递到处理程序

javascript - 如何在vue js中创建多行表单?

javascript - 如何在 vue js 中将从 firebase 检索到的数据显示到标题标记 <h1>{{ }}</h1> ?

javascript - 如何在 vue.js 中使用带复选框的 v-model?

vuejs2 - $router.push 不工作?

javascript - 当我在 Vue 中单击路由页面关于时,数据正在清除

vue.js - 如何在一个模块内从另一个模块使用 getter 进行 Vuex 状态

javascript - 在 SPA 中,如何防止存储在 localStorage 或 sessionStorage 中的服务器端数据变得过于陈旧?

javascript - 如何在 Vue 中的渲染列表中打开模式?

css - Vue.js - element-ui el-table v-for 丢失了最后一项