如何为自定义Vue.js组件添加v-model支持
介绍
v-model 指令是与 Vue.js 捆绑在一起的少数指令之一。 该指令允许我们的数据和视图之间的双向数据绑定。
使用双向数据绑定,当我们通过输入字段或其他控件更新数据时,我们可以修改 DOM(文档对象模型),而无需进行 DOM 工作。
在本文中,您将探索该指令的工作原理并将其用于您自己的组件。
了解 v-model 如何在内部工作
根据我们对 HTML 的了解,我们知道 input、select 和 textarea 是我们向应用程序提供数据的主要方式。
为了使 v-model 工作,它期望相关元素或组件接收一个 prop(默认为 value)并发出一个事件(默认为 input)。
根据元素,Vue 决定如何监听和处理数据。 对于 input 元素,您可以像这样使用 v-model :
<input v-model="email" />
v-model 转换为:
<input :value="email" @input="e => email = e.target.value" />
Vue 使用此扩展来处理 textarea、select 和其他一些 input 类型。
对于单选按钮和复选框,Vue 使用它们的 checked 属性并监听它们的 change 事件。
对于可以接受多个值的 select 标签和复选框等元素,Vue 将自动返回一个选定值的数组。
添加 v-model 到自定义组件
为了让我们的组件支持 v-model 双向绑定,组件需要接受 value 属性并发出 input 事件。
让我们创建一个名为 basic-input 的示例组件。 我们将使用 Vue 的 单文件组件 :
基本输入.vue
<template>
<input @input="handleInput" />
</template>
<script>
export default {
prop: ['value'],
data () {
return {
content: this.value
}
},
methods: {
handleInput (e) {
this.$emit('input', this.content)
}
}
}
</script>
为了支持 v-model,组件接受 value 属性并发出 input 事件。
像这样使用组件:
<basic-input v-model="email" />
这样,自定义组件支持 v-model 双向绑定。
自定义 v-model prop 和 event
让我们更进一步。 我们可能不想使用默认的 event 和 prop 来为我们的组件添加 v-model 支持。 值得庆幸的是,Vue 允许我们自定义它。
要自定义 event 和 ``prop,我们将 model 属性添加到我们的组件并定义新值,如下所示:
基本输入.vue
// ...
export default {
prop: ['hidden'],
model: {
prop: 'hidden',
event: 'blur'
}
methods: {
handleInput (value) {
this.$emit('blur', value)
}
}
}
// ...
这一次,当您像这样使用组件时:
<basic-input v-model="email" />
Vue 会自动将其转换为:
<basic-input :hidden="email" @blur="e => email = e.target.value" />
有了这个,您可以在定义组件的道具和事件时避免冲突。
在 contenteditable 上使用 v-model
内容可编辑 元素是 div 或类似的元素,可以配置为作为输入工作。
我们通过向元素添加 contenteditable 属性来定义内容可编辑元素:
<div class="editor" contenteditable="contenteditable"></div>
您将为 WYSIWYG 编辑器使用内容可编辑元素,因为它们更易于使用并且受到大量 浏览器 的支持。
v-model 将适用于内容可编辑元素,但您需要显式使用元素的内容,否则将不会发出内容。
要发出内容,您需要抓取 div 的 innerText 或 innerHTML。 因此,我们的 updateInput 方法需要如下所示:
updateInput () {
this.$emit('input', this.$el.innerText)
}
您还可以使用 ref 的内容代替根元素的内容。
有了这个,v-model 将适用于内容可编辑元素。 您还可以在 updateInput 方法中更新 this.content。
结论
现在您已经了解了如何将 v-model 与自定义 Vue 组件一起使用,您可以构建或重构需要使用 v-model 的组件。
如需进一步阅读,请参阅 v-model 的 官方文档或查看 Vue.js 主题页面 了解更多练习或项目。