子組件封裝:
1 <template> 2 <el-button 3 v-bind="$attrs" 4 :loading="loadingStatus" 5 @click="handleClick" 6 v-if="judgePerm(permission)" 7 > 8 <slot/> 9 </el-button> 10 </template> 11 12 <script> 13 import { hasPermission } from './index.js' 14 export default { 15 name: 'prButton', 16 props: { 17 controlLoading: { 18 type: Boolean, 19 default: false 20 }, 21 permission: { 22 type: Number, 23 }, 24 }, 25 data() { 26 return { 27 loadingStatus: false 28 } 29 }, 30 methods: { 31 judgePerm(perms){//按妞權限控制 32 return hasPermission(perms) 33 }, 34 handleClick() { 35 if (this.controlLoading) { 36 this.loadingStatus = true 37 } 38 this.$emit('click', () => { 39 this.loadingStatus = false 40 }) 41 } 42 } 43 } 44 </script> 45 46 <style> 47 48 </style>
其中v-bind="$attrs"繼承el-button的所有方法和屬性設置,judgePerm()方法是為了進行權限控制,其中permission是當前按鈕的權限標識,可以是數字或者字符串。loadingStatus是進行控制按鈕被連續點擊發送請求的問題,當點擊后會調用handleClick()方法。然后通過$emit觸發click事件將回調函數傳到父組件,來實現loading。
import store from '@/store' export function hasPermission(perms){ return perms==store.state.count; }
獲取權限進行匹配返回,這個可以根據自己項目的要求來寫不同的方法。
父組件:
<template> <div> <div id="header"> <pr-button :permission ="20" type="primary" @click="submit2">測試按妞</pr-button> </div> </div> </template> <script> export default { name:"RetrievalHeader", methods:{ submit2(done){ setTimeout(() => { done() }, 3000) } }, }
子組件觸發click事件進而調用父組件的submit2方法,來進行事件的處理最后通過調用done(),來結束loading,實現連續點擊觸發請求。