当前位置: 首页 > 知识库问答 >
问题:

vue3,封装一个很长的表单,数据如何双向绑定?

黄弘深
2023-11-01

我有一个很长的表单A,内容固定,如下。

A.vue<Form>    <Select v-model='form.a'/>    <Input v-model='form.b'/>    <Select v-model='form.c'/>    <Input v-model='form.d'/>    <DatePicker v-model='form.e'/>    ………………………………</Form>

A在项目内非常多的地方使用,A1,A2,A3的内部数据独立不用同步。
但是每个使用A的地方都会因为父组件的某些事件而改动A的内部参数。

<template>  <A v-model="formData"></A></template><script setup>  const formData = ref({a,b,c,d...})  await res = ajax()  formData.a = res.a</script>

请问这种情况有无办法使formData双向绑定?

现在我的实现方法是

<template>  <Form>    <Select v-model='form.a'/>    <Input v-model='form.b'/>    <Select v-model='form.c'/>    <Input v-model='form.d'/>    <DatePicker v-model='form.e'/>    ………………………………  </Form><template><script setup>const form = computed(() => {  return props.modelValue})<script>

但是这样违背了单项数据流的原则。所以请问有更好的办法吗?

共有2个答案

梁丘兴腾
2023-11-01

子组件:

<template>  <Form>    <Select :model-value="form.a" @update:model-value="updateForm('a', $event)"/>    <Input :model-value="form.b" @update:model-value="updateForm('b', $event)"/>    <Select :model-value="form.c" @update:model-value="updateForm('c', $event)"/>    <!-- 其他字段类似处理 -->  </Form></template><script setup>import { ref, toRefs } from 'vue';const props = defineProps({  modelValue: Object});const emit = defineEmits();const form = ref({ ...props.modelValue }); // 初始化 form 数据const updateForm = (key, value) => {  form[key] = value;  emit('update:modelValue', { ...form });}</script>

父组件:

<template>  <A v-model="formData"></A></template><script setup>import { ref } from 'vue';const formData = ref({a: '', b: '', c: '', d: '', e: ''}); // 初始化数据watchEffect(async () => {  const res = await ajax();  formData.a = res.a;  // ... 其他字段更新});</script>
东方富
2023-11-01

在这种情况下,您可以使用 Vue 3 的 reactivecomputed 函数,以及 watchEffect 函数来实现双向数据绑定。具体来说,您可以将表单数据封装在一个 reactive 对象中,然后将这个对象传递给组件作为属性。然后,您可以使用 watchEffect 函数来监听这个 reactive 对象的变化,并触发相应的行为。

以下是一个示例:

<template>  <Form :model="formData">    <!-- form fields go here -->  </Form></template><script setup>import { ref, watchEffect } from 'vue';const formData = ref({});watchEffect((onInvalidate) => {  onInvalidate(() => {    // handle your validation here, based on formData  });});</script>

在上面的示例中,formData 是一个 reactive 对象,它包含表单的所有字段。然后,我们将 formData 作为属性传递给 Form 组件,并使用 v-model 指令将其与表单字段进行双向绑定。

另外,如果您需要处理一些依赖于表单数据的变化,您可以使用 watchEffect 函数来监听 formData 的变化。在上面的示例中,我们使用 watchEffect 来监听 formData 的变化,并在每次变化时执行一些操作(例如进行表单验证)。

 类似资料:
  • 1. 前言 本小节我们将介绍 Vue 中数据的双向绑定指令 v-model。v-model 的学习相对简单 我们可以用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素。它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理。 2. 慕课解释 用 v-model 指令在表单 、 及 元素上创建双向数据绑定。它会根据控件类型自动选

  • 我有一个模型: 我用片段布局连接它: 在onCreateView方法的片段类中: 我可以从fragment或ViewModel类中更改值,但是当我试图在Logcat中的ViewModel的方法中获取值时,我得到的消息是:我缺少了什么,这样双向数据绑定也可以从另一个方向工作?简而言之,数据在界面上从ViewModel/Fragment流向EditText,但不会从界面上的EditText流向View

  • 本文向大家介绍使用Vue如何写一个双向数据绑定(面试常见),包括了使用Vue如何写一个双向数据绑定(面试常见)的使用技巧和注意事项,需要的朋友参考一下 1、原理 Vue的双向数据绑定的原理相信大家也都十分了解了,主要是通过 Object对象的defineProperty属性,重写data的set和get函数来实现的,这里对原理不做过多描述,主要还是来实现一个实例。为了使代码更加的清晰,这里只会实现

  • 出于好奇和增加知识,我想在dom元素和javascript变量之间实现某种双向数据绑定。 我很幸运,在这里@stackoverflow找到了一个很好的答案,解决了我一半的问题,这就引出了这个要点https://gist.github.com/384583,但我仍然无法100%完成这件事。 下面是我的代码示例:http://jsfiddle.net/bpH6Z/ 如果您尝试运行fiddle并单击“查

  • 本文向大家介绍实现非常简单的js双向数据绑定,包括了实现非常简单的js双向数据绑定的使用技巧和注意事项,需要的朋友参考一下 双向数据绑定指的就是,绑定对象属性的改变到用户界面的变化的能力,反之亦然。换种说法,如果我们有一个user对象和一个name属性,一旦我们赋了一个新值给user.name,在UI上就会显示新的姓名了。同样地,如果UI包含了一个输入用户姓名的输入框,输入一个新值就应该会使use

  • 本文向大家介绍Nuxt.js 数据双向绑定的实现,包括了Nuxt.js 数据双向绑定的实现的使用技巧和注意事项,需要的朋友参考一下 假定我们有一个需求,一开始通过mounted()将一个字符串渲染在页面上,但是我们经过操作后修改了数据并且需要将得到的结果重新异步渲染到页面中去,而不是跳转刷新页面来重新渲染 首先模板中data()中定义数据,并且要将定义的数据显示出来 然后我们通过methods里的