javascript - eventListener 'resize' 不会更改 Vue.js 中 data() 变量的值

标签 javascript vue.js addeventlistener

场景: 我有一个 ID 为“slider”的 div,我必须将其 offsetWidth 的 react 值存储在组件数据函数的一个变量中。

所以我做了这样的事情:

<template>
  <div id="slider">
  </div>
</template>

<script>
export default {
  name: 'Slider',
  mounted() {
    window.addEventListener('resize', function () {
      this.sliderWidth = document.getElementById('slider').offsetWidth;
    });
  },
  data() {
    return {
      sliderWidth: 0,
    };
  },
  methods: {
  },
};
</script>

然后我添加了一个方法来查看当前的 sliderWidth 值

methods: {
   callwidth() {
    console.log(this.sliderWidth);
   } 
  },

并将该方法添加到 div 上的@click 事件中:

<div id="slider" @click="callWidth">
</div>

但随后发生了一些奇怪的事情,当我在调整窗口大小后单击 slider 时,它的值始终为 0。

所以我在事件监听器上添加了一个控制台日志,如下所示:

  mounted() {
    window.addEventListener('resize', function () {
      this.sliderWidth = document.getElementById('slider').offsetWidth;
      console.log(this.sliderWidth)
    });
  },

当我调整窗口大小时,它每次都会在事件监听器的控制台日志中抛出一个新值,但是如果我点击 div,callWidth 函数的 console.log 抛出 0,这是为什么?

最佳答案

这是因为您的 this 作用域在事件处理程序中是不同的。尝试:

  mounted() {
    let _this = this;
    window.addEventListener('resize', function () {
      _this.sliderWidth = document.getElementById('slider').offsetWidth;
      console.log(_this.sliderWidth)
    });
  },

关于javascript - eventListener 'resize' 不会更改 Vue.js 中 data() 变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49516725/

相关文章:

javascript - addEventListener 使用 for 循环并传递值

javascript - 为什么 classList.remove 不起作用,而 jQuery .removeClass 却起作用?

javascript - 比较和分配数字

javascript - 如何使用混合参数调用父级作用域函数?

javascript - Vuejs 2 : Change second select list according to first

vue.js - 带有 Vue 和 vue-cli-plugin-electron-builder 的 Electron 应用程序无法与 Tesseract.js 一起使用

javascript - 无法从 Ajax 购物车中删除商品

javascript - 从 URL 将变量传递到简单模态弹出窗口

javascript - 视觉 : How to bind property dynamically to a new DOM element

reactjs - 如何在react中监听localstorage值的变化?