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

vue3+ts實(shí)現(xiàn)一個表單組件的詳細(xì)代碼

 更新時間:2024年07月12日 10:50:06   作者:溫暖前端  
這篇文章主要介紹了vue3+ts實(shí)現(xiàn)一個表單組件的詳細(xì)代碼,確保通過axios調(diào)用后端接口來獲取省市區(qū)和街道數(shù)據(jù),并在選擇省市區(qū)時加載相應(yīng)的街道數(shù)據(jù),需要的朋友可以參考下

1. 創(chuàng)建表單組件

首先,創(chuàng)建一個表單組件,包括姓名、手機(jī)號、年齡、學(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ī)號" 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ū)"
          ></el-cascader>
        </div>
        <div v-else-if="locationType === 'street'">
          <!-- 展示街道多選組件 -->
          <el-select
            v-model="formData.street"
            multiple
            filterable
            remote
            reserve-keyword
            :remote-method="loadStreets"
            placeholder="請輸入街道名稱"
          ></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: '請輸入姓名', trigger: 'blur' }],
  phone: [
    { required: true, message: '請輸入手機(jī)號', trigger: 'blur' },
    { pattern: /^1[3-9]\d{9}$/, message: '請輸入正確的手機(jī)號', trigger: 'blur' },
  ],
  age: [
    { required: true, message: '請輸入年齡', trigger: 'blur' },
    { type: 'number', min: 1, max: 150, message: '請輸入1-150之間的數(shù)字', trigger: 'blur' },
  ],
  school: [{ required: true, message: '請輸入學(xué)校名稱', trigger: 'blur' }],
  gender: [{ required: true, message: '請選擇性別', trigger: 'change' }],
  district: [{ required: true, message: '請選擇省市區(qū)', trigger: 'change' }],
  street: [{ required: true, message: '請選擇街道', 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ù)對象,包括姓名、手機(jī)號、年齡、學(xué)校、性別、省市區(qū)、街道等字段。
  • formRules: 表單驗(yàn)證規(guī)則,確保必填字段不能為空且格式正確。
  • locationType: 控制顯示省市區(qū)選擇還是街道選擇的組件。
  • districtOptions: 省市區(qū)選項(xiàng)數(shù)據(jù),通過后端接口獲取。
  • loadStreets: 異步加載街道列表的方法,支持搜索功能。
  • handleLocationTypeChange: 處理地點(diǎn)類型變化的方法,清空街道選擇數(shù)據(jù)。
  • handleDistrictChange: 處理省市區(qū)選擇變化的方法,可以根據(jù)選擇的省市區(qū)加載對應(yīng)的街道數(shù)據(jù)。
  • submitForm: 提交表單的方法,包括表單驗(yàn)證和實(shí)際數(shù)據(jù)提交到后端接口。

3. 數(shù)據(jù)加載和提交

確保通過axios調(diào)用后端接口來獲取省市區(qū)和街道數(shù)據(jù),并在選擇省市區(qū)時加載相應(yīng)的街道數(shù)據(jù)。在提交表單時,將表單數(shù)據(jù)以JSON格式發(fā)送到后端處理。

到此這篇關(guān)于vue3+ts實(shí)現(xiàn)一個表單組件的文章就介紹到這了,更多相關(guān)vue3 ts表單組件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決Vue的組件屬性this不存在問題

    解決Vue的組件屬性this不存在問題

    這篇文章主要介紹了解決Vue的組件屬性this不存在問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Vue-drag-resize 拖拽縮放插件的使用(簡單示例)

    Vue-drag-resize 拖拽縮放插件的使用(簡單示例)

    本文通過代碼給大家介紹了Vue-drag-resize 拖拽縮放插件使用簡單示例,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • vue2.0 自定義日期時間過濾器

    vue2.0 自定義日期時間過濾器

    本文給大家?guī)韮煞N方法實(shí)現(xiàn)vue2.0 自定義日期時間過濾器,需要的的朋友參考下吧
    2017-06-06
  • vue.js基于ElementUI封裝了CRUD的彈框組件

    vue.js基于ElementUI封裝了CRUD的彈框組件

    這篇文章主要介紹了vue.js基于ElementUI封裝了CRUD的彈框組件,問咋會給你圍繞主題展開詳細(xì)的內(nèi)容介紹,感興趣的小伙伴可以參考一下
    2022-07-07
  • vue攔截器及請求封裝代碼

    vue攔截器及請求封裝代碼

    這篇文章主要介紹了vue攔截器及請求封裝代碼,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關(guān)于Vue中img動態(tài)拼接src圖片地址的問題

    關(guān)于Vue中img動態(tài)拼接src圖片地址的問題

    這篇文章主要介紹了關(guān)于Vue中img動態(tài)拼接src圖片地址的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • vue 解決setTimeOut和setInterval函數(shù)無效報(bào)錯的問題

    vue 解決setTimeOut和setInterval函數(shù)無效報(bào)錯的問題

    這篇文章主要介紹了vue 解決setTimeOut和setInterval函數(shù)無效報(bào)錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue中l(wèi)et that=this的作用及說明

    vue中l(wèi)et that=this的作用及說明

    這篇文章主要介紹了vue中l(wèi)et that=this的作用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue打印插件vue-print-nb的實(shí)現(xiàn)代碼

    vue打印插件vue-print-nb的實(shí)現(xiàn)代碼

    這篇文章主要介紹了vue打印插件vue-print-nb的實(shí)現(xiàn),需要引入插件npm install vue-print-nb --save,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • vue實(shí)現(xiàn)移動端H5數(shù)字鍵盤組件使用詳解

    vue實(shí)現(xiàn)移動端H5數(shù)字鍵盤組件使用詳解

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動端H5數(shù)字鍵盤組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08

最新評論

堆龙德庆县| 宾阳县| 永年县| 高淳县| 嵩明县| 定远县| 陆河县| 遵化市| 华池县| 彩票| 弥勒县| 澄江县| 瑞丽市| 彩票| 巧家县| 博白县| 墨竹工卡县| 井研县| 岳阳市| 开平市| 玉山县| 四川省| 松溪县| 怀柔区| 宜宾市| 扶余县| 赞皇县| 文登市| 霍林郭勒市| 宣城市| 门头沟区| 开江县| 广西| 宁阳县| 阳朔县| 临城县| 卓尼县| 崇州市| 丰原市| 额尔古纳市| 金川县|