useWindowResize

这个一个经典的 hook 例子,窗口尺寸发生改变,与其他功能代码无关,可以抽为单独的 hook 。

使用到 Vue3 的新特性

1. ref

使用它来保存响应式变量 width 、 height 的值。

2. onMounted

生命周期函数,用来给 window 绑定 resize 事件监听。

3. onUnmounted

生命周期函数,用来给 window 取消绑定 resize 事件监听。

完整 hook 代码

  1. import { onMounted, onUnmounted, ref } from "vue";
  2. function useWindowResize() {
  3. const width = ref(0);
  4. const height = ref(0);
  5. function onResize() {
  6. width.value = window.innerWidth;
  7. height.value = window.innerHeight;
  8. }
  9. onMounted(() => {
  10. window.addEventListener("resize", onResize);
  11. onResize();
  12. });
  13. onUnmounted(() => {
  14. window.removeEventListener("resize", onResize);
  15. });
  16. return {
  17. width,
  18. height
  19. };
  20. }
  21. export default useWindowResize;

使用 useWindowResize

  1. <template>
  2. <div id="app">
  3. <h1>{{ count }}</h1>
  4. <button @click="plus">plus</button>
  5. <h1>屏幕尺寸:</h1>
  6. <div>宽度:{{ width }}</div>
  7. <div>高度:{{ height }}</div>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { ref, watch } from "vue";
  12. import useWindowResize from "./hooks/useWindowResize";
  13. export default {
  14. name: "App",
  15. setup() {
  16. const count = ref(0);
  17. function plus() {
  18. count.value++;
  19. }
  20. watch(count, () => {
  21. document.title = "update: " + count.value;
  22. });
  23. const { width, height } = useWindowResize();
  24. return {
  25. count,
  26. plus,
  27. width,
  28. height
  29. };
  30. }
  31. };
  32. </script>