最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue3中form表單層級(jí)嵌套問題的解決詳解

 更新時(shí)間:2025年05月20日 09:03:32   作者:拉不動(dòng)的豬  
這篇文章主要為大家詳細(xì)介紹了vue3中form表單層級(jí)嵌套問題的相關(guān)解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

先上代碼

parent.vue

<script setup>
import { ref, reactive } from "vue";
import TaskList from "./ChildForm.vue";

const formRef = ref();
const formData = reactive({
  projectName: "",
  manager: "",
  tasks: [],
});

const rules = reactive({
  projectName: [
    { required: true, message: "項(xiàng)目名稱不能為空", trigger: "blur" },
    { min: 3, max: 50, message: "長度在3到50個(gè)字符", trigger: "blur" },
  ],
  manager: [{ required: true, message: "負(fù)責(zé)人不能為空", trigger: "change" }],
});

const validateTasks = (rule, value, callback) => {
  if (formData.tasks.length === 0) {
    callback(new Error("至少需要添加一個(gè)任務(wù)"));
  } else {
    callback();
  }
};

const submit = () => {
  formRef.value.validate((valid) => {
    if (valid) {
      console.log("提交數(shù)據(jù):", formData);
    }
  });
};
</script>

<template>
  <el-form ref="formRef" :model="formData" :rules="rules" label-width="120px">
    <el-form-item label="項(xiàng)目名稱" prop="projectName">
      <el-input v-model="formData.projectName" />
    </el-form-item>

    <el-form-item label="負(fù)責(zé)人" prop="manager">
      <el-select v-model="formData.manager">
        <el-option label="張三" value="zhangsan" />
        <el-option label="李四" value="lisi" />
      </el-select>
    </el-form-item>

    <el-form-item prop="tasks" :rules="[{ validator: validateTasks }]">
      <TaskList v-model="formData.tasks" />
    </el-form-item>

    <el-button type="primary" @click="submit">提交</el-button>
  </el-form>
</template>

child.vue

<script setup>
import { ref, computed, reactive } from "vue";

const props = defineProps({
  modelValue: {
    type: Array,
    default: () => [],
  },
});

const emit = defineEmits(["update:modelValue"]);

const taskRules = reactive({
  name: [{ required: true, message: "任務(wù)名稱不能為空", trigger: "blur" }],
  priority: [{ required: true, message: "請選擇優(yōu)先級(jí)", trigger: "change" }],
});

const tasks = computed({
  get: () => props.modelValue,
  set: (value) => emit("update:modelValue", value),
});

const addTask = () => {
  tasks.value.push({ name: "", priority: "medium" });
};

const removeTask = (index) => {
  tasks.value.splice(index, 1);
};
</script>

<template>
  <div class="task-list">
    <el-button @click="addTask">添加任務(wù)</el-button>

    <el-form
      v-for="(task, index) in tasks"
      :key="index"
      :model="task"
      :rules="taskRules"
      class="task-form"
    >
      <el-form-item prop="name">
        <el-input v-model="task.name" placeholder="任務(wù)名稱" />
      </el-form-item>

      <el-form-item prop="priority">
        <el-select v-model="task.priority">
          <el-option label="高" value="high" />
          <el-option label="中" value="medium" />
          <el-option label="低" value="low" />
        </el-select>
      </el-form-item>

      <el-button @click="removeTask(index)">刪除</el-button>
    </el-form>
  </div>
</template>

<style scoped>
.task-form {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 10px;
}
</style>

效果如下:

一、組件結(jié)構(gòu)設(shè)計(jì)原理

1.數(shù)據(jù)流向設(shè)計(jì)

父組件通過v-model實(shí)現(xiàn)數(shù)據(jù)雙向綁定:

// ProjectForm.vue
const formData = reactive({
  tasks: [] // 自動(dòng)同步到子組件
})

// TaskList.vue
const tasks = computed({
  get: () => props.modelValue,
  set: (v) => emit('update:modelValue', v)
})

2. 驗(yàn)證責(zé)任劃分

  • 父組件:驗(yàn)證任務(wù)列表非空
  • 子組件:驗(yàn)證單個(gè)任務(wù)字段

二、分步實(shí)現(xiàn)流程

步驟1:父組件基礎(chǔ)驗(yàn)證

// ProjectForm.vue
const validateTasks = (_, __, callback) => {
  formData.tasks.length === 0 
    ? callback(new Error('至少需要1個(gè)任務(wù)')) 
    : callback()
}

步驟2:子組件獨(dú)立驗(yàn)證

// TaskList.vue
const taskRules = {
  name: { 
    required: true, 
    trigger: 'blur',
    message: '任務(wù)名稱必填' 
  }
}

步驟3:動(dòng)態(tài)prop綁定

<el-form-item 
  :prop="`tasks[${index}].name`"
  :rules="taskRules.name">
  <el-input v-model="item.name"/>
</el-form-item>

三、驗(yàn)證聯(lián)動(dòng)機(jī)制

1.提交時(shí)聯(lián)合驗(yàn)證

// ProjectForm.vue
const submit = () => {
  formRef.value.validate().then(() => {
    taskListRef.value.validate().then(() => {
      // 全部驗(yàn)證通過
    })
  })
}

2. 實(shí)時(shí)錯(cuò)誤反饋

// TaskList.vue
watch(() => props.modelValue, () => {
  formRef.value?.validate()
}, { deep: true })

四、異常處理方案

// 統(tǒng)一錯(cuò)誤捕獲
try {
  await Promise.all([
    formRef.value.validate(),
    taskListRef.value.validate()
  ])
} catch (errors) {
  console.error('驗(yàn)證失敗:', errors)
}

到此這篇關(guān)于vue3中form表單層級(jí)嵌套問題的解決詳解的文章就介紹到這了,更多相關(guān)vue3 form表單嵌套內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中插槽slot的用法詳解

    Vue中插槽slot的用法詳解

    插槽(Slot)是Vue.js中一個(gè)非常重要的概念,它極大地提高了組件的復(fù)用性和靈活性,通過插槽,我們可以自定義組件的內(nèi)容,使其能夠適應(yīng)不同的場景,本文將結(jié)合實(shí)際案例,詳細(xì)介紹Vue中插槽的基本用法、類型以及高級(jí)技巧,需要的朋友可以參考下
    2024-11-11
  • Vue中使用JsonView來展示Json樹的實(shí)例代碼

    Vue中使用JsonView來展示Json樹的實(shí)例代碼

    這篇文章主要介紹了Vue之使用JsonView來展示Json樹的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • vue3使用reactive賦值后頁面不改變

    vue3使用reactive賦值后頁面不改變

    本文主要介紹了vue3使用reactive賦值后頁面不改變,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Vue2+Elementui?Dialog實(shí)現(xiàn)封裝自定義彈窗組件

    Vue2+Elementui?Dialog實(shí)現(xiàn)封裝自定義彈窗組件

    在日常的管理系統(tǒng)界面中,我們寫的最多的除了列表表格之外,就是各種彈窗組件,本文就來為大家詳細(xì)介紹一下Vue2如何結(jié)合Elementui?Dialog實(shí)現(xiàn)封裝自定義彈窗組件,希望對大家有所幫助
    2023-12-12
  • Vue折疊面板組件的封裝

    Vue折疊面板組件的封裝

    這篇文章主要為大家詳細(xì)介紹了Vue折疊面板組件的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue組件打包并發(fā)布到npm的全過程

    vue組件打包并發(fā)布到npm的全過程

    這篇文章主要介紹了vue組件打包并發(fā)布到npm的全過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • VUE Token的失效處理詳解

    VUE Token的失效處理詳解

    這篇文章主要為大家介紹了VUE Token的失效處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • Vue中通過Vue.extend動(dòng)態(tài)創(chuàng)建實(shí)例的方法

    Vue中通過Vue.extend動(dòng)態(tài)創(chuàng)建實(shí)例的方法

    這篇文章主要介紹了Vue中通過Vue.extend動(dòng)態(tài)創(chuàng)建實(shí)例的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 手把手教你如何運(yùn)行一個(gè)前端uniapp項(xiàng)目

    手把手教你如何運(yùn)行一個(gè)前端uniapp項(xiàng)目

    這篇文章主要介紹了如何設(shè)置和運(yùn)行一個(gè)基于uni-app框架的項(xiàng)目,包括安裝必要的軟件、克隆項(xiàng)目并安裝依賴,以及如何使用HBuilderX進(jìn)行項(xiàng)目運(yùn)行和調(diào)試,需要的朋友可以參考下
    2025-01-01
  • vue下載excel文件的四種方法實(shí)例

    vue下載excel文件的四種方法實(shí)例

    最近vue項(xiàng)目中遇到了需求,客戶端需要實(shí)現(xiàn)以excel表格形式下載數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于vue下載excel文件的四種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06

最新評論

乐清市| 吉首市| 弋阳县| 读书| 溧阳市| 乌拉特前旗| 东乡族自治县| 夏河县| 乾安县| 金溪县| 洛宁县| 吴江市| 雷波县| 河津市| 牡丹江市| 垫江县| 沙湾县| 石景山区| 论坛| 南安市| 寿光市| 田东县| 咸阳市| 上高县| 社会| 桑日县| 南京市| 民乐县| 陇南市| 皋兰县| 仪征市| 邢台县| 陵川县| 阳江市| 崇仁县| 蒲城县| 资阳市| 高要市| 临沂市| 伊吾县| 浏阳市|