關(guān)于Ant-Design-Vue快速上手指南+排坑
前言
公司要開發(fā)一個(gè)后臺管理系統(tǒng),對于UI庫的選擇上選擇了顏值爆表的Ant-Design-Vue作為整個(gè)項(xiàng)目UI庫,但誰曾想,暗中的坑一個(gè)接一個(gè),文檔也不怎么詳細(xì),可能習(xí)慣了element-ui的掘友們也許不怎么好適應(yīng),本文就帶大家一起學(xué)習(xí)如何高效使用Ant-Design-Vue。
NO.1 表單組件
首先就來說說最常用的Form組件的正確使用姿勢:
先來看官方一段話述:
第一、我們不推薦在Form中使用雙向綁定,同一份數(shù)據(jù)可能在多處使用,如果使用雙向綁定,那么數(shù)據(jù)的修改會(huì)同時(shí)同步到各個(gè)組件,但這并不是我們想要的, 你應(yīng)該在表單提交成功或失敗或確認(rèn)時(shí)同步數(shù)據(jù),使用非雙向綁定的表單,你會(huì)擁有最大限度的控制數(shù)據(jù)修改/同步的權(quán)限。
第二、如果你不使用表單的自動(dòng)校驗(yàn)/收集功能,即沒有使用v-decorator修飾過的組件,你依然可以使用v-model
看了官方的建議后,我們愉快的使用v-decorator修飾input組件,代碼如下:
<a-form-item> <a-input placeholder="賬號" v-decorator="['account',{rules: [{ required: true,whitespace:true,message: '請輸入您的登陸賬號' }]}]" /> </a-form-item>
劃重點(diǎn):
v-decorator里的account可以理解為input的name值,后面{}對象可以配置校驗(yàn)規(guī)則,初始值等參數(shù),這里需要注意的是使用了v-decorator的組件無法使用v-model,也無法設(shè)置value等與值有關(guān)的屬性,否則報(bào)錯(cuò)
v-decorator會(huì)自動(dòng)收集你表單里的數(shù)據(jù)到form對象里,所以別忘了在data中加上這句代碼:
form: this.$form.createForm(this)
模板中這么寫:
如何自定義表單校驗(yàn)規(guī)則
這里拿確認(rèn)密碼舉例:
<a-input type="password" v-decorator="['new_password',{rules:[{required: true,whitespace:true,message: '請輸入新密碼'},{validator: handlePass}]}]" /> <a-input type="password" v-decorator="['confirm_password',{rules:[{required: true,whitespace:true,message: '請重復(fù)新密碼'},{validator:handleConfirmPass}]}]" />
這里我們使用validator校驗(yàn)器自定義函數(shù)
handlePass(rule, value, callback) { this.password = value; callback(); }, handleConfirmPass(rule, value, callback) { if (this.password && this.password !== value) { callback('與新密碼輸入不一致'); } callback(); },
這里需要注意callback()必須調(diào)用
這里的value就是對應(yīng)表單輸入了的值,然后知道了這些我們就可以寫我們自己的業(yè)務(wù)邏輯了
做好的效果如圖:
表單回顯
我們在做編輯時(shí)首先需要通過后端接口讀取到之前的數(shù)據(jù),但是因?yàn)楝F(xiàn)在沒有了v-model,那么我們該怎么辦?
可以調(diào)用form對象中的setFieldsValue把后端返回的對象直接設(shè)置上去,如果是在mounted方法里必須加上$nextTick,不然會(huì)拋出警告說我們在表單未渲染好之前給予了數(shù)據(jù)
代碼如圖:
圖中setFieldsInitialValue是設(shè)置表單初始值,如果表單中有重置按鈕,就需要設(shè)置上,重置按鈕調(diào)用this.form.resetFields()就可以重置form表單了
這個(gè)setFieldsValue方法會(huì)把傳進(jìn)去的對象的key和模板中v-decorator中的第一個(gè)參數(shù)比較,會(huì)自動(dòng)把對應(yīng)的值set進(jìn)去。
提交表單
按鈕加上html-type="submit"后點(diǎn)擊會(huì)觸發(fā)這個(gè)方法,這個(gè)方法校驗(yàn)表單中所有必填項(xiàng)沒有問題后會(huì)自動(dòng)幫我們把表單中所有帶有v-decorator修飾的組件的值和name序列化好,我們就可以直接傳給后端了。
NO.2 表格(Table)
我們的模板可以這么寫:
ant-design-vue的表格自帶分頁,接下來我把上圖中的參數(shù)挨個(gè)解釋下,columns是單元格信息,我們可以把他導(dǎo)出為一個(gè)數(shù)組,如下圖:
這里的title是用戶看到的文字,dataIndex要和后臺傳過來的字段一致,不然數(shù)據(jù)不會(huì)顯示出來,其次還提供了customRender和scopedSlots兩種方式自定義內(nèi)容,這里使用了第一種方式,但值得一提的是如果使用的是slot-scope方式,在模板中定義一個(gè)點(diǎn)擊事件,想要獲取到當(dāng)前行的數(shù)據(jù)時(shí),一定一定不要加dataIndex屬性,否則會(huì)是undefined
看一個(gè)scopedSlots使用的例子:
可以看到上面定義columns時(shí)給action沒有加dataIndex
我們繼續(xù)看dataSource是什么,他就是你給table傳遞的數(shù)據(jù)
rowKey
可以理解為時(shí)循環(huán)時(shí)需要的key(必有)pagination
初始化一個(gè)空對象scroll
定義表格可以橫向滾動(dòng)handleTableChange
是當(dāng)分頁數(shù)據(jù)發(fā)生改變時(shí)拋出的事件
為了簡化操作,我這里封裝了一個(gè)mixin,當(dāng)頁面中有table時(shí)直接混入mixin就支持分頁和拉取數(shù)據(jù)的邏輯了,代碼如下:
export const mixin = { data() { return { pagination: {}, data: [], }; }, methods: { handleTableChange(pagination) { const pager = {...this.pagination}; pager.current = pagination.current; this.pagination = pager; this.loadData({ page: pagination.current }); }, async loadData(params = {}) { try { const {data: table_data, total, per_page} = await this.loadMethod('flush' in params ? {page: 1} : {page: 1, ...params}); const pagination = {...this.pagination}; pagination.total = total; pagination.pageSize = per_page; 'flush' in params && (pagination.current = 1); this.data = table_data; this.pagination = pagination; } catch (e) { console.log(e); } } } };
flush用于標(biāo)識是否是插入新數(shù)據(jù)或者刪除了數(shù)據(jù),如果是我們直接把page重置為1返回第一頁
我們在頁面使用只需要以下幾行代碼:
import { getLog } from '@/api/api'; import { mixin } from '@/mixins'; export default { name: "log", mixins: [mixin], data() { return { columns, loadMethod: getLog }; }, mounted() { this.loadData(); } };
這樣其他類似的組件也可以直接復(fù)用本邏輯。
NO.3 Spin組件
我們平時(shí)在后臺管理系統(tǒng)中,ajax請求過程中都會(huì)出現(xiàn)全屏加載提示的遮罩層,做這個(gè)功能時(shí)我想到了這個(gè)組件,然后去官方文檔查看,看到了如下圖的操作方式:
然后粘貼到代碼中,各種操作,沒有任何反應(yīng),甚至有時(shí)候還來點(diǎn)小報(bào)錯(cuò),Spin組件肯定是引入了,反正就是最后怎么操作都沒成功,無奈之下,自己用了他的樣式寫了個(gè)Vue的Spin插件:
我們首先新建Loading.vue
<template> ? <div v-if="show" class="loading-container"> ? ? <div class="loading-mask"></div> ? ? <div class="loading-content"> ? ? ? <a-spin tip="正在加載數(shù)據(jù)中..." size="large"> ? ? ? </a-spin> ? ? </div> ? </div> </template>
<script> export default { ? name: 'Loading', ? props: { ? ? show: Boolean, ? }, ? data() { ? ? return { ? ? } ? } } </script>
<style lang="scss" scoped> ? .loading-container{ ? ? position: relative; ? ? text-align: center; ? ? z-index:9999; ? ? .loading-mask{ ? ? ? position: fixed; ? ? ? top:0; ? ? ? bottom:0; ? ? ? left:0; ? ? ? right:0; ? ? ? background-color:rgba(0,0,0,.7); ? ? } ? ? .loading-content{ ? ? ? position: fixed; ? ? ? left: 50%; ? ? ? top: 50%; ? ? ? z-index: 300; ? ? ? transform: translate(-50%,-50%); ? ? ? text-align: center; ? ? ? color:#fff; ? ? } ? } </style>
然后再新建Loading.js
import Vue from 'vue'; import loadingComponent from './Loading.vue'; const LoadingConstructor = Vue.extend(loadingComponent); const instance = new LoadingConstructor({ el: document.createElement('div') }); instance.show = false; // 默認(rèn)隱藏 const loading = { show() { // 顯示方法 instance.show = true; document.body.appendChild(instance.$el); }, hide() { // 隱藏方法 instance.show = false; } }; export default { install() { if (!Vue.$loading) { Vue.$loading = loading; } Vue.mixin({ created() { this.$loading = Vue.$loading; } }); } };
然后在main.js中
import loading from '@/components/Loading/loading.js'; Vue.use(loading);
然后我們就可以愉快的調(diào)用了:
Vue.$loading.show();
打包優(yōu)化
首先就是用官方快速上手中提供的按需加載,這里不再贅述,使用之后還存在以下問題:
里面的moment.js,還有l(wèi)odash,還有icon的dist居然占用了我們500KB的空間,這不能忍,那怎么辦呢?
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
我們首先忽略掉語言包,然后看看圖標(biāo)怎么優(yōu)化:
config.resolve.alias .set('@', resolve('src')) .set('@ant-design/icons/lib/dist$',resolve('src/icon.js'))
我們還需要在src文件夾下面加一個(gè)文件 icons.js
//自己項(xiàng)目里面用到的Icon export {default as UserOutline} from '@ant-design/icons/lib/outline/UserOutline'; export {default as CloseCircleFill} from '@ant-design/icons/lib/fill/CloseCircleFill'; export {default as InfoCircleFill} from '@ant-design/icons/lib/fill/InfoCircleFill'; export {default as CheckCircleFill} from '@ant-design/icons/lib/fill/CheckCircleFill';
我們還可以開啟gzip壓縮等,使用DLL優(yōu)化我們的打包速度,這些在這里就不再贅述了,社區(qū)有很多類似的貼子。
結(jié)語
那么對于ant-design-vue使用的前兩天感覺不怎么順手,現(xiàn)在只能說真香
其實(shí)這個(gè)UI庫用習(xí)慣之后會(huì)發(fā)現(xiàn)好像Form表單的設(shè)計(jì)其實(shí)比v-model更好用,以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue無法訪問.env.development定義的變量值問題及解決
這篇文章主要介紹了Vue無法訪問.env.development定義的變量值問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01vue父組件向子組件(props)傳遞數(shù)據(jù)的方法
這篇文章主要介紹了vue父組件向子組件(props)傳遞數(shù)據(jù)的方法,文中給大家補(bǔ)充介紹了vue父子組件間傳值(props)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2018-01-01vue開發(fā)中后臺系統(tǒng)復(fù)雜表單優(yōu)化技巧
這篇文章主要為大家介紹了vue開發(fā)中后臺系統(tǒng)復(fù)雜表單的優(yōu)化技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Vuex子模塊調(diào)用子模塊的actions或mutations實(shí)現(xiàn)方式
這篇文章主要介紹了Vuex子模塊調(diào)用子模塊的actions或mutations實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問題的解決
這篇文章主要介紹了vue-element-admin中node-sass換成dart-sass,安裝依賴報(bào)code?128多種問題的解決方法,本文給大家分享問題原因分析及解決方法,需要的朋友可以參考下2023-02-02Vue中使用echarts實(shí)現(xiàn)繪制人體動(dòng)態(tài)圖
這篇文章主要為大家詳細(xì)介紹了Vue中如何使用echarts實(shí)現(xiàn)繪制人體動(dòng)態(tài)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03vuex 多模塊時(shí) 模塊內(nèi)部的mutation和action的調(diào)用方式
這篇文章主要介紹了vuex 多模塊時(shí) 模塊內(nèi)部的mutation和action的調(diào)用方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07vue中改變了vuex數(shù)據(jù)視圖不更新,也監(jiān)聽不到的原因及解決
這篇文章主要介紹了vue中改變了vuex數(shù)據(jù)視圖不更新,也監(jiān)聽不到的原因及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03vue router嵌套路由在history模式下刷新無法渲染頁面問題的解決方法
這篇文章主要介紹了vue router嵌套路由在history模式下刷新無法渲染頁面問題的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01