VUE3 自定义标签/v-if 按钮权限控制

1、自定义标签

  使用了:vue3directive
  把数据放在store中,在切换路由时(单点嵌入),也可以在登陆时加载Store数据;
  加载数据JS如下
export function getUserBtnInfo() {
   let createUser= "";
   if (window.parent.getUserName) {
     createUser=window.parent.getUserName();
  }
   return new Promise((resolve, reject) => {
   request({
    url: '/web/userButton/getButtonList/' + createUser,
    method: 'POST'
  }).then((res) => {
            if(res.code === 200) {
              console.log(res)
              //设置到store中
              store.dispatch('setName', res.data)
            }
        });
      })
}

store 代码

import { createStore } from 'vuex'
import request from '@/utils/request'
const btns = ""



const state = "aaa"
console.log(state)
export default createStore({
  state: {
    permissionBtns:state
  },
  mutations: {
    SET_USER: (state, userInfo) => {
      state.permissionBtns = userInfo
    },
    RESET_USER: (state) => {
        state.permissionBtns = []
    }
  },
  actions: {
    setName(context, value){
      // 修改getname的值
      context.commit('SET_USER',value)
    },
  },
  modules: {
  }
})

切换路由时,加载store数据;(我这边是单个菜单集成进去,放在路由比较合适,如果正常项目登陆的时候加载一次就ok了)

路由js处下方加入如下代码

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

// 路由拦截   全局路由守卫  权限控制,前端路由守卫控制,登录才可以访问
 router.beforeEach((to, from, next) => {
  getUserBtnInfo();
  //store.dispatch('setName', "2566622")
  //commit('SET_USER', userInfo)
  next()
}) 

main js处定义全局方法

const app = createApp(App)
/* app.property.hasPermission = hasPermission */
const _has = val => {
  const isShow = false
   let permissionStr =""
  if (store.state.permissionBtns === undefined || store.state.permissionBtns == null) {
    return isShow
  }else{
    permissionStr =store.state.permissionBtns.toString();
  }
  if (permissionStr.indexOf(val) > -1) {
    return true
  } 
  return isShow
}

app.config.globalProperties.$hasPermissions = hasPermissions
app.directive('permission', {
	mounted(el, binding) {
       if (!_has(binding.value))
		/* if (!store.state.role[binding.value]) */ {
			el.parentNode && el.parentNode.removeChild(el)
		} 
	}
})

页面使用: v-permission="‘add-3qry’" 在这里插入图片描述
以上是自定义标签;

v-if:由于自定义标签在如下代码中使用报错:

  <el-table-column label="操作" fixed="right" width="200">
            <template #default="scope">
            //报错,应该是由于dom取到的层级报错,未解决因此用了v-if辅助解决
              <el-tooltip content="编辑" v-permission="'add-3qry'" placement="bottom" effect="light">
                <a class="blue font-s16" @click="toUpdate(scope.row.id)"
                  ><i class="el-icon-edit"></i
                ></a>
              </el-tooltip>
              <el-tooltip content="删除" placement="bottom" effect="light">
                <a  @click="toDelete(scope.row.id)" class="red"
                  ><i class="iconfont icon-i9"></i
                ></a>
              </el-tooltip>
            </template>
          </el-table-column>

js代码如下:新建has.js


import store from '@/store'


 function hasPermission(permission){
  const isShow = false
  let permissionStr =""
 if (store.state.permissionBtns === undefined || store.state.permissionBtns == null) {
   return isShow
 }else{
   permissionStr =store.state.permissionBtns.toString();
 }
 if (permissionStr.indexOf(permission) > -1) {
   return true
 } 
 return isShow
} 

export default {
  hasPermission
}

数据和自定义标签也是路由加载store方式;

自定义全局变量

import hasPermissions from "@/utils/has";
app.config.globalProperties.$hasPermissions = hasPermissions

页面

 <el-table-column label="操作" fixed="right" width="200">
          <template #default="scope">
            <el-tooltip v-if="hasPer('add-1qry')"  content="查看详情" placement="bottom" effect="light">
              <a class="blue font-s16" @click="getTaskLogDetail(scope.row)"
                ><i class="el-icon-tickets"></i
              ></a>
            </el-tooltip>
          </template>
        </el-table-column>



//js处
 hasPer(val){
      return this.$hasPermissions.hasPermission(val)
    },
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue 3中,可以通过自定义指令来实现按钮权限控制。下面是一个简单的示例: 首先,创建一个自定义指令文件(例如`permission.js`): ```javascript import { Directive } from 'vue'; const permissionDirective: Directive = { mounted(el, binding) { const { value } = binding; // 根据用户的权限进行判断 if (!checkPermission(value)) { el.style.display = 'none'; } }, }; export default permissionDirective; ``` 在上述代码中,我们定义了一个`permissionDirective`指令,在`mounted`钩子函数中根据用户的权限(这里使用`checkPermission`函数作为示例)来判断是否显示按钮。如果权限不满足条件,则将按钮的`display`属性设置为`none`,从而隐藏按钮。 接下来,在Vue组件中使用自定义指令: ```vue <template> <button v-permission="'button.permission'">按钮</button> </template> <script> import { defineComponent } from 'vue'; import permissionDirective from './permission'; export default defineComponent({ directives: { permission: permissionDirective, }, }); </script> ``` 在上述代码中,我们通过`v-permission`指令绑定了一个权限值(例如`'button.permission'`)。当组件渲染时,自定义指令会根据权限值进行判断,并控制按钮的显隐。 需要注意的是,上述代码中的`checkPermission`函数需要根据实际业务逻辑进行实现,用于判断用户是否具有相应的权限。 这是一个简单的示例,你可以根据自己的需求进行修改和扩展以满足具体的按钮权限控制需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值