在大多数情况下,你都可以操作数据来修改视图,或者反之。但是还是避免不了偶尔要操作原生 DOM,这时候,你就能用到自定义指令。
举个例子,你想让页面的文本框自动聚焦,在没有学习自定义指令的时候,我们可能会这么做。
const app = Vue.createApp({ mounted(){ this.$refs.input.focus(); }, template: `<input type="text" ref="input" />`, });
在mounted钩子函数里,通过 $refs 获取需要聚焦的 DOM 元素,然后调用 focus 方法完成自动聚焦的功能。
基本使用
上面做法已经实现了我们需要的功能,但是假如说我们有多个组件都需要这个功能,那我们只能把这段代码复制过去,重新实现逻辑。我们下面看下如果使用自定义指令,应该怎么做。
const app = Vue.createApp({ // 通过 v-[自定义指令名称] 绑定自定义指令 template: `<input type="text" v-focus/>`, }); // 注册一个全局自定义指令 app.directive('focus',{ // 当被绑定的元素插入到DOM的时候执行.. mounted(el){ el.focus(); } })
如上,我们定义了一个全局自定义指令 focus,并通过 v-focus 绑定到需要聚焦的 input 元素上。如果,其他组件或模块也需要聚焦功能,只要简单的绑定此指令即可。
自定义指令的钩子函数
我们在上面定义指令的时候,会发现其中包含了 mounted 钩子函数,指令还提供了如下钩子函数,我们用代码的形式来给大家列出来。
app.directive('directiveName', { // 指令绑定元素挂载前 beforeMount(el) {}, // 指令绑定元素挂载后 mounted(el, binding) {}, // 指令绑定元素因为数据修改触发修改前 beforeUpdate(el) {}, // 指令绑定元素因为数据修改触发修改后 updated(el) {}, // 指令绑定元素销毁前 beforeUnmount(el) {}, // 指令绑定元素销毁后 unmounted(el) {}, });
效果就不一一列举了,有兴趣大家可以尝试下分别触发这些钩子函数。指令钩子函数大部分与组件很类似,大家可以对比着来看。
动态指令参数
下面,我们再来看一个例子。
const app = Vue.createApp({ template: `<div class="box" v-abs-top="num" style="position:absolute;" ></div>`, }); // 在很多时候,你可能想在 mounted 和 updated 时触发相同行为,而不关心其它的钩子,就这样写 app.directive('absTop', (el) => { el.style[binding.arg] = '100px'; });
我们在 div 元素上绑定 absTop 指令,div 元素本身定位是 absolute,指令执行让绑定元素的 top 为 100px。这时候,我想在绑定指令的时候能够传一个参数,使得元素的 top 值可以根据参数来改变。代码如下:
const app = Vue.createApp({ data() { return { num: 100 } }, template: `<div class="box" v-abs-top="num"></div>`, }); app.directive('absTop', (el, binding) => { el.style.top = binding.value + 'px'; });
元素可以通过 v-directive="value" 传入动态参数,指令通过钩子函数的第二个参数 binding.value 来接收参数。
如果其他元素可能不是修改 top 的值,有可能是 left、right 或者 bottom,那么指令可以动态指定吗?其实也是可以做到的。首先,我们修改模板为:
<div class="box" v-abs:left="num"></div>
然后修改指令本身
app.directive('absTop', (el, binding) => { el.style[binding.arg] = binding.value + 'px'; });
在 v-mydirective:[argument]="value" ,arguments 也是可以动态改变的,这样,就可以完美的实现上述要求了。
组件的使用
组件中绑定指令与 DOM元素绑定指令并没有什么不同,指令会获取组件的原生 根DOM 来操作。但是要注意的是,在 vue3.0 中,组件可能有多个根节点,指令绑定在多根节点组件是有问题的。
局部自定义指令
最后,再来简单说下局部自定义指令是怎么定义的。
const app = Vue.createApp({ directives: { focus: { // 指令的定义 mounted(el) { el.focus() } } } }
局部指令定义和全局指令基本一致,如上所示,在组件中定义 directives 就可以了。
总结
自定义指令可以提取出原生DOM操作的逻辑。所以指令的应用范围主要表现在,当一些操作涉及到 DOM 底层时,而且操作逻辑可能用于多处地方,就适合用指令来封装这些逻辑。
vue3.0,drectives
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]