自定义hook

本质是一个函数,把setup函数中使用的 Composition API 进行了封装;

类似于2.x中 的mixin

自定义hook的优势:复用代码,让setup中的逻辑更清楚易懂;

实现一个获取坐标位置的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<template>
<h2>点前点击的鼠标的坐标为x:{{ point.x }},y:{{ point.y }}</h2>
</template>

<script>
// 获取鼠标的点击的坐标
import { reactive, onMounted,onBeforeUnmount } from "vue";
export default {
setup() {
// 数据
let point = reactive({
x: 0,
y: 0,
});
// 方法
function savePoint(event) {
point.x = event.pageX;
point.y = event.pageY;
}
// 生命周期
onMounted(() => {
window.addEventListener("click", savePoint);
});
onBeforeUnmount(()=>{
window.removeEventListener("click",savePoint);
console.log(123)
})
return {
point,
};
},
};
</script>

<style>
</style>

但是这个功能 我如果别的地方也想用,咋办?

新建一个文件夹,起名为hook,里面新建一个js文件,起名为usePoint.js

将如上实现功能的代码 cv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 得需要把这些引入了,然后把setup中的数据,方法,生命周期cv放在一个函数里,最后将这个函数暴露出去;
import { reactive, onMounted, onBeforeUnmount } from "vue";
export default function () {
// 数据
let point = reactive({
x: 0,
y: 0,
});
// 方法
function savePoint(event) {
point.x = event.pageX;
point.y = event.pageY;
}
// 生命周期
onMounted(() => {
window.addEventListener("click", savePoint);
});
onBeforeUnmount(() => {
window.removeEventListener("click", savePoint);
console.log(123)
})
//别的地方调用这个函数的时候 ,如果没有return出数据,获取到的就是 undefined
return point;
}

在需要用这个功能的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<template>
<h2>点前点击的鼠标的坐标为x:{{ point.x }},y:{{ point.y }}</h2>
</template>

<script>
// 1.引入一下
import usePoint from "../hook/usePoint";
export default {
setup() {
// 2. 调用一下
// usePoint是 一个函数,这个函数 return出来了所需的数据;调用这个函数;
let point = usePoint();

// 3.暴露出去
return{
point,
}
},
};
</script>

<style>
</style>