vue3.0+搭配antD-Vue開發項目(一)

####安裝antd-vue並按需加載(詳見 https://www.antdv.com/docs/vue/use-with-vue-cli-cn/ )css

一、yarn add ant-design-vue
二、yarn add babel-plugin-import
三、babel.config.js文件
module.exports = {
  presets: ["@vue/app"],
+  plugins: [
+    [
+      "import",
+      { libraryName: "ant-design-vue", libraryDirectory: "es", style: "css"}  //注意官網這裏是style:true,這可能會致使報錯。建議使用style:"css"
+    ]
+  ]
};
四、src/main.js
import {Button,Switch} from 'ant-design-vue'
Vue.use(Button).use(Switch)
五、使用
<a-button type="primary">哈哈哈</a-button>
<a-switch defaultChecked />

####若不想按需加載antd-vue,想一次性所有引入vue

以上第3步:
將:{ libraryName: "ant-design-vue", libraryDirectory: "es", style: "css"}
改成:{ libraryName: "Antd", libraryDirectory: "es", style: "css"}  //提醒:這裏style:"css"可改成style:true且不會報錯,這樣改後會加載包裏的less文件而非css文件。不改也沒影響

以上第4步:所有改成
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
Vue.use(Antd);

而後重啓項目便可,請務必重啓項目。

####antd表格的使用(包括自定義表格列,表格分頁,vue中的對象格式與react的不一樣)react

<template>
<a-table 
    :columns="columns"    //二、綁定columns,提醒:columns不只要自定義,並且以後還須要在data裏註冊
    :dataSource="personList" 
    bordered 
    :rowKey="record=>record.pid"   //四、表格的每一列必須有一個key值
    :pagination="pagination"   //七、設置分頁,這裏pagination是在data裏定義的一個對象
>
    <div slot="pimg" slot-scope="text,record">   //六、經過slot='pimg'綁定。經過slot-scope="text,record"能夠動態獲取數據給自定義的標籤,但前提是必須在columns裏配置了scopedSlots
        <img :src="record.pimg"/>
        <a-button @click="bigImg(record.pimg)">查看大圖</a-button>
    </div>
    <div slot="operations" slot-scope="text,record">
        <a-button @click="personEdit(record.pid)">編輯</a-button>
        <a-popconfirm :title='`肯定刪除人物"${record.pname}"的信息?`' okText="肯定" cancelText="取消" @confirm="deletePerson(record.pid)">
            <a-button>刪除</a-button>
        </a-popconfirm>            
    </div>
</a-table>
</template>

<script>
const columns = [   //一、定義表格Header數據columns
    {
        title: '姓名',
        dataIndex: 'pname',  //此處命名有講究,要與渲染的數組裏的屬性名一致(如personList裏是pname,這裏就要用pname,不可用cname,name等)
        key:'pname',
    },
    {
        title: '圖片',
        dataIndex: 'pimg',
        key:'pimg',
        scopedSlots:{customRender:'pimg'},  //五、這裏設置了scopedSlots:{customRender:'pimg'}以後,表格部分便可經過slot='pimg'綁定,而後去自定義標籤及樣式。並可經過sloct-scope獲取動態數據
    },
    {
        title:'操做',
        dataIndex:'operations',
        key:'operations',
        scopedSlots:{customRender:'operations'},   
    }
];

export default {
    name:'Demo',
    data(){
        let self=this   //八、改變this指向供分頁配置數據使用
        return{
            personList:[],   //人物列表數據
            columns,   //三、這裏必須註冊columns
            pagination:{   //九、分頁配置(這是一個對象格式的數據)
                page:1,
                pageSize:10,
                total:0,
                onChange:(page,pageSize)=>self.pageChange(page,pageSize),
            }
        }
    }, 
    created(){
        this.getPersonList()
    }
    methods:{
        //初始化時獲取列表數據
        getPersonList(){
            this.$axios.get(`${common.base}/admin/getPersonList?page=${this.pagination.page}&pagesize=${this.pagination.pageSize}`).then(res=>{
                if(res.data.code==200){
                    if(res.data.data.list){
                        this.personList=res.data.data.list
                        this.pagination.total=res.data.data.allsize

                        //如下是頁面改動的兼容處理(好比刪除第3頁最後一條數據後,第3頁將無數據,則在刪除函數執行成功後再將page-1,設置page爲2,再去請求getPersonList()函數。便可實現刪除第3頁最後一條數據後,跳轉至第2頁)
                        if(res.data.data.list.length==1&&this.pagination.page>1){
                            this.pagination.page-=1
                        }
                    }
                }else if(res.data.code==401){
                    this.$message.warning("登陸超時,請從新登陸!")
                    this.$router.push({name:'Login'})
                }
            }).catch(err=>{})
        },
        //翻頁時執行此函數
        pageChange(page,pageSize){   //十、分頁函數
            this.pagination.page=page   //翻頁時,賦值更改表格分頁顯示
            this.$axios.get(`${common.base}/admin/getPersonList?page=${page}&pagesize=${pageSize}`).then(res=>{
                if(res.data.code==200){
                    if(res.data.data.list){
                        this.personList=res.data.data.list

                        //如下是頁面改動的兼容處理(同上)
                        if(res.data.data.list.length>1){   
                            this.pagination.page=page
                        }else if(res.data.data.list.length==1&&page>1){
                            this.pagination.page=page-1
                        }
                    }
                }
            }).catch(err=>{})
        },
        //刪除人物
        deletePerson(pid){
            this.$axios.post(`${common.base}/delPerson?pid=${pid}`).then(res=>{
                if(res.data.code==200){
                    this.$message.success(`人物 ${pname} 信息刪除成功!`)
                    this.getPersonList()   //刪除成功後調用此函數獲取人物列表信息
                }
            }).catch(err=>{})
        },
    }      
}
</script>
vue中對象方式和react的不一樣:vue中 :pagination="{page:1,pageSize:10,total:0}"   react中 pagination={{page:1,pageSize:10,total:0}}  區別:vue中須要v-bind綁定,且包裹方式是""。
表格分頁可看博客:https://www.wandouip.com/t5i370008/

####解決瀏覽器緩存致使異步請求後頁面不更新的問題ios

通常在請求靜態資源的時候,瀏覽器檢測不是新數據的話,則會從緩存中讀取而不會去進行更新,從而致使後臺提交數據後前臺不更新的問題。
解決方法1:ctrl+shift+delete呼出瀏覽器緩存選項,清除緩存便可。但這樣的操做對用戶不友好,不推薦
解決方法2:控制檯中Network裏選中Disable cache使瀏覽器不保存緩存,僅適合開發人員用。
解決方法3:在請求接口的時候帶上隨機數或者時間戳便可(推薦使用)
getContent(content){
    this.$axios.get(`${common.base}/getDemoList?t=${Math.random()}`).then(res=>{   //添加隨機數 `t=${Math.random()}` 或 時間戳 `t=${new Date().getTime()}`
        this.demoList=res.data.list
    }).catch(err=>{})
},

####router路由在新窗口打開頁面vue-router

goIndex(){
    let goIndex=this.$router.resolve({name:'Index'})   //這裏要用resolve方式。 push,go方式無效
    window.open(goIndex.href,'_blank')
}

####解決vue路由跳轉報錯 vue-cli

緣由:據翻看大佬的解釋,vue-router ≥3.0版本回調形式以及改爲promise api的形式了,返回的是一個promise,若是沒有捕獲到錯誤,控制檯始終會出現如圖的警告

解決:在pages/router/router.js  即路由頁面添加如下代碼
import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
+ const routerPush = VueRouter.prototype.push
+ VueRouter.prototype.push = function push(location) {
+   return routerPush.call(this, location).catch(error=> error)
+ }
相關文章
相關標籤/搜索