javascript - 页面重新加载时计算属性中的 window.scrollY 为 0,在热重载时工作正常

标签 javascript vue.js

<div id="component-navbar" :class="hasBackground">
computed: {
  hasBackground() {
    if (window.scrollY > 0) {
      return 'has-background'
    }
  }
}

我有一个粘性导航栏,如果页面滚动大于 0,我想添加背景。问题是,hasBackground

  1. 滚动变化时不会重新计算
  2. 页面刷新时,即使页面滚动,window.scrollY 始终为零
  3. 仅在对文件进行更改时才适用于热重载。

我该怎么做?

最佳答案

正如@obermillerk所说:

The window object cannot be observed properly in vue.

所以你有两个选择:

  1. 在组件初始化时读取 window.scrollY
  2. 添加window.addEventListener('scroll', ..., { Passive: true })

组件初始化时读取window.scrollY

Vue.component('component-navbar', {
  computed: {
    hasBackground () {
      console.log('window.scrollY', window.scrollY)
      if (window.scrollY > 0) {
        return 'has-background'
      }
    }
  },
  template: '<nav :class="hasBackground"></nav>'
})

const app = new Vue({
  el: '#app'
})
#app {
  min-height: 110vh;
}
nav {
  min-height: 50vh;
}
nav.has-background {
  background: linear-gradient(red, orange);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<article id="app">
  <component-navbar></component-navbar>
</article>

添加window.addEventListener('scroll', ..., { Passive: true })

Vue.component('component-navbar', {
  data () {
    return {
      isScrolled: false
    }
  },

  computed: {
    hasBackground () {
      if (this.isScrolled) {
        return 'has-background'
      }
    }
  },

  template: '<nav :class="hasBackground"></nav>',

  mounted () {
    window.addEventListener('scroll', this.setIsScrolled, { passive: true })
    this.setIsScrolled()
  },

  destroyed () {
    window.removeEventListener('scroll', this.setIsScrolled, { passive: true })
  },

  methods: {
    setIsScrolled () {
      this.isScrolled = window.scrollY > 0
    }
  },
})

const app = new Vue({
  el: '#app'
})
#app {
  min-height: 110vh;
}
nav {
  min-height: 50vh;
}
nav.has-background {
  background-image: linear-gradient(red, orange);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.min.js"></script>
<article id="app">
  <component-navbar></component-navbar>
</article>

关于javascript - 页面重新加载时计算属性中的 window.scrollY 为 0,在热重载时工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55833692/

相关文章:

javascript - 在 C3/D3 中修改圆环图切片

javascript - 使用 jquery 或 js 根据浏览器宽度动态更改 css 属性

javascript - 可以在 Vue.js 文档之外分离和重新附加 Vue.js 节点吗?

vue.js - Vue JS 项目的架构注意事项 : Implementing Vuex

javascript - 如何在没有 Html-Imports 的情况下打包或导入 Html-Templates

javascript - 更改 img 的来源

javascript - 根据同一表行中输入框的最高值查找元素

javascript - 如何重写此 ES6 代码以与 Safari 兼容?

javascript - Algolia - 获取所有唯一标签及其总数

javascript - Vue js vue cli3 应用程序在 ie11 中不起作用(babel 没有加载 polyfills?)