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

vue element封裝form表單的實(shí)現(xiàn)

 更新時(shí)間:2023年06月15日 10:13:56   作者:山水有輕音  
本文主要介紹了vue element封裝form表單的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、新建FormComponent.vue

1.梳理思路,form表單有各種類型,常見(jiàn)的有input、select,radio,checkbox,time,date,date-picker,textarea,rate等

<template>
? <el-form ref="form" :model="formData" label-width="80px">
? ? <el-form-item
? ? ? v-for="item in formList"
? ? ? :key="item.prop"
? ? ? :label="item.label"
? ? ? :prop="item.prop"
? ? >
? ? ? <div class="form-item-container">
? ? ? ? <template v-if="item.prefix">
? ? ? ? ? <span class="prefix">{{ item.prefix }}</span> ?--前置單位
? ? ? ? </template>
? ? ? ? <template v-if="item.type === 'input'">
? ? ? ? ? <el-input
? ? ? ? ? ? v-model="formData[item.prop]"
? ? ? ? ? ? :placeholder="item.placeholder"
? ? ? ? ? ? :clearable="item.clearable"
? ? ? ? ? ? :maxlength="item.maxlength"
? ? ? ? ? ? @change="handleChange(item.prop, formData[item.prop])"
? ? ? ? ? />
? ? ? ? </template>
? ? ? ? <template v-if="item.type === 'textarea'">
? ? ? ? ? <el-input
? ? ? ? ? ? type="textarea"
? ? ? ? ? ? v-model="formData[item.prop]"
? ? ? ? ? ? :placeholder="item.placeholder"
? ? ? ? ? ? :clearable="item.clearable"
? ? ? ? ? ? :maxlength="item.maxlength"
? ? ? ? ? ? @change="handleChange(item.prop, formData[item.prop])"
? ? ? ? ? />
? ? ? ? </template>
? ? ? ? <template v-if="item.type === 'select'">
? ? ? ? ? <el-select
? ? ? ? ? ? v-model="formData[item.prop]"
? ? ? ? ? ? :placeholder="item.placeholder"
? ? ? ? ? ? :clearable="item.clearable"
? ? ? ? ? ? @change="handleChange(item.prop, formData[item.prop])"
? ? ? ? ? >
? ? ? ? ? ? <el-option
? ? ? ? ? ? ? v-for="option in item.options"
? ? ? ? ? ? ? :key="option.value"
? ? ? ? ? ? ? :label="option.label"
? ? ? ? ? ? ? :value="option.value"
? ? ? ? ? ? />
? ? ? ? ? </el-select>
? ? ? ? </template>
? ? ? ? <!-- 其它表單項(xiàng)同理 -->
? ? ? ? <template v-if="item.suffix">
? ? ? ? ? <span class="suffix">{{ item.suffix }}</span> ?--后置
? ? ? ? </template>
? ? ? </div>
? ? ? <div class="form-item-unit" v-if="item.unit">{{ item.unit }}</div> --單位
? ? </el-form-item>
? ? <div class="form-body" v-if="!$slots.default">
? ? ? <slot></slot>
? ? </div>
? ? <div class="form-footer" v-if="$slots.footer">
? ? ? <slot name="footer"></slot>
? ? </div>
? ? <div class="form-footer" v-else>
? ? ? <el-form-item>
? ? ? ? <el-button type="primary" @click="onSubmit" v-if="showSubmitButton">提交</el-button>
? ? ? ? <el-button @click="onCancel" v-if="showCancelButton">取消</el-button>
? ? ? </el-form-item>
? ? </div>
? </el-form>
</template>
<script>
export default {
? props: {
? ? formList: {
? ? ? type: Array,
? ? ? required: true,
? ? },
? ? formData: {
? ? ? type: Object,
? ? ? default: () => ({}),
? ? },
? ? actionUrl: {
? ? ? type: String,
? ? ? required: true,
? ? },
? ? showSubmitButton: {
? ? ? type: Boolean,
? ? ? default: true,
? ? },
? ? showCancelButton: {
? ? ? type: Boolean,
? ? ? default: true,
? ? },
? },
? methods: {
? ? handleChange(prop, value) {
? ? ? this.$emit('update:formData', {
? ? ? ? ...this.formData,
? ? ? ? [prop]: value,
? ? ? });
? ? },
? ? onSubmit() {
? ? ? this.$refs.form.validate((valid) => {
? ? ? ? if (valid) {
? ? ? ? ? this.$axios.post(this.actionUrl, this.formData).then((res) => {
? ? ? ? ? ? this.$emit('submit-success', res);//回調(diào)
? ? ? ? ? });
? ? ? ? } else {
? ? ? ? ? this.$message.error('請(qǐng)檢查表單是否填寫(xiě)正確');
? ? ? ? }
? ? ? });
? ? },
? ? onCancel() {
? ? ? this.$emit('cancel');
? ? },
? },
};
</script>
<style>
.form-item-container {
? position: relative;
? display: inline-block;
}
.prefix,
.suffix {
? position: absolute;
? top: 50%;
? transform: translateY(-50%);
? font-size: 14px;
}
.prefix {
? left: 8px;
}
.suffix {
? right: 8px;
}
.form-item-unit {
? display: inline-block;
? margin-left: 8px;
? color: #909399;
}
.form-body {
? margin-bottom: 20px;
? border: 1px solid #e4e7ed;
? border-radius: 4px;
? padding: 20px;
}
.form-footer {
? text-align: right;
? margin-top: 20px;
}
</style>

二、如何使用

引入import formComponent from 'xx';

<template>
? <div>
? ? <form-component
? ? ? :form-list="formList"
? ? ? :form-data="formData"
? ? ? :action-url="actionUrl"
? ? ? :show-submit-button="true"
? ? ? :show-cancel-button="true"
? ? ? @submit-success="onSubmitSuccess"
? ? ? @cancel="onCustomCancel"
? ? ? >
? ? ? <!-- 自定義表單內(nèi)容 -->
? ? ? <template #default>
? ? ? ? <el-form-item>
? ? ? ? ? <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>
? ? ? ? ? <el-cascader
? ? ? ? ? ? v-model="formData.address"
? ? ? ? ? ? :options="addressOptions"
? ? ? ? ? ? placeholder="請(qǐng)選擇地址"
? ? ? ? ? ? @change="handleChange('address', formData['address'])"
? ? ? ? ? />
? ? ? ? </el-form-item>
? ? ? ? <el-form-item>
? ? ? ? ? <el-input
? ? ? ? ? ? v-model="formData.email"
? ? ? ? ? ? placeholder="請(qǐng)輸入電子郵箱"
? ? ? ? ? ? clearable
? ? ? ? ? ? @change="handleChange('email', formData['email'])"
? ? ? ? ? />
? ? ? ? </el-form-item>
? ? ? </template>
? ? ? <!-- 自定義底部按鈕,也可以不添加,使用默認(rèn)底部按鈕 -->
? ? ? <template #footer>
? ? ? ? <el-button type="primary" @click="onCustomSubmit">提交</el-button>
? ? ? ? <el-button @click="onCustomCancel">取消</el-button>
? ? ? </template>
? ? </form-component>
? </div>
</template>
<script>
import FormComponent from './FormComponent.vue';
export default {
? components: {
? ? FormComponent,
? },
? data() {
? ? return {
? ? ? formList: [
? ? ? ? {
? ? ? ? ? label: '姓名',
? ? ? ? ? prop: 'name',
? ? ? ? ? type: 'input',
? ? ? ? ? placeholder: '請(qǐng)輸入姓名',
? ? ? ? ? clearable: true,
? ? ? ? ? maxlength: 20,
? ? ? ? },
? ? ? ? {
? ? ? ? ? label: '性別',
? ? ? ? ? prop: 'gender',
? ? ? ? ? type: 'select',
? ? ? ? ? placeholder: '請(qǐng)選擇性別',
? ? ? ? ? clearable: true,
? ? ? ? ? options: [
? ? ? ? ? ? {
? ? ? ? ? ? ? label: '男性',
? ? ? ? ? ? ? value: 'male',
? ? ? ? ? ? },
? ? ? ? ? ? {
? ? ? ? ? ? ? label: '女性',
? ? ? ? ? ? ? value: 'female',
? ? ? ? ? ? },
? ? ? ? ? ],
? ? ? ? },
? ? ? ? {
? ? ? ? ? label: '地址',
? ? ? ? ? prop: 'address',
? ? ? ? ? type: 'cascader',
? ? ? ? ? placeholder: '請(qǐng)選擇地址',
? ? ? ? ? clearable: true,
? ? ? ? ? options: [],
? ? ? ? },
? ? ? ? {
? ? ? ? ? label: '電子郵箱',
? ? ? ? ? prop: 'email',
? ? ? ? ? type: 'input',
? ? ? ? ? placeholder: '請(qǐng)輸入電子郵箱',
? ? ? ? ? clearable: true,
? ? ? ? ? maxlength: 50,
? ? ? ? },
? ? ? ],
? ? ? formData: {
? ? ? ? name: '',
? ? ? ? gender: '',
? ? ? ? address: [],
? ? ? ? email: '',
? ? ? },
? ? ? addressOptions: [
? ? ? ? {
? ? ? ? ? value: 'beijing',
? ? ? ? ? label: '北京',
? ? ? ? ? children: [
? ? ? ? ? ? {
? ? ? ? ? ? ? value: 'haidian',
? ? ? ? ? ? ? label: '海淀區(qū)',
? ? ? ? ? ? ? children: [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? value: 'zizhuqiao',
? ? ? ? ? ? ? ? ? label: '紫竹橋',
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? value: 'xizhimen',
? ? ? ? ? ? ? ? ? label: '西直門(mén)',
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ],
? ? ? ? ? ? },
? ? ? ? ? ? {
? ? ? ? ? ? ? value: 'chaoyang',
? ? ? ? ? ? ? label: '朝陽(yáng)區(qū)',
? ? ? ? ? ? ? children: [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? value: 'guomao',
? ? ? ? ? ? ? ? ? label: '國(guó)貿(mào)',
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? value: 'cbd',
? ? ? ? ? ? ? ? ? label: 'CBD',
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ],
? ? ? ? ? ? },
? ? ? ? ? ],
? ? ? ? },
? ? ? ? {
? ? ? ? ? value: 'shanghai',
? ? ? ? ? label: '上海',
? ? ? ? ? children: [
? ? ? ? ? ? {
? ? ? ? ? ? ? value: 'xuhui',
? ? ? ? ? ? ? label: '徐匯區(qū)',
? ? ? ? ? ? ? children: [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? value: 'xujiahui',
? ? ? ? ? ? ? ? ? label: '徐家匯',
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ],
? ? ? ? ? ? },
? ? ? ? ? ? {
? ? ? ? ? ? ? value: 'pudong',
? ? ? ? ? ? ? label: '浦東新區(qū)',
? ? ? ? ? ? ? children: [
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? value: 'lujiazui',
? ? ? ? ? ? ? ? ? label: '陸家嘴',
? ? ? ? ? ? ? ? },
? ? ? ? ? ? ? ],
? ? ? ? ? ? },
? ? ? ? ? ],
? ? ? ? },
? ? ? ],
? ? ? actionUrl: '/api/submit-form',
? ? };
? },
? methods: {
? ? onCustomSubmit() {
? ? ? // 自定義提交按鈕的點(diǎn)擊事件
? ? },
? ? onCustomCancel() {
? ? ? // 自定義取消按鈕的點(diǎn)擊事件
? ? },
? ? onSubmitSuccess(res) {
? ? ? // 表單提交成功的回調(diào)函數(shù)
? ? },
? },
};
</script>

到此這篇關(guān)于vue element封裝form表單的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)vue element封裝form表單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue中input type=file上傳后@change事件無(wú)效的解決方案

    vue中input type=file上傳后@change事件無(wú)效的解決方案

    這篇文章主要介紹了vue中input type=file上傳后@change事件無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 詳解在vue使用weixin-js-sdk常見(jiàn)使用方法

    詳解在vue使用weixin-js-sdk常見(jiàn)使用方法

    這篇文章主要介紹了 詳解在vue使用weixin-js-sdk常見(jiàn)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • vue2.0 循環(huán)遍歷加載不同圖片的方法

    vue2.0 循環(huán)遍歷加載不同圖片的方法

    下面小編就為大家分享一篇vue2.0 循環(huán)遍歷加載不同圖片的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • vue中使用swiper5方式

    vue中使用swiper5方式

    這篇文章主要介紹了vue中使用swiper5方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • vue 綁定使用 touchstart touchmove touchend解析

    vue 綁定使用 touchstart touchmove touchend解析

    這篇文章主要介紹了vue 綁定使用 touchstart touchmove touchend解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 解決vue attr取不到屬性值的問(wèn)題

    解決vue attr取不到屬性值的問(wèn)題

    今天小編就為大家分享一篇解決vue attr取不到屬性值的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 詳解在Vue中如何模塊化使用Vuex

    詳解在Vue中如何模塊化使用Vuex

    這篇文章給大家介紹了在Vue 中如何模塊化使用 Vuex,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • 一文詳解Vue中加上key后發(fā)生什么

    一文詳解Vue中加上key后發(fā)生什么

    本文主要介紹了一文詳解Vue中加上key后發(fā)生什么,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • 關(guān)于axios的proxy代理配置解析

    關(guān)于axios的proxy代理配置解析

    這篇文章主要介紹了關(guān)于axios的proxy代理配置解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue.js實(shí)戰(zhàn)之組件之間的數(shù)據(jù)傳遞

    Vue.js實(shí)戰(zhàn)之組件之間的數(shù)據(jù)傳遞

    這篇文章主要介紹了Vue.js實(shí)戰(zhàn)之組件之間的數(shù)據(jù)傳遞的相關(guān)資料,文中通過(guò)示例代碼和圖文介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04

最新評(píng)論

临江市| 乡宁县| 宜兴市| 仁布县| 新河县| 汝城县| 浙江省| 萨迦县| 邵阳市| 巴林左旗| 冀州市| 纳雍县| 石城县| 江陵县| 麦盖提县| 新干县| 峨边| 汝南县| 镇巴县| 无极县| 金乡县| 手机| 佳木斯市| 遂川县| 灯塔市| 彰化县| 漳平市| 平乡县| 深州市| 泰顺县| 正蓝旗| 周至县| 德清县| 资源县| 烟台市| 绥江县| 东辽县| 文昌市| 阜新| 县级市| 泊头市|