vue3+ts實(shí)現(xiàn)一個(gè)表單組件的詳細(xì)代碼
1. 創(chuàng)建表單組件
首先,創(chuàng)建一個(gè)表單組件,包括姓名、手機(jī)號(hào)、年齡、學(xué)校、性別等基本信息的輸入框,并添加省市區(qū)和街道地點(diǎn)的選擇功能。
<template> <form @submit.prevent="submitForm"> <el-form :model="formData" :rules="formRules" ref="formData" label-width="100px"> <el-form-item label="姓名" prop="name"> <el-input v-model="formData.name"></el-input> </el-form-item> <el-form-item label="手機(jī)號(hào)" prop="phone"> <el-input v-model="formData.phone"></el-input> </el-form-item> <el-form-item label="年齡" prop="age"> <el-input v-model.number="formData.age"></el-input> </el-form-item> <el-form-item label="學(xué)校" prop="school"> <el-input v-model="formData.school"></el-input> </el-form-item> <el-form-item label="性別" prop="gender"> <el-radio-group v-model="formData.gender"> <el-radio label="male">男</el-radio> <el-radio label="female">女</el-radio> </el-radio-group> </el-form-item> <el-form-item label="地點(diǎn)" prop="location"> <el-radio-group v-model="locationType"> <el-radio :label="'district'" @change="handleLocationTypeChange">省市區(qū)</el-radio> <el-radio :label="'street'" @change="handleLocationTypeChange">街道</el-radio> </el-radio-group> <div v-if="locationType === 'district'"> <!-- 展示省市區(qū)組件 --> <el-cascader v-model="formData.district" :options="districtOptions" @change="handleDistrictChange" placeholder="請(qǐng)選擇省市區(qū)" ></el-cascader> </div> <div v-else-if="locationType === 'street'"> <!-- 展示街道多選組件 --> <el-select v-model="formData.street" multiple filterable remote reserve-keyword :remote-method="loadStreets" placeholder="請(qǐng)輸入街道名稱" ></el-select> </div> </el-form-item> <el-form-item> <el-button type="primary" native-type="submit">提交</el-button> </el-form-item> </el-form> </form> </template> <script setup lang="ts"> import { ref } from 'vue'; import axios from 'axios'; const formData = ref({ name: '', phone: '', age: undefined, school: '', gender: 'male', // 默認(rèn)選項(xiàng) district: [], // 省市區(qū)選擇結(jié)果 street: [], // 街道選擇結(jié)果(多選) }); const formRules = ref({ name: [{ required: true, message: '請(qǐng)輸入姓名', trigger: 'blur' }], phone: [ { required: true, message: '請(qǐng)輸入手機(jī)號(hào)', trigger: 'blur' }, { pattern: /^1[3-9]\d{9}$/, message: '請(qǐng)輸入正確的手機(jī)號(hào)', trigger: 'blur' }, ], age: [ { required: true, message: '請(qǐng)輸入年齡', trigger: 'blur' }, { type: 'number', min: 1, max: 150, message: '請(qǐng)輸入1-150之間的數(shù)字', trigger: 'blur' }, ], school: [{ required: true, message: '請(qǐng)輸入學(xué)校名稱', trigger: 'blur' }], gender: [{ required: true, message: '請(qǐng)選擇性別', trigger: 'change' }], district: [{ required: true, message: '請(qǐng)選擇省市區(qū)', trigger: 'change' }], street: [{ required: true, message: '請(qǐng)選擇街道', trigger: 'change' }], }); const locationType = ref('district'); // 默認(rèn)選擇省市區(qū) const districtOptions = ref([]); // 省市區(qū)選項(xiàng) // 加載街道列表 const loadStreets = async (query: string) => { try { const response = await axios.get(`/api/streets?query=${query}`); return response.data.streets.map((street: any) => ({ label: street.name, value: street.id, })); } catch (error) { console.error('Error loading streets:', error); return []; } }; // 處理地點(diǎn)類型變化 const handleLocationTypeChange = () => { // 清空之前選擇的值 formData.street = []; }; // 處理省市區(qū)選擇變化 const handleDistrictChange = () => { // 根據(jù)選擇的省市區(qū)加載街道數(shù)據(jù)(這里可以根據(jù)實(shí)際需求進(jìn)行調(diào)整) }; // 提交表單 const submitForm = async () => { try { await $refs.formData.validate(); if (formData.value.locationType === 'district') { // 處理省市區(qū)數(shù)據(jù) } else if (formData.value.locationType === 'street') { // 處理街道數(shù)據(jù) } // 提交表單邏輯,例如調(diào)用后端接口 console.log('Form data:', formData.value); // 使用 axios 發(fā)送表單數(shù)據(jù)到后端 await axios.post('/api/submit', formData.value); } catch (error) { console.error('Submit error:', error); } }; </script>
2. 實(shí)現(xiàn)數(shù)據(jù)加載和交互邏輯
在上述代碼中,使用了Vue 3的Composition API結(jié)合TypeScript來管理表單數(shù)據(jù)、驗(yàn)證規(guī)則、組件交互等。
formData
: 表單數(shù)據(jù)對(duì)象,包括姓名、手機(jī)號(hào)、年齡、學(xué)校、性別、省市區(qū)、街道等字段。formRules
: 表單驗(yàn)證規(guī)則,確保必填字段不能為空且格式正確。locationType
: 控制顯示省市區(qū)選擇還是街道選擇的組件。districtOptions
: 省市區(qū)選項(xiàng)數(shù)據(jù),通過后端接口獲取。loadStreets
: 異步加載街道列表的方法,支持搜索功能。handleLocationTypeChange
: 處理地點(diǎn)類型變化的方法,清空街道選擇數(shù)據(jù)。handleDistrictChange
: 處理省市區(qū)選擇變化的方法,可以根據(jù)選擇的省市區(qū)加載對(duì)應(yīng)的街道數(shù)據(jù)。submitForm
: 提交表單的方法,包括表單驗(yàn)證和實(shí)際數(shù)據(jù)提交到后端接口。
3. 數(shù)據(jù)加載和提交
確保通過axios調(diào)用后端接口來獲取省市區(qū)和街道數(shù)據(jù),并在選擇省市區(qū)時(shí)加載相應(yīng)的街道數(shù)據(jù)。在提交表單時(shí),將表單數(shù)據(jù)以JSON格式發(fā)送到后端處理。
到此這篇關(guān)于vue3+ts實(shí)現(xiàn)一個(gè)表單組件的文章就介紹到這了,更多相關(guān)vue3 ts表單組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目打包發(fā)布到Nginx后無法訪問后端接口的解決辦法
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目打包發(fā)布到Nginx后無法訪問后端接口的解決辦法,記錄一下項(xiàng)目需要注意的地方,方便以后快速使用,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04vue+element_ui上傳文件,并傳遞額外參數(shù)操作
這篇文章主要介紹了vue+element_ui上傳文件,并傳遞額外參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12基于vue監(jiān)聽滾動(dòng)事件實(shí)現(xiàn)錨點(diǎn)鏈接平滑滾動(dòng)的方法
本篇文章主要介紹了基于vue監(jiān)聽滾動(dòng)事件實(shí)現(xiàn)錨點(diǎn)鏈接平滑滾動(dòng)的方法,非常具有實(shí)用價(jià)值,有興趣的可以了解一下2018-01-01淺談vue,angular,react數(shù)據(jù)雙向綁定原理分析
本篇文章主要介紹了淺談vue,angular,react數(shù)據(jù)雙向綁定原理分析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11VUE.CLI4.0配置多頁面入口的實(shí)現(xiàn)
這篇文章主要介紹了VUE.CLI4.0配置多頁面入口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Vue替代vuex的存儲(chǔ)庫Pinia詳細(xì)介紹
這篇文章主要介紹了Vue替代vuex的存儲(chǔ)庫Pinia,聽說pinia與vue3更配,便開啟了vue3的學(xué)習(xí)之路,pinia 和 vuex 具有相同的功效, 是 Vue 的存儲(chǔ)庫,它允許您跨組件/頁面共享狀態(tài)2022-09-09