首页 > 其他分享 >监听div高度宽度的变化-自定义指令

监听div高度宽度的变化-自定义指令

时间:2022-09-21 21:01:10浏览次数:92  
标签:el 调用 自定义 绑定 binding 指令 div 监听

上篇内容说到,iframe嵌入其他项目页面,iframe实现自适应高度需要监听div页面高度的变化

使用到了局部自定义指定

directives: { // 使用局部注册指令的方式
    resize: { // 指令的名称
      // bind为自定义指令的钩子函数,只调用一次,指令第一次绑定到元素时调用
      bind (el, binding) { // el为绑定的元素,binding为绑定给指令的对象,binding.value为指令的绑定值,例如:v-resize="resize",则binding.value为resize
        let width = ''; let height = ''
        function isReize () {
          // 拿到el绑定元素的style样式
          const style = document.defaultView.getComputedStyle(el)
          // 判断当前的高度宽度是否发生了改变,如果改变了去调用binding.value绑定的函数也就是methods中的resize()方法,如果没有改变则不调用函数
          if (width !== style.width || height !== style.height) {
            binding.value() // 关键
          }
          width = style.width
          height = style.height
        }
        // 每300毫秒调用一次isReize()方法,保证能随时监听el的高度宽度变化
        el.__vueSetInterval__ = setInterval(isReize, 300)
      },
      // unbind也是自定义指令的钩子函数,只调用一次,指令与元素解绑时调用。当解绑时取消掉定时器,避免性能浪费
      unbind (el) {
        clearInterval(el.__vueSetInterval__)
      }
    }
  },
  methods: {
    // 自定义指令的方法
    resize () {
      var hashH = document.documentElement.scrollHeight // 获取自身高度
     // 获取最外层div的高度
      var heightId = document.getElementById('iframe').scrollHeight
      console.log(hashH, 'hashH', heightId)
      // 全局下的parent其实是父页面的对象,所以调用postMessage()调用的也就是父级页面的方法,
      window.parent.postMessage([hashH, heightId], '*')
    },
  }
// 在子页面最外层绑定自定义指令v-resize
<template>
  <div id="iframe" v-resize="resize">
    xxxxxxxx
  </div>
</template>

自定义指令

全局注册

上文中是局部注册,自定义指令也可以全局注册,全局注册之后,可以在项目中任意地方使用

// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
  // 当被绑定的元素插入到 DOM 中时……
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

钩子函数

bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。

componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

unbind:只调用一次,指令与元素解绑时调用。

钩子函数的参数

el:自定义指令绑定的元素,可以用来直接操作 DOM。

binding:一个对象,包含以下 property:
name:指令名,不包括 v- 前缀。
value:指令的绑定值,例如:v-my-directive="1 + 1" 中,绑定值为 2。
oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
expression:字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中,表达式为 "1 + 1"。
arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 "foo"。
modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。

<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +  // demo
      'value: '      + s(binding.value) + '<br>' +  // hello (注意)
      'expression: ' + s(binding.expression) + '<br>' +  // message
      'argument: '   + s(binding.arg) + '<br>' +    // foo
      'modifiers: '  + s(binding.modifiers) + '<br>'   // {'a':true, 'b': true}
  }
})

new Vue({
  el: '#hook-arguments-example',
  data: {
    message: 'hello!'
  }
})

自定义指令也支持动态参数

vue自定义指令官网

标签:el,调用,自定义,绑定,binding,指令,div,监听
From: https://www.cnblogs.com/wang--chao/p/16717130.html

相关文章

  • react-antd组件之Steps组件自定义icon svg图片颜色跟随完成进度改变
    demo.svg<?xmlversion="1.0"encoding="UTF-8"?><svgwidth="58px"height="44px"viewBox="005844"version="1.1"xmlns="http://www.w3.org/2000/svg"xmlns:xli......
  • Spring data Jpa 自定义hql分页,添加动态参数校验1
    一,配置好jpa环境直接上代码1,控制器  其中 pageNumber和pageSize是我们自己前端传,filter中以字符串方式包含所需要的参数2.server  用json将参数解......
  • 博客园自定义主题
    博客园自定义主题背景发现有些博客园博主的主体十分好看,比如:Esofar'sBlog-.NETCore开发工程师,博客园主题Silence作者。静雅斋数学-静雅斋数学作者,专注于高中......
  • systemd 自定义开机启动服务
      #对于那些支持Systemd的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。(以httpd.service为例)systemctlenablehttpd#上面的命令相当......
  • Gradle-自定义生成的apk或aar名称
    Gradle-自定义生成的apk或aar名称我们平时用AndroidStudio打包时候,如果不加规则限制,打包出来的名称都是app-debug.apkapp-release.apkapp.aab那么怎么让我们打包的......
  • Codeforces Round #818 (Div. 2) - D. Madoka and The Corruption Scheme
    思维+组合数学Problem-D-Codeforces题意有\(2^n\)个人进行锦标赛,编号1~\(2^n\),每一场输的人失去比赛资格,赢的人继续。Madoka可以选择他们进行的顺序,以及决定哪一......
  • 奇技淫巧-Unity运行时运行自定义lua代码
    在利用lua开发游戏的过程中经常会遇到需要查询某些数据或调用某些方法,以往查询数据的方法不是用断点就是写好代码后重新运行游戏,lua的断点被吐槽太卡顿,我用的也比较少,......
  • 本周四晚19:00知识赋能第八期第2课丨ArkUI自定义组件
     9月21日19:00~20:00,第八期知识赋能第2节直播就要开始啦!本次直播将为同学们带来涂鸦小游戏的趣味体验,让大家全面了解ArkUI框架的应用,帮助你们在自己已有专业的基础上拓宽知......
  • JS 验证自定义计算公式是否成功
    1、需求1.项目需求表单中填写公式传入后台。2.公式中可以使用汉字英文。3.验证公式是否成功。2、思路1.表单中输入公式存入后台是以字符串的形式传入。2.循环字符串......
  • 在 CSS 中使 div 居中的 5 种方法
    在CSS中使div居中的5种方法5waystocenteradivinCSS你觉得很难在CSS中将div居中吗?你并不孤单,我的兄弟,许多开发人员有时会在将div居中时感到困惑,包括......