北京公司做网站,公众号管理平台,wordpress更换后台登录界面logo,动画设计与制作主要学什么文章目录 注册局部注册全局注册 钩子钩子参数应用1、按钮权限验证2、自定义用户行为收集指令3、按钮点击防抖4、输入框自动获取焦点5、输入框自动去空字符串6、文字展示不下时展示提示框 注册
局部注册
export default {setup() {/*...*/},directives: {// 在模板中启用 v-fo… 文章目录 注册局部注册全局注册 钩子钩子参数应用1、按钮权限验证2、自定义用户行为收集指令3、按钮点击防抖4、输入框自动获取焦点5、输入框自动去空字符串6、文字展示不下时展示提示框 注册
局部注册
export default {setup() {/*...*/},directives: {// 在模板中启用 v-focusfocus: {/* ... */}}
}全局注册
const app createApp({})// 使 v-focus 在所有组件中都可用
app.directive(focus, {/* ... */
})钩子
const myDirective {// 在绑定元素的 attribute 前// 或事件监听器应用前调用created(el, binding, vnode) {// 下面会介绍各个参数的细节},// 在元素被插入到 DOM 前调用beforeMount(el, binding, vnode) {},// 在绑定元素的父组件// 及他自己的所有子节点都挂载完成后调用mounted(el, binding, vnode) {},// 绑定元素的父组件更新前调用beforeUpdate(el, binding, vnode, prevVnode) {},// 在绑定元素的父组件// 及他自己的所有子节点都更新后调用updated(el, binding, vnode, prevVnode) {},// 绑定元素的父组件卸载前调用beforeUnmount(el, binding, vnode) {},// 绑定元素的父组件卸载后调用unmounted(el, binding, vnode) {}
}钩子参数
指令的钩子会传递以下几种参数
el指令绑定到的元素。这可以用于直接操作 DOM。binding一个对象包含以下属性。 value传递给指令的值。例如在 v-my-directive“1 1” 中值是 2。oldValue之前的值仅在 beforeUpdate 和 updated 中可用。无论值是否更改它都可用。arg传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中参数是 “foo”。modifiers一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中修饰符对象是 { foo: true, bar: true }。instance使用该指令的组件实例。dir指令的定义对象。 vnode代表绑定元素的底层 VNode。prevVnode代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。
应用
1、按钮权限验证 功能描述 项目根据登录用户所配置的角色权限对按钮进行权限控制拥有权限的按钮才能够触发点击事件没有权限的按钮触发时进行提示。 /*** # 验证用户权限, 并进行提示** example* vue* el-button* v-auth{* code: AuthCode.UPLOAD_FILE,* name: AuthName.UPLOAD_FILE,* event: handleUploadConfirm,* projectId* }* * 确认上传* /el-button* ** param code 权限 code* param name 权限对应中文名* param event 权限验证通过后要执行的函数* param projectId? 可选, 项目 id* param type 两种验证模式 project | role 如果是 role, 则通过默认角色权限进行判断, 如果是 project, 则通过项目权限进行判断*/
export default Directive{mounted(el: HTMLElement, bindings) {if (!bindings.value) {throw new Error(value 不能为空)}if (typeof bindings.value ! object) {throw new Error(value 必须为对象)}const {code,name,event,type,projectId,bindEvent click} bindings.valueel.addEventListener(bindEvent, () {if (!checkAuth(code, name, projectId, type)) {return}if (typeof event function) {event()}})}
}/*** param code 权限 code* param name 权限名称* param projectId 项目 id* param type 两种验证模式 project | role 如果是 role, 则通过默认角色权限进行判断, 如果是 project, 则通过项目权限进行判断* returns*/
function checkAuth(code?: string,name?: string,projectId?: string,type project
) {if (!code) {throw new Error(权限名称不能为空)}const userStore useUserStore()let auth falseif (type project projectId) {auth checkProject(code, projectId)} else if (type role) {auth checkRole(code)}if (!auth) {// 用户没有该权限ElMessage.warning(您没有 ${name} 权限无法执行该操作)return false}return true
}function checkProject(code: string, projectId: string) {...
}function checkRole(code: string) {...
}2、自定义用户行为收集指令 功能描述需要对项目中用户的行为进行收集以备后续的日志记录查询或者用户行为分析。 比如记录哪个用户在什么时间在哪个页面触发了什么功能。支持按钮按钮行为收集、非按钮点击行为收集。 /*** example* el-link* typeprimary* v-collect* clickgetRoleAuthList(row)* * 查看* /el-link* * el-button* sizelarge* typeprimary* v-collect* clickhandleClickMove* * 新增项目* /el-button* * 自定义用户行为收集指令*/
export default Directive{mounted(el: HTMLElement, bindings) {// 可以根据当前路由转换得到中文的页面const pathname window.location.pathnameconst userInfo getUserInfo()el.addEventListener(mousedown, e {e.stopPropagation()const collect getCollect()const path: string bindings.value || (el.textContent as string)let name (path?.trim())?.trim() || if (name.startsWith(/)) {name name.slice(1)}collect.push({userId: userInfo.id,operateTime: getTime(),page: pathname,operateName: name})setCollect(collect)})}
}const collectKey USER_SELECT
function getCollect(): Collect[] {const collect window.localStorage.getItem(collectKey) || []return JSON.parse(collect)
}function setCollect(collect: Collect[]) {window.localStorage.setItem(collectKey, JSON.stringify(collect))
}
3、按钮点击防抖 功能描述点击按钮进行操作时防止用户短时间点击多次触发多次事件为按钮点击事件添加防抖功能默认 1 秒以内重复点击无效。实现方案是点击按钮触发一次事件给按钮设置 disabaled 属性为 true1 秒后删除该限制。 /*** example* el-button v-clicked:500/el-button* * param delay number类型, 设置禁止点击的时间间隔, 默认1000*/export default {mounted(el: HTMLElement | HTMLButtonElement, bindings: DirectiveBinding) {let timer: number | null nulllet delay 1000const oldEvents el.style.pointerEventsif (bindings.arg) {if (!/^\d$/.test(bindings.arg)) {throw new Error(参数必须是数字)}delay Number(bindings.arg)}el.addEventListener(click, setDisabled)function setDisabled() {el.setAttribute(disabled, true)// el.classList.add(is-disabled)if (el.tagName ! BUTTON) {el.style.pointerEvents none // 点击不到按钮穿透到下层元素}if (timer) {window.clearTimeout(timer)timer null}timer window.setTimeout(() {// el.classList.remove(is-disabled)el.removeAttribute(disabled)el.style.pointerEvents oldEvents}, delay)}}
}4、输入框自动获取焦点 功能描述页面加载之后自动聚焦到某个输入框使输入框处于输入状态 /**
* example
* el-input v-focus/el-input
*/
export default {mounted(el: HTMLElement | HTMLInputElement) {let ipt: HTMLInputElement | nullif (el.nodeName INPUT) {ipt el as HTMLInputElement} else {ipt el.querySelector(.el-input__inner) as HTMLInputElement}ipt (ipt as HTMLInputElement).focus()}
}5、输入框自动去空字符串
interface HTMLElementPlus extends HTMLElement {_handler: (e: KeyboardEvent) void_ele: HTMLElementPlus
}
export default {mounted(el: HTMLElementPlus) {let iptif (el.nodeName INPUT) {ipt el} else {ipt el.querySelector(.el-input__inner)}const handler (e: KeyboardEvent) {if (e.code Space) {e.preventDefault()}}el._ele ipt as HTMLElementPlusel._handler handler;(ipt as HTMLElementPlus).addEventListener(keydown, handler)},unmounted(el: HTMLElementPlus) {const { _ele } el_ele.removeEventListener(keydown, _ele._handler)}
}6、文字展示不下时展示提示框 功能描述项目里经常有一些列表有展示性文字有的项文字展示的全有的项文字展示不全如果简单粗暴的添加提示文字会使得展示全的文字也有提示文字不太友好。通过该自定义指令只对展示不全的文字添加文字提示。 /*** 根据字符长度控制 el-tooltip 的显隐* 1.单行文本使用需在对应组件定义moveTodisabled* 例* const moveTodisabled ref({disablesd: true})* el-tooltip:contentitem.name:disabledmoveTodisableddiv v-tooltipmoveTodisabled{{ item.name }}/div/el-tooltip*//*** 2.列表使用, 参数: listindex(当前索引)例el-option v-for(item, index) in fileNameList :keyitem.id :labelitem.name :valueitem.nameel-tooltip:contentitem.name:disableditem.moveTodisableddiv v-tooltip:[index]fileNameList classcustom-dropdown-item{{ item.name }}/div/el-tooltip/el-option*/
interface Actual {width: numberelement: HTMLSpanElement
}
interface HTMLElementPlus extends HTMLElement {_handler: () void_handler2: () void_ele: HTMLElementPlus_ele_temp: HTMLSpanElement | null
}function getActualWidth(text: string, fontSize: string): Actual {const span: HTMLSpanElement document.createElement(span)span.innerText textspan.style.cssText visibility:hidden;position:absolute;z-index:-1;top:0;font-size: fontSizedocument.body.appendChild(span)const rect span.getBoundingClientRect()// offsetWidth 是整数return { width: Math.round(rect.width), element: span }
}function destoryEle(ele: HTMLSpanElement) {ele.parentNode?.removeChild(ele)
}export default {mounted(el: HTMLElementPlus, binding: DirectiveBinding) {const handler () {const fontSize getComputedStyle(el, null).fontSizeconst { width, element }: Actual getActualWidth(el.innerText, fontSize)el._ele_temp element as HTMLSpanElementif (el.offsetWidth width) {if (!isNaN(index)) {binding.value[index].moveTodisabled false} else {binding.value.disabled false}} else {if (!isNaN(index)) {binding.value[index].moveTodisabled true} else {binding.value.disabled true}}}const handle2 () {destoryEle(el._ele_temp as HTMLSpanElement)el._ele_temp null}el._handler handlerel._handler2 handle2el._ele elel.addEventListener(mouseenter, handler)el.addEventListener(mouseout, handle2)},unmounted(el: HTMLElementPlus) {const { _ele } el_ele.removeEventListener(mouseenter, _ele._handler)_ele.removeEventListener(mouseout, _ele._handler2)}
}
文章转载自: http://www.morning.zgdnd.cn.gov.cn.zgdnd.cn http://www.morning.xcjwm.cn.gov.cn.xcjwm.cn http://www.morning.wptdg.cn.gov.cn.wptdg.cn http://www.morning.zdsqb.cn.gov.cn.zdsqb.cn http://www.morning.rbnj.cn.gov.cn.rbnj.cn http://www.morning.pzpj.cn.gov.cn.pzpj.cn http://www.morning.pqyms.cn.gov.cn.pqyms.cn http://www.morning.bntgy.cn.gov.cn.bntgy.cn http://www.morning.xbzfz.cn.gov.cn.xbzfz.cn http://www.morning.tsyny.cn.gov.cn.tsyny.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.cbpmq.cn.gov.cn.cbpmq.cn http://www.morning.fflnw.cn.gov.cn.fflnw.cn http://www.morning.ypklb.cn.gov.cn.ypklb.cn http://www.morning.fnrkh.cn.gov.cn.fnrkh.cn http://www.morning.ghxsn.cn.gov.cn.ghxsn.cn http://www.morning.qyqmj.cn.gov.cn.qyqmj.cn http://www.morning.nrpp.cn.gov.cn.nrpp.cn http://www.morning.rqkk.cn.gov.cn.rqkk.cn http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn http://www.morning.ydrml.cn.gov.cn.ydrml.cn http://www.morning.tnzwm.cn.gov.cn.tnzwm.cn http://www.morning.tlzbt.cn.gov.cn.tlzbt.cn http://www.morning.qbfwb.cn.gov.cn.qbfwb.cn http://www.morning.fgtls.cn.gov.cn.fgtls.cn http://www.morning.cmcjp.cn.gov.cn.cmcjp.cn http://www.morning.ygkk.cn.gov.cn.ygkk.cn http://www.morning.rzczl.cn.gov.cn.rzczl.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.jfjqs.cn.gov.cn.jfjqs.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.wtwhj.cn.gov.cn.wtwhj.cn http://www.morning.zthln.cn.gov.cn.zthln.cn http://www.morning.trffl.cn.gov.cn.trffl.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.drtgt.cn.gov.cn.drtgt.cn http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn http://www.morning.knzmb.cn.gov.cn.knzmb.cn http://www.morning.dpjtn.cn.gov.cn.dpjtn.cn http://www.morning.dyght.cn.gov.cn.dyght.cn http://www.morning.bbrf.cn.gov.cn.bbrf.cn http://www.morning.lqjlg.cn.gov.cn.lqjlg.cn http://www.morning.hngmg.cn.gov.cn.hngmg.cn http://www.morning.lwrcg.cn.gov.cn.lwrcg.cn http://www.morning.nbpqx.cn.gov.cn.nbpqx.cn http://www.morning.qllcm.cn.gov.cn.qllcm.cn http://www.morning.kwqqs.cn.gov.cn.kwqqs.cn http://www.morning.nzfqw.cn.gov.cn.nzfqw.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.fmkjx.cn.gov.cn.fmkjx.cn http://www.morning.rynrn.cn.gov.cn.rynrn.cn http://www.morning.yrrnx.cn.gov.cn.yrrnx.cn http://www.morning.dwdjj.cn.gov.cn.dwdjj.cn http://www.morning.dhbyj.cn.gov.cn.dhbyj.cn http://www.morning.gslz.com.cn.gov.cn.gslz.com.cn http://www.morning.mgwpy.cn.gov.cn.mgwpy.cn http://www.morning.dqwkm.cn.gov.cn.dqwkm.cn http://www.morning.qynpw.cn.gov.cn.qynpw.cn http://www.morning.tldhq.cn.gov.cn.tldhq.cn http://www.morning.pqqxc.cn.gov.cn.pqqxc.cn http://www.morning.rongxiaoman.com.gov.cn.rongxiaoman.com http://www.morning.rjhts.cn.gov.cn.rjhts.cn http://www.morning.kphyl.cn.gov.cn.kphyl.cn http://www.morning.xuejitest.com.gov.cn.xuejitest.com http://www.morning.wffxr.cn.gov.cn.wffxr.cn http://www.morning.wcghr.cn.gov.cn.wcghr.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.ltdxq.cn.gov.cn.ltdxq.cn http://www.morning.httzf.cn.gov.cn.httzf.cn http://www.morning.qqhersx.com.gov.cn.qqhersx.com http://www.morning.rhpgk.cn.gov.cn.rhpgk.cn http://www.morning.zrgx.cn.gov.cn.zrgx.cn http://www.morning.frpm.cn.gov.cn.frpm.cn http://www.morning.mhmdx.cn.gov.cn.mhmdx.cn http://www.morning.bxqtq.cn.gov.cn.bxqtq.cn http://www.morning.pfkrw.cn.gov.cn.pfkrw.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.wdply.cn.gov.cn.wdply.cn http://www.morning.rhgtc.cn.gov.cn.rhgtc.cn http://www.morning.rgpsq.cn.gov.cn.rgpsq.cn