在 Vue 3 中使用 v-model 自定义组件
在 Vue 3 中,v-model 是用于创建双向数据绑定的指令。通常,我们使用该指令将任何 HTML 表单元素与一个变量绑定以收集输入值。 但通常我们需要绑定一个表单元素,该元素存在于不同的组件中。在这种情况下,您必须使用 v-model 来自定义组件。 通过这种方式,您可以将变量与子组件内的 HTML 元素绑定。 在最新版本的 Vue 即 Vue 3 中,我们必须遵循与 Vue 2 中不同的规
在 Vue 3 中,v-model 是用于创建双向数据绑定的指令。通常,我们使用该指令将任何 HTML 表单元素与一个变量绑定以收集输入值。
但通常我们需要绑定一个表单元素,该元素存在于不同的组件中。在这种情况下,您必须使用 v-model 来自定义组件。
通过这种方式,您可以将变量与子组件内的 HTML 元素绑定。
在最新版本的 Vue 即 Vue 3 中,我们必须遵循与 Vue 2 中不同的规则。
在本文中,我将向您展示如何以最佳方式非常轻松地将 v-model 添加到 Vue 3 中的自定义组件中。
如果您使用的是 Vue 2,您可以关注我们关于如何将 v-model 添加到 Vue2 中的自定义组件的另一篇文章。
在 Vue 2 中,我们只有一种创建组件的方法。但是在 Vue 3 中,我们可以通过 3 种不同的方式创建组件。
-
选项 API(这是 Vue 2 中提供的旧样式)。
-
组合 API。
-
SFC(单文件组件)脚本设置。
我将向您展示如何使用这三种方式使用 v-model 来自定义组件。
先决条件
在阅读本文之前,您需要满足一些基本要求。这些是:
-
关于Vue 3的基础知识。
-
你应该知道 HTML 表单元素。
-
您应该了解 Vue 3 指令以及如何使用它们。 ## 什么是双向数据绑定?双向数据绑定是一种连接 HTML 表单元素和变量的方法,这样如果一个地方的值发生变化,它也会反映在另一个地方。例如,如果表单元素中的值发生变化,那么存储在变量中的值也会同时自动变化。
它还将更新模板中使用该变量的每个位置的值,以便用户始终看到最新值。
如果我们必须向用户实时显示更改,则此过程非常有用。在 Vue 中, v-model 指令默认使用这种技术。
v-model 如何在 Vue 3 中工作?
如您所知,我们使用 v-model 将变量和表单元素绑定在一起,这样如果您在一个地方更改值,它也会在另一个地方更改。
但是要实现 v-model 到自定义组件,必须知道这个指令在后台是如何工作的。
当我们在输入字段中添加 v-model 时,Vue 会自动在该输入中添加两个幕后内容。
-
Vue 将该输入字段的 value 属性与我们在 v-model 中提供的变量绑定。
-
Vue 将 JavaScript 输入事件添加到该输入字段,以便每次用户在输入字段中写入或删除某些内容时都会触发该事件。如果您想在 Vue 3 中使用 v-model 自定义组件,这正是您必须做的。
如何将 v-model 添加到自定义组件
要将 v-model 支持添加到组件,您必须执行 v-model 指令对场景后面的输入字段所做的两件事。
-
您必须将该输入字段中的 value 属性与名为 modelValue 的 prop 绑定。您必须将此道具命名为 modelValue,它区分大小写。
-
每次触发输入事件时,您都必须监听输入事件并发出自定义事件。您必须将自定义事件命名为 update:modelValue,它也区分大小写。注意:我将在本文的后面部分向您展示如何为 prop 和自定义事件使用不同的名称。您可以使用任何 HTML 表单元素,例如 input、select、textarea 等。
在 Vue 3 选项 API 中将 v-model 添加到自定义组件
在本节中,我将向您展示如何使用选项 API 将 v-model 应用于自定义组件。
首先,您必须在 Vue 3 项目中创建一个组件。我创建了一个名为 BaseInput.vue 的组件,你可以给任何你想要的名字。
<!-- BaseInput.vue component -->
<template>
<div>
<h2>Options API</h2>
<input type="text" :value="modelValue" @input="updateValue" />
</div>
</template>
<script>
export default {
props: {
modelValue: ''
},
methods: {
updateValue(event) {
this.$emit('update:modelValue', event.target.value);
}
}
}
</script>
进入全屏模式 退出全屏模式
在这个组件中,我有一个 HTML 输入字段,我想在其中创建双向数据绑定。
在这里,我必须将输入字段中的 value 属性与 modelValue 属性绑定并发出 udpate:modelValue 事件。
每次输入事件触发时,它都会运行方法 updateValue。 Vue 自动将事件对象传递给此方法。此方法使用用户在输入字段中输入的值发出自定义事件。
现在您可以在任何其他组件中使用此组件并添加 v-model 指令。
<!-- App.vue component -->
<template>
<base-input v-model="content"></base-input>
</template>
进入全屏模式 退出全屏模式
我在 App.vue 组件中使用了 BaseInput.vue 组件。在这里,App 是父组件,它有一个名为“content”的变量。
每次有人在输入字段中输入内容时,此变量都会存储该值。同样,如果您为此变量设置默认值,该值将显示在输入字段中。
这就是您可以使用选项 API 将 v-model 添加到 Vue 3 中的自定义组件的方式。
在 Vue 3 组合 API 中将 v-model 添加到自定义组件
如果您在组件中使用 Vue 3 组合 API,则可以按照此方法为自定义组件添加 v-model 支持。
<!-- BaseInput.vue component -->
<template>
<div>
<h2>Composition API</h2>
<input type="text" :value="modelValue" @input="updateValue" />
</div>
</template>
<script>
export default {
props: {
modelValue: ''
},
setup(props, context) {
const updateValue = (event) => {
context.emit('update:modelValue', event.target.value);
}
return { updateValue }
}
}
</script>
进入全屏模式 退出全屏模式
在组合 API 中,我们必须使用与选项 API 相同的道具名称并发出相同的事件。
您只需遵循组件中的组合 API 语法。
在这个组件中,我使用了组合 API 所需的 setup() 函数。
<!-- App.vue component -->
<template>
<base-input v-model="content"></base-input>
</template>
进入全屏模式 退出全屏模式
现在您可以在任何其他组件中使用 BaseInput 组件并将 v-model 指令应用于它。
在 Vue 3 SFC 脚本设置中添加 v-model 到自定义组件
SFC(单文件组件)是最新版本的 Vue 3 中引入的另一种语法。使用这种语法,您可以在组件中编写干净易读的代码。
<!-- BaseInput.vue component -->
<template>
<div>
<h2>SFC Script Setup</h2>
<input type="text" :value="modelValue" @input="updateValue" />
</div>
</template>
<script setup>
const props = defineProps({
modelValue: String
})
const emit = defineEmits(['update:modelValue'])
const updateValue = (event) => {
emit('update:modelValue', event.target.value)
}
</script>
进入全屏模式 退出全屏模式
此语法是组合 API 的一部分。但不同的是我们编写它的方式。
在早期版本的 Composition API 中,我们不得不使用 setup() 函数。但在新语法中,您在脚本标签中使用了 setup 这个词。
对于 Props 和 Emits,我们必须使用 Vue 提供的 defineProps() 和 defineEmits()。你甚至不必从 Vue 中导入它们。
您可以看到它比其他两种样式需要更少的代码并且看起来很简单。
除此之外,一切都相似。现在您可以使用 v-model 指令将该组件导入并使用到另一个组件。
<!-- App.vue component -->
<template>
<base-input v-model="content"></base-input>
</template>
进入全屏模式 退出全屏模式
在组件中自定义 v-model 默认道具和事件名称
到目前为止,我们使用了与 modelValue 相同的 prop 名称和与 update:modelValue 相同的事件名称。但是,如果您想使用不同的名称怎么办。
现在,我将向您展示如何在使用 v-model 自定义组件时为 prop 和 event 使用不同的名称。
<!-- BaseInput.vue component -->
<template>
<div>
<h2>Custom name for Prop and Event</h2>
<input type="text" :value="title" @input="updateTitle" />
</div>
</template>
<script setup>
const props = defineProps({
title: String
})
const emit = defineEmits(['update:title'])
const updateTitle = (event) => {
emit('update:title', event.target.value)
}
</script>
进入全屏模式 退出全屏模式
在上面的示例中,我使用 title 作为我添加到 :valueu003d"" 属性的道具名称。
现在,每当用户在输入字段中输入内容时,您都可以发出 update:title 事件。我正在使用更新:标题,因为我的道具名称是标题。如果您使用其他名称,则只需添加该名称并带有前缀 update:。
<!-- App.vue component -->
<template>
<base-input v-model:title="postTitle"></base-input>
</template>
进入全屏模式 退出全屏模式
当您将 v-model 应用于该组件时,您必须提及您在 BaseInput.vue 组件中使用的道具名称。
Vue 3 中自定义组件中的多个 v-model
在 Vue 2 中,我们只能在组件中使用 v-model 一次。
但是在 Vue 3 中,我们可以同时将多个 v-model 附加到一个组件上。这就是您可以使用多个 v-model 来自定义组件的方式。
<!-- BaseInput.vue component -->
<template>
<div>
<h2>Title</h2>
<input type="text" :value="title" @input="updateTitle" />
<h2>Content</h2>
<input type="text" :value="modelValue" @input="updateContent" />
</div>
</template>
<script setup>
const props = defineProps({
title: String,
modelValue: String
})
const emit = defineEmits(['update:title', 'update:modelValue'])
const updateTitle = (event) => {
emit('update:title', event.target.value)
}
const updateContent = (event) => {
emit('update:modelValue', event.target.value)
}
</script>
进入全屏模式 退出全屏模式
在上面的示例中,我为一个 v-model 指令使用了自定义道具名称和自定义事件名称。
对于另一个,我将使用默认名称。但是,如果需要,您可以为它们设置自定义名称。
您只需要记住,在您的事件名称中,您将添加带有前缀 update: 的道具名称。
<!-- App.vue component -->
<template>
<base-input v-model="content" v-model:title="postTitle"></base-input>
</template>
进入全屏模式 退出全屏模式
当你使用 BaseInput.vue 组件时,你必须同时提到两个 v-model 指令。
在这种情况下,您将使用一个 v-model 附加自定义道具名称。对于默认名称,您无需添加任何内容。
结论
我已经向您展示了将 v-model 指令应用于 Vue 3 组件的最佳方法。您已学会使用选项 API、组合 API 和 SFC 脚本设置来执行此操作。
无论您遵循什么语法来创建组件,现在我们都可以在 Vue 3 项目中使用 v-model 来构建组件。
更多推荐
所有评论(0)