摘要:使用场景代码复用和抽象的主要形式是组件当需要对普通元素进行底层操作,此时就会用到自定义指令但是,对于大幅度的变动,还是应该使用组件钩子函数详情查阅文档示例输入框自动聚焦注册一个全局自定义指令当被绑定的元素插入到中时聚焦元素下拉菜单点击
1. 使用场景
代码复用和抽象的主要形式是组件
当需要对普通 DOM 元素进行底层操作,此时就会用到自定义指令
但是,对于大幅度的 DOM 变动,还是应该使用组件
2. 钩子函数详情查阅文档 https://cn.vuejs.org/v2/guide/custom-directive.html#%E9%92%A9%E5%AD%90%E5%87%BD%E6%95%B0
3. 示例 3.1 输入框自动聚焦// 注册一个全局自定义指令 `v-focus` Vue.directive("focus", { // 当被绑定的元素插入到 DOM 中时 inserted: function (el) { // 聚焦元素 el.focus() } })3.2 下拉菜单
点击下拉菜单本身不会隐藏菜单
点击下拉菜单以外的区域隐藏菜单
Vue.directive("clickoutside", { bind(el, binding) { function documentHandler(e) { if (el.contains(e.target)) { return false } if (binding.expression) { binding.value(e) } } el.__vueMenuHandler__ = documentHandler document.addEventListener("click", el.__vueMenuHandler__) }, unbind(el) { document.removeEventListener("click", el.__vueMenuHandler__) delete el.__vueMenuHandler__ } }) new Vue({ el: "#app", data: { show: false }, methods: { handleHide() { this.show = false } } })
3.3 相对时间转换
类似微博、朋友圈发布动态后的相对时间,比如刚刚、两分钟前等等
new Vue({ el: "#app", data: { time: 1565753400000 } }) Vue.directive("relativeTime", { bind(el, binding) { // Time.getFormatTime() 方法,自行补充 el.innerHTML = Time.getFormatTime(binding.value) el.__timeout__ = setInterval(() => { el.innerHTML = Time.getFormatTime(binding.value) }, 6000) }, unbind(el) { clearInterval(el.innerHTML) delete el.__timeout__ } })3.4 滚动动画
Scroll me
Lorem ipsum dolor sit amet, consectetur adipisicing elit. A atque amet harum aut ab veritatis earum porro praesentium ut corporis. Quasi provident dolorem officia iure fugiat, eius mollitia sequi quisquam.
Vue.directive("scroll", { inserted: function(el, binding) { let f = function(evt) { if (binding.value(evt, el)) { window.removeEventListener("scroll", f) } } window.addEventListener("scroll", f) } }) // main app new Vue({ el: "#app", methods: { handleScroll: function(evt, el) { if (window.scrollY > 50) { TweenMax.to(el, 1.5, { y: -10, opacity: 1, ease: Sine.easeOut }) } return window.scrollY > 100 } } })
body { font-family: "Abhaya Libre", Times, serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background: #000; color: #fff; overflow-x: hidden; } h1, h2, h3, h4 { font-family: "Fira Sans", Helvetica, Arial, sans-serif; font-weight: 800; } .centered { margin: 0 auto; display: table; font-size: 60px; margin-top: 100px; } .box { border: 1px solid rgba(255, 255, 255, 0.5); padding: 8px 20px; line-height: 1.3em; opacity: 0; color: white; width: 200px; margin: 0 auto; margin-top: 30px; transform: translateZ(0); perspective: 1000px; backface-visibility: hidden; background: rgba(255, 255, 255, 0.1); } #app { height: 2000px; }4. 参考资料
《Vue.js 实战》 作者:梁灏
【译】vue 自定义指令的魅力
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/106790.html
摘要:具体步骤实现将需要的数据对象进行递归遍历,包括子属性对象的属性,都加上和。综上,在性能上的收益并不是最主要的,更重要的是它使得具备了现代框架应有的高级特性。 原文:你应该要知道的Vue.js 组件data为什么必须是函数? 因为组件可能被多处使用,但他们的data是私有的,所以每个组件都要return一个新的data对象 组件通信 父子组件通信:$on、$emit 非父子组件的通信...
摘要:注意此处获取的数据是更新后的数据,但是获取页面中的元素是更新之前的钩子函数说明组件已经更新,所以你现在可以执行依赖于的操作。钩子函数说明实例销毁 Vue -渐进式JavaScript框架 介绍 vue 中文网 vue github Vue.js 是一套构建用户界面(UI)的渐进式JavaScript框架 库和框架的区别 我们所说的前端框架与库的区别? Library 库,本质上是一...
摘要:指令绑定的前一个值,仅在和钩子中可用。字符串形式的指令表达式。上一个虚拟节点在上可根据需要定义一些钩子函数只调用一次,指令第一次绑定到元素时调用。指令的值可能发生了改变,也可能没有。 前文 先来bb一堆废话哈哈.. 用vue做项目也有一年多了.除了用别人的插件之外.自己也没尝试去封装指令插件之类的东西来用. 刚好最近在项目中遇到一个问题.(快速点击按钮多次触发多...
阅读 1743·2021-09-22 15:25
阅读 1306·2019-08-29 12:34
阅读 1907·2019-08-26 13:57
阅读 3188·2019-08-26 10:48
阅读 1443·2019-08-26 10:45
阅读 792·2019-08-23 18:23
阅读 733·2019-08-23 18:01
阅读 1944·2019-08-23 16:07