VUE.directive

2.6 自定义指令
自定义全局和局部的自定义指令
注意: Vue中所有的指令,在调用的时候,都以 v- 开头 ,但是自定义时不需要v-开头

2.6.1 全局自定义指令
使用Vue.directive()定义全局的指令 v-focus
其中:参数1 : 指令的名称;参数2: 是一个对象,这个对象身上,有一些指令相关的函数,这些函数可以在特定的阶段,执行相关的操作


 Vue.directive('focus', {
      bind: function (el) { 
    // 每当指令绑定到元素上的时候,会立即执行这个 bind 函数,只执行一次
    // 注意: 在每个函数中,第一个参数,永远是 el ,表示被绑定了指令的那个元素,这个 el 参数,是一个原生的JS对象
    // 在元素刚绑定了指令的时候,还没有插入到 DOM中去,这时候,调用 focus 方法没有作用
    //因为,一个元素,只有插入DOM之后,才能获取焦点
    //没有插入到 DOM中去还在内存中
    // 样式,只要通过指令绑定给了元素,不管这个元素有没有被插入到页面中去,这个元素肯定有了一个内联的样式
        // el.focus()
      },
      inserted: function (el) {  
      // inserted 表示元素 插入到DOM中的时候,会执行 inserted 函数【触发1次】
      // 已经插入到dom中去了
        el.focus()
        // 和JS行为有关的操作,最好在 inserted 中去执行,放置 JS行为不生效
      },
      updated: function (el) {  // 当VNode更新的时候,会执行 updated, 可能会触发多次

      }
    })

注意:对于bind和inserted可以这样理解:bind可以认为是绑内存,inserted可以认为是插入dom
updated也是操作于dom页面,但是与inserted相比是可以触发多次

2.6.2 私有自定义指令
自定义私有指令

// 如何自定义一个私有的过滤器(局部)
    var vm2 = new Vue({
      el: '#app2',
      data: {
        dt: new Date()
      },
      methods: {},//自定义方法
      filters: {},//自定义过滤器
      directives: { // 自定义私有指令
        'fontweight': { // 设置字体粗细的
          bind: function (el, binding) {
            el.style.fontWeight = binding.value
          }
        },
        'fontsize': function (el, binding) { // 注意:这个 function 等同于 把 代码写到了 bind 和 update 中去
          el.style.fontSize = parseInt(binding.value) + 'px'
        }
      }
    })

2.6.3 自定义指令参数
在回调函数中

第一参数el是指令所绑定的元素,可以直接操作dom
第二个参数binding一个对象,包含以下属性:
name:指令名,不包括v- 前缀
value:指令的绑定值,例如:v-mydirective=“1+1”,那么value的值是2
oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression: 绑定值的表达式或变量名。 例如 v-my-directive=“1 + 1” , expression 的值是 “1 + 1”。
arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 foo
modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }

第三个参数vnode: Vue 编译生成的虚拟节点
第三个参数oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用

Vue.directive('color', {
bind: function (el, binding) {
   el.style.color = binding.value
  }
})

2.6.4 指令函数简写形式
无论是全局还是私有的都可以都可以适用如下的简写形式。
大多数情况下,我们可能想在bind和update钩子上做重复动作,并且不想关心其他的钩子函数,可以写成如下形式

Vue.directive('color-switch',function(el,binding){
	el.style.backgroundColor = binding.value;
});

注意:只能适用于bind和update的形式

原文链接:https://blog.csdn.net/u012060033/article/details/109106826

// crm 系统按钮权限

directive\permission\index.js

import hasRole from './hasRole'
import hasPermi from './hasPermi'

const install = function(Vue) {
  Vue.directive('hasRole', hasRole)
  Vue.directive('hasPermi', hasPermi)
}

if (window.Vue) {
  window['hasRole'] = hasRole
  window['hasPermi'] = hasPermi
  Vue.use(install); // eslint-disable-line
}

export default install

directive\permission\hasPermi.js

 /**
 * 操作权限处理
 * Copyright (c) 2020 sumec
 */
 
import store from '@/store'

export default {
  inserted(el, binding, vnode) {
    const { value } = binding
    const all_permission = "*:*:*";
    const permissions = store.getters && store.getters.permissions

    if (value && value instanceof Array && value.length > 0) {
      const permissionFlag = value

      const hasPermissions = permissions.some(permission => {
        return all_permission === permission || permissionFlag.includes(permission)
      })

      if (!hasPermissions) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置操作权限标签值`)
    }
  }
}

directive\permission\hasRole.js

 /**
 * 角色权限处理
 * Copyright (c) 2020 sumec
 */

import store from '@/store'

export default {
  inserted(el, binding, vnode) {
    const { value } = binding
    const super_admin = "sys:manager";
    const roles = store.getters && store.getters.roleSet

    if (value && value instanceof Array && value.length > 0) {
      const roleFlag = value

      const hasRole = roles.some(role => {
        return super_admin === role || roleFlag.includes(role)
      })

      if (!hasRole) {
        el.parentNode && el.parentNode.removeChild(el)
      }
    } else {
      throw new Error(`请设置角色权限标签值"`)
    }
  }
}

utils\permissions.js

import store from '@/store'

/**
 * 字符权限校验
 * @param {Array} value 校验值
 * @returns {Boolean}
 */
export function checkPermi(value) {
  if (value && value instanceof Array && value.length > 0) {
    const permissions = store.getters && store.getters.permissions
    const permissionDatas = value

    const hasPermission = permissions.some(permission => {
      return permissionDatas.includes(permission)
    })

    if (!hasPermission) {
      return false
    }
    return true
  } else {
    console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`)
    return false
  }
}

/**
 * 角色权限校验
 * @param {Array} value 校验值
 * @returns {Boolean}
 */
export function checkRole(value) {
  if (value && value instanceof Array && value.length > 0) {
    const roles = store.getters && store.getters.roleSet
    const permissionRoles = value

    const hasRole = roles.some(role => {
      return permissionRoles.includes(role)
    })

    if (!hasRole) {
      return false
    }
    return true
  } else {
    console.error(`need roles! Like checkRole="['admin','editor']"`)
    return false
  }
}

store\index.js

import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'

Vue.use(Vuex)
const store = new Vuex.Store({
  getters,
})
export default store

store\getters.js

import { getInfo} from '@/api/login'
const getters = {
	    roleSet: state => state.user.roleSet,
  		permissions: state => state.user.permissions,
}
export default getters

store\user.js

  const user = { 
     state: {
		roleSet: [],
	    permissions: [],
	},
	mutations:	{
		 SET_ROLES: (state, roles) => {
	      state.roleSet = roles
	    },
	    SET_PERMISSIONS: (state, permissions) => {
	      state.permissions = permissions
	    },
	},
	actions: {
		    // 获取用户信息
    GetInfo({ commit, state }) {
		      return new Promise((resolve, reject) => {
		        getInfo(state.token).then(res => {
		          const user = res.user
		          if (user.userAvatar == '' || user.userAvatar== null || user.userAvatar ==undefined){
		            if (user.userSex == '1'){
		              commit('SET_AVATAR',require("@/assets/img/womenHead.png"))
		            }else {
		              commit('SET_AVATAR',require("@/assets/img/manHead.png"))
		            }
		          }else {
		            commit('SET_AVATAR',process.env.VUE_APP_BASE_API+'/attach/i/' + user.userAvatar)
		          }
		
		          // const avatar = user.userAvatar == "" ? (user.userSex=='1'? require("@/assets/img/womenHead.png"):require("@/assets/img/manHead.png")) : process.env.VUE_APP_BASE_API+'/attach/i/' + user.userAvatar;
		          // const avatar = user.userAvatar == "" ? require("@/assets/image/login.png") : that.$store.state.user.avatar;
		          if (res.roleSet && res.roleSet.length > 0) { // 验证返回的roles是否是一个非空数组
		            commit('SET_ROLES', res.roleSet)
		            commit('SET_PERMISSIONS', res.permissions)
		          } else {
		            commit('SET_ROLES', ['ROLE_DEFAULT'])
		          }
		          commit('SET_NAME', user.userName)
		          commit('SET_FULLNAME', user.fullName)
		          // commit('SET_AVATAR', avatar)
		          commit('SET_USERID',user.userId)
		          // console.log("123",avatar)
		          commit('SET_PWDFLAG',res.pwdFlag)
		          commit('SET_MESSAGENUM',res.messageNum)
		          resolve(res)
		        }).catch(error => {
		          reject(error)
		        })
		      })
		    },
	}
}

api\login.js

import request from '@/utils/request'
// 获取用户详细信息
export function getInfo() {
  return request({
    url: '/getInfo',
    method: 'get'
  })
}
<el-button @click="reply" class="btnTwo btnSimple" v-if="replyFlag == 1" v-hasRole="['ORGAN:leader','TRADE:admin']" > 审核 </el-button>
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值