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

vue3中form表單層級嵌套問題的解決詳解

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

先上代碼

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: "項目名稱不能為空", trigger: "blur" },
    { min: 3, max: 50, message: "長度在3到50個字符", trigger: "blur" },
  ],
  manager: [{ required: true, message: "負責人不能為空", trigger: "change" }],
});

const validateTasks = (rule, value, callback) => {
  if (formData.tasks.length === 0) {
    callback(new Error("至少需要添加一個任務"));
  } 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="項目名稱" prop="projectName">
      <el-input v-model="formData.projectName" />
    </el-form-item>

    <el-form-item label="負責人" 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: "任務名稱不能為空", trigger: "blur" }],
  priority: [{ required: true, message: "請選擇優(yōu)先級", 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">添加任務</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="任務名稱" />
      </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>

效果如下:

一、組件結構設計原理

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

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

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

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

2. 驗證責任劃分

  • 父組件:驗證任務列表非空
  • 子組件:驗證單個任務字段

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

步驟1:父組件基礎驗證

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

步驟2:子組件獨立驗證

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

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

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

三、驗證聯(lián)動機制

1.提交時聯(lián)合驗證

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

2. 實時錯誤反饋

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

四、異常處理方案

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

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

相關文章

  • Vue中插槽slot的用法詳解

    Vue中插槽slot的用法詳解

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

    Vue中使用JsonView來展示Json樹的實例代碼

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

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

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

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

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

    Vue折疊面板組件的封裝

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

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

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

    VUE Token的失效處理詳解

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

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

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

    手把手教你如何運行一個前端uniapp項目

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

    vue下載excel文件的四種方法實例

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

最新評論

永春县| 池州市| 灵寿县| 通海县| 萝北县| 武穴市| 昌图县| 东丰县| 平谷区| 尉犁县| 敖汉旗| 五大连池市| 林周县| 深泽县| 皮山县| 日土县| 玉龙| 广德县| 邯郸市| 澄迈县| 明水县| 太保市| 宣汉县| 敖汉旗| 贡山| 平顶山市| 依兰县| 外汇| 周至县| 灵璧县| 青海省| 信丰县| 宁夏| 华亭县| 基隆市| 吴江市| 衡东县| 繁峙县| 宁武县| 枣庄市| 芷江|