1.手写实现

src\layout\components\headerSticky.vue

  1. <template>
  2. <div class="app-header-sticky" :class="{show: y>78}">
  3. <div class="container">
  4. <RouterLink class="logo" to="/" />
  5. <AppHeaderNav />
  6. <div class="right">
  7. <RouterLink to="/" >品牌</RouterLink>
  8. <RouterLink to="/" >专题</RouterLink>
  9. </div>
  10. </div>
  11. </div>
  12. </template>
  13. <script>
  14. import { onMounted, onUnmounted, ref } from 'vue'
  15. import AppHeaderNav from './header-nav'
  16. export default {
  17. name: 'AppHeaderSticky',
  18. components: { AppHeaderNav },
  19. setup () {
  20. // 定义一个响应式数据
  21. const y = ref(0)
  22. const update = () => {
  23. y.value = document.documentElement.scrollTop
  24. console.log(y.value)
  25. }
  26. onMounted(() => { window.addEventListener('scroll', update) })
  27. onUnmounted(() => { window.removeEventListener('scroll', update) })
  28. return { y }
  29. }
  30. }
  31. </script>

注意:添加的事件监听要记得移除!!!(因为是给window绑定的事件,不会销毁,造成内存泄漏 )

2.借用vueuse

  1. npm i @vueuse/core

src/components/app-header-sticky.vue

  1. <template>
  2. <div class="app-header-sticky" :class="{show:y>=78}">
  3. <div class="container" v-show="y>=78">
  4. <RouterLink class="logo" to="/" />
  5. <AppHeaderNav />
  6. <div class="left">
  7. <RouterLink to="/" >品牌</RouterLink>
  8. <RouterLink to="/" >专题</RouterLink>
  9. </div>
  10. </div>
  11. </div>
  12. </template>
  13. <script>
  14. import AppHeaderNav from './app-header-nav'
  15. import { useWindowScroll } from '@vueuse/core'
  16. export default {
  17. name: 'AppHeaderSticky',
  18. components: { AppHeaderNav },
  19. setup () {
  20. const { y } = useWindowScroll()
  21. return { y }
  22. }
  23. }
  24. </script>

总结:

  • @vueuse/core: 是配合vue3组合式API一起使用的一个第三方逻辑库。
  • useWindowScroll() 是@vueuse/core提供的api,可返回当前页面滚动时候滚动条的 x(横向),y(纵向)坐标。
  • vue3.0组合API提供了更多逻辑代码封装的能力。@vueuse/core 基于组合API封装工具函数。