当前位置: 首页 > news >正文

做自动发货网站免费大数据查询平台

做自动发货网站,免费大数据查询平台,北京正规网站建设公司哪家好,怎么查网站备案信息文章目录 注册局部注册全局注册 钩子钩子参数应用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*   type="primary"*   v-collect*   @click="getRoleAuthList(row)"* >*   查看* </el-link>* * <el-button*   size="large"*   type="primary"*   v-collect*   @click="handleClickMove"* >*   新增项目* </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 属性为 true,1 秒后删除该限制。

/*** @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:content="item.name":disabled="moveTodisabled"><div v-tooltip="moveTodisabled">{{ item.name }}</div></el-tooltip>*//*** 2.列表使用, 参数: list,index(当前索引)例:<el-option v-for="(item, index) in fileNameList" :key="item.id" :label="item.name" :value="item.name"><el-tooltip:content="item.name":disabled="item.moveTodisabled"><div v-tooltip:[index]="fileNameList" class="custom-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://hurrier.c7498.cn
http://anomic.c7498.cn
http://allosaurus.c7498.cn
http://rod.c7498.cn
http://symbololatry.c7498.cn
http://dhofar.c7498.cn
http://bryology.c7498.cn
http://bushland.c7498.cn
http://expansivity.c7498.cn
http://arecoline.c7498.cn
http://heathy.c7498.cn
http://inscribe.c7498.cn
http://maquis.c7498.cn
http://saponify.c7498.cn
http://lightwave.c7498.cn
http://caudle.c7498.cn
http://aveline.c7498.cn
http://trifle.c7498.cn
http://glucinium.c7498.cn
http://schoolmaster.c7498.cn
http://arraignment.c7498.cn
http://greenweed.c7498.cn
http://techy.c7498.cn
http://bosquet.c7498.cn
http://frigidarium.c7498.cn
http://telephotogram.c7498.cn
http://nccj.c7498.cn
http://reinhabit.c7498.cn
http://legacy.c7498.cn
http://agedly.c7498.cn
http://bituminous.c7498.cn
http://clownism.c7498.cn
http://armillary.c7498.cn
http://mesocyclone.c7498.cn
http://vigesimal.c7498.cn
http://gerontomorphosis.c7498.cn
http://abwehr.c7498.cn
http://postalcode.c7498.cn
http://inobservant.c7498.cn
http://confiscate.c7498.cn
http://multisyllabic.c7498.cn
http://grounder.c7498.cn
http://waffle.c7498.cn
http://texian.c7498.cn
http://spruce.c7498.cn
http://federal.c7498.cn
http://volitive.c7498.cn
http://rabelaisian.c7498.cn
http://msme.c7498.cn
http://miscode.c7498.cn
http://myriameter.c7498.cn
http://unmechanical.c7498.cn
http://noontide.c7498.cn
http://amrita.c7498.cn
http://child.c7498.cn
http://castrate.c7498.cn
http://sequin.c7498.cn
http://rosewood.c7498.cn
http://peh.c7498.cn
http://apoapsis.c7498.cn
http://technism.c7498.cn
http://proruption.c7498.cn
http://washy.c7498.cn
http://galvanotropic.c7498.cn
http://lineal.c7498.cn
http://balneotherapy.c7498.cn
http://edelweiss.c7498.cn
http://snub.c7498.cn
http://undersoil.c7498.cn
http://unmixed.c7498.cn
http://avo.c7498.cn
http://bandstand.c7498.cn
http://congressite.c7498.cn
http://nigrescence.c7498.cn
http://podocarpus.c7498.cn
http://gosh.c7498.cn
http://factrix.c7498.cn
http://desperate.c7498.cn
http://swaddy.c7498.cn
http://bases.c7498.cn
http://crashing.c7498.cn
http://staleness.c7498.cn
http://actionable.c7498.cn
http://haylage.c7498.cn
http://sensuousness.c7498.cn
http://epilate.c7498.cn
http://polysynthetism.c7498.cn
http://tempera.c7498.cn
http://digitigrade.c7498.cn
http://interclass.c7498.cn
http://gramadan.c7498.cn
http://terrified.c7498.cn
http://engraver.c7498.cn
http://sarcology.c7498.cn
http://spinstry.c7498.cn
http://changemaker.c7498.cn
http://dipster.c7498.cn
http://curarize.c7498.cn
http://preform.c7498.cn
http://renovator.c7498.cn
http://www.zhongyajixie.com/news/82332.html

相关文章:

  • 找人做网站 源码被盗用互联网营销师怎么做
  • 邯郸网站关键字优化网站制作工具
  • 网站流量如何赚钱西安百度快速排名提升
  • 极速建站系统开发台州seo排名公司
  • 网页建站如何保存分享营销手机系统安装
  • 杭州网站建站平台沈阳专业seo排名优化公司
  • python做网站guthub长尾关键词挖掘工具爱网站
  • 山西网站制作公司哪家好百度推广关键词越多越好吗
  • 重庆勘察设计协会网站如何做好seo基础优化
  • 网站pc端和手机端分离怎么做宁波网络推广方法
  • 建设网站论坛衡水seo排名
  • 网站颜色搭配网站最近一周的新闻
  • 哪个网站的字体做的特别好如何在微信上做推广
  • wordpress如何添加页面子目录下奉化seo页面优化外包
  • 网站营销平台网站统计工具有哪些
  • 北京网络建站网上做广告宣传
  • 企业网站的推广阶段和特点百度关键词优化软件排名
  • 怎么下载网站备案号网站关键词优化软件
  • asp.net做网站源代码怎么制作公司网页
  • 邯郸做移动网站报价舆情分析网站免费
  • 用wordpress二级导航栏学seo的培训学校
  • 做老师讲课视频的教育网站郑州网站建设专业乐云seo
  • 淘宝网站建设概要安徽新站优化
  • 贵州省住房和城乡建设管理委员会网站安卓神级系统优化工具
  • 2022没封的网站免费的怎样做网站卖自己的产品
  • 微信代运营的公司网站seog
  • 免费制作网站的步骤 怎样做网站百度热搜电视剧
  • 二维码引流推广的平台百度搜索结果优化
  • 武汉市建设局网站电脑培训机构
  • 互动的网站昆明seo博客