使用 reactive 响应式对象的方式改造,我这样改造可以吗老师?有没有更优雅的写法呢。请老师指点一下,谢谢,辛苦了

来源:3-12 vue3 模块化妙用- 鼠标追踪器

带带弟弟

2020-10-28

import {onMounted, onUnmounted, ref, reactive, toRefs} from 'vue';


// 抽离的功能
export const useMounsePosition = () => {
    const x = ref(0);
    const y = ref(0);

    const updateMouse = (e: MouseEvent): void => {
        x.value = e.pageX;
        y.value = e.pageY;
    };


    onMounted((): void => {
        document.addEventListener('click', updateMouse, false);
    });

    onUnmounted((): void => {
        document.removeEventListener('click', updateMouse, false);
    });

    return {
        x,
        y,
    }

};

//  抽离的功能 改成使用 reactive 
export const useMounsePositionReactive = () => {
    const data = reactive({
        x: 0,
        y: 0,
        updateMouse: (e: MouseEvent ): void => {
            data.x = e.pageX;
            data.y = e.pageY;
        },
        // 这里统一管理生命周期的方法
        onTed: (): void => {
            onMounted((): void => {
                document.addEventListener('click', data.updateMouse, false);
            });
            onUnmounted((): void => {
                document.removeEventListener('click', data.updateMouse, false);
            });
        }
    });

    data.onTed();

    const dataToRefs = toRefs(data);
    return {
        ...dataToRefs
    }
}


// 调用部分
import { useMounsePosition, useMounsePositionReactive } from './hooks/useMounsePosition';

 const { x, y } = useMounsePositionReactive();
 




写回答

1回答

张轩

2020-10-29

同学你好 基本思想就是使用 reative 代替 ref,我有点在你的代码中没明白的就是 onMounted  onUnmounted 生命周期为什么要单独的放在一个函数中,然后再调用它呢?像原始的代码中那样完成你觉得有什么问题呢?

0
0

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3142 学习 · 2313 问题

查看课程