Vue 全局属性配置

常见全局配置的属性/组件:请求api、封装的icon组件、elementUI Plus样式、时间格式化方法、国际化语言函数、自定义指令

关键语法

// 全局配置,可在模块函数中导出,也可直接在main.js中定义
app.config.globalProperties.$request = request; 

// 若全局配置又模块导出,需要在main.js中导入后挂载
installRequest(app)

全局配置的两种方法

1. 先在模块化中导出全局配置,再在main.js挂载

// filter.js 模块化内导出全局配置
export default (app) => {
  app.config.globalProperties.$filters = { dateFilter, relativeTime }
}


// main.js 中导入挂载
import installFilter from '@/filters'
installFilter(app)

2. 在main.js直接挂载全局配置

import filters '@/filters'
app.config.globalProperties.$filters = filters;

全局配置示例:

1.时间格式化函数的全局配置:

1.1 创建函数模块 filter.js

import dayjs from 'dayjs'
import rt from 'dayjs/plugin/relativeTime'
import 'dayjs/locale/zh-cn'
import store from '@/store'

export const dateFilter = (val, format = 'YYYY-MM-DD') => {
  if (!isNaN(val)) {
    val = parseInt(val)
  }
  return dayjs(val).format(format)
}

// 加载相对时间插件
dayjs.extend(rt)
function relativeTime(val) {
  if (!isNaN(val)) {
    val = parseInt(val)
  }
  //  处理国际化
  return dayjs()
    .locale(store.getters.language === 'zh' ? 'zh-cn' : 'en')
    .to(dayjs(val))
}

export default (app) => {
  app.config.globalProperties.$filters = { dateFilter, relativeTime }
}

1.2 main.js 中全局配置

import { createApp } from 'vue'
import App from './App.vue'
import installFilter from '@/filters'
const app = createApp(App)
installFilter(app)
app.mount('#app')

1.3 组件内使用全局配置的属性


<template>
  <div class="article-ranking-container">
      <el-table ref="tableRef" :data="tableData" border>
        <el-table-column
          v-for="(item, index) in tableColumns"
          :key="index"
          :prop="item.prop"
          :label="item.label"
        >
        <!-- 无需引用或导入,直接$xxx使用 -->
          <template #default="{ row }" v-if="item.prop === 'publicDate'">
            {{ $filters.relativeTime(row.publicDate) }}
          </template>
        </el-table-column>
      </el-table>
  </div>
</template>

2. 自定义指令模块函数的全局配置

2.1 创建函数模块 directives.js、permission.js

// permission.js 自定义指令功能配置

import store from '@/store'

function checkPermission(el, binding) {
  const { value } = binding
  const points = store.getters.userInfo.permission.points
  console.log('points', points)
  if (value && value instanceof Array) {
    const hasPermission = points.some((point) => {
      return value.includes(point)
    })
    if (!hasPermission) {
      // 如果无法匹配,则表示当前用户无该指令,需要删除对应的功能按钮
      el.parentNode && el.parentNode.removeChild(el)
    }
  } else {
    // 抛出错误
    throw new Error('v-permission value is array inclued string')
  }
}

export default {
  // 在绑定元素的父组件被挂载后调用
  mounted(el, binding) {
    checkPermission(el, binding)
  },
  // 在包含组件的 VNode 及其子组件的 VNode 更新后调用
  update(el, binding) {
    checkPermission(el, binding)
  }
}
// 自定义工具函数模块 directive.js

// 局部打印插件
import print from 'vue3-print-nb'
// 权限控制之功能按钮自定义指令
import permission from './permission'
export default (app) => {
  app.use(print)
  app.directive('permission', permission)
}

2.2 main.js 中全局配置

···
import installDirective from '@/directives'
installDirective(app)
····

2.3 组件内使用全局配置的自定义指令

<template>
  <div class="user-manage-container">
      <el-table :data="tableData" border style="width: 100%">
        <el-table-column
          :label="$t('msg.excel.action')"
          fixed="right"
          width="250"
        >
          <!-- 自定义指令v-permission -->
          <template #default="{ row }">
            <el-button
              type="primary"
              size="mini"
              @click="onShowClick(row._id)"
              v-permission="['importUser']"
              >{{ $t('msg.excel.show') }}</el-button
            >
          </template>
        </el-table-column>
      </el-table>
  </div>
</template>




  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值