vue.js - 如何在 Vue 2 中创建具有验证功能的 VForm 组件,如 Vuetify?
问题描述
在 Vuetify 中,您可以设置如下代码,VForm
组件可以自动检查其中的所有输入VForm
是否有效,而无需来回传递任何道具。如何在 Vue 2 中为我自己的表单和输入组件实现此功能?
<template>
<v-form v-model="formIsValid">
<v-text-field :rules="[required]"></v-text-field>
</v-form>
</template>
<script>
data() {
return {
formIsValid: false
}
},
methods: {
required(val) {
return !!val || 'Required.'
}
}
</script>
解决方案
您可以探索 vuetify 源代码以了解他们是如何做到这一点的。
首先,你要了解提供/注入,https:
//vuejs.org/v2/api/#provide-inject 他们的概念非常简化的版本如下所示,
VForm.vue
export default {
data() {
return {
inputs: []
}
},
provide () {
// provide this Form component for child, so child can register itself
return { form: this }
},
methods: {
register(input) {
this.inputs.push(input);
},
validate() {
// loop through child registered inputs,
// run every child.validate() to validate all child
this.inputs.forEach(input => {
input.validate();
});
}
}
}
VInput.vue
export default {
props: {
rules: {
default: () => [],
type: Array
}
},
// inject parent VForm component
inject: ['form'],
created() {
// with inject above, you can use this.form to reference parent VForm
this.form.register(this);
},
methods: {
validate() {
// use rules to validate input
}
}
}
使用
v-form 提供的任何东西都可以在 v-input 中与注入一起使用。
<template>
<v-form>
<v-input :rules="rules"/>
<v-form/>
</template>
大部分逻辑都在这些文件中,而 vuetify 所做的远比上面的逻辑要多。学习研究开源代码,开源项目很棒。
- VForm:https ://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VForm/VForm.ts
- VForm 使用的可注册 mixin: https ://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/mixins/registrable/index.ts
- VInput:https ://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/components/VInput/VInput.ts
- VInput 使用的可验证 mixin:https ://github.com/vuetifyjs/vuetify/blob/master/packages/vuetify/src/mixins/validatable/index.ts
推荐阅读
- azure-iot-hub - 丰富设备生命周期事件 Azure IoT 中心
- c++ - 如何在 Vulkan 中跨多个计算队列执行并行计算着色器?
- python - 滑动窗口最大值超出时间限制(采访位)
- excel - 如何在 Google 电子表格的另一张纸上导入具有匹配值的行?
- python - 如何根据条件获取列的百分比?Python
- bash - 如何在 Bash 中解析 List 数据类型
- python - 有没有办法等待从当前脚本调用的另一个 python 脚本(使用 subprocess.Propen())直到它完成?
- android - Flutter RawKeyboardListener Buggy
- wordpress - 使用插件替换默认的 woocommerce 类别视图
- file-upload - 上传文件时的编码问题(HTML / Javascript)