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來(lái)管理表單數(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ù),通過(guò)后端接口獲取。loadStreets: 異步加載街道列表的方法,支持搜索功能。handleLocationTypeChange: 處理地點(diǎn)類型變化的方法,清空街道選擇數(shù)據(jù)。handleDistrictChange: 處理省市區(qū)選擇變化的方法,可以根據(jù)選擇的省市區(qū)加載對(duì)應(yīng)的街道數(shù)據(jù)。submitForm: 提交表單的方法,包括表單驗(yàn)證和實(shí)際數(shù)據(jù)提交到后端接口。
3. 數(shù)據(jù)加載和提交
確保通過(guò)axios調(diào)用后端接口來(lái)獲取省市區(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)文章希望大家以后多多支持腳本之家!
- Vue Echarts渲染數(shù)據(jù)導(dǎo)致殘留臟數(shù)據(jù)的問(wèn)題處理
- vue2.0中自適應(yīng)echarts圖表、全屏插件screenfull的使用
- Vue3+TS項(xiàng)目中eslint、prettier安裝配置詳細(xì)指南
- vue3中el-uplod結(jié)合ts實(shí)現(xiàn)圖片粘貼上傳
- Vue3 Echarts通用的折線圖帶陰影效果實(shí)現(xiàn)
- 在導(dǎo)入.vue文件的時(shí)候,ts報(bào)錯(cuò)提示:找不到模塊“@/Layout/index.vue”或其相應(yīng)的類型聲明問(wèn)題
相關(guān)文章
Vue-drag-resize 拖拽縮放插件的使用(簡(jiǎn)單示例)
本文通過(guò)代碼給大家介紹了Vue-drag-resize 拖拽縮放插件使用簡(jiǎn)單示例,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
關(guān)于Vue中img動(dòng)態(tài)拼接src圖片地址的問(wèn)題
這篇文章主要介紹了關(guān)于Vue中img動(dòng)態(tài)拼接src圖片地址的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
vue 解決setTimeOut和setInterval函數(shù)無(wú)效報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了vue 解決setTimeOut和setInterval函數(shù)無(wú)效報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
vue中l(wèi)et that=this的作用及說(shuō)明
這篇文章主要介紹了vue中l(wèi)et that=this的作用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
vue打印插件vue-print-nb的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue打印插件vue-print-nb的實(shí)現(xiàn),需要引入插件npm install vue-print-nb --save,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
vue實(shí)現(xiàn)移動(dòng)端H5數(shù)字鍵盤組件使用詳解
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端H5數(shù)字鍵盤組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08

