目录
[src下新建文件夹 hooks](#src下新建文件夹 hooks)
[创建js文件,文件名为 usePoint.js](#创建js文件,文件名为 usePoint.js)
[在 App.vue 中](#在 App.vue 中)
[Demo.vue 组件中](#Demo.vue 组件中)
[Test.vue 组件中](#Test.vue 组件中)
自定义hook函数
- 什么是 hook ?------本质是一个函数,把 setup 函数中使用的 Composition API 进行了封装。
- 类似于 vue2 中的 mixin。
- 自定义hook的优势:复用代码,让 setup 中的逻辑更清楚易懂。
例如:
src下新建文件夹 hooks
创建js文件,文件名为 usePoint.js
在 usePoint.js 中封装一个鼠标点击"打点"的函数 savePoint
javascript
import {reactive,onMounted,onBeforeUnmount} from 'vue'
function savePoint(){
//实现鼠标'打点'相关的数据
let point = reactive({
x:0,
y:0
})
//实现鼠标'打点'相关的方法
function savePoint(event){
point.x = event.pageX
point.y = event.pageY
console.log(event.pageX,event.pageY)
}
//实现鼠标'打点'相关的生命周期钩子
onMounted(()=>{
window.addEventListener("click", savePoint)
})
onBeforeUnmount(()=>{
window.removeEventListener("click", savePoint)
})
//一定要返回,否则无法使用point
return point
}
export default savePoint
在 App.vue 中
用到了两个组件,分别是Demo.vue 和 Test.vue
javascript
<template>
<button @click="xianshi = !xianshi">点我移除Demo</button>
<Demo v-if="xianshi"></Demo>
<hr>
<Test></Test>
</template>
<script>
import {ref} from 'vue'
import Demo from './components/Demo.vue'
import Test from './components/Test'
export default {
name: 'App',
components:{Demo,Test},
setup(){
let xianshi = ref(true)
return {
xianshi
}
}
}
</script>
Demo.vue 组件中
引入封装好的 usePoint.js ,可以直接使用返回的 point
javascript
<template>
<h2>当前求和为:{{sum}}</h2>
<button @click="sum++">点我+1</button>
<hr>
<h2>当前点击时鼠标的坐标为:x:{{point.x}},y:{{point.y}}</h2>
</template>
<script>
import {ref,reactive,onMounted,onBeforeUnmount} from 'vue'
import usePoint from '../hooks/usePoint'
export default {
name: 'Demo',
setup() {
//数据
let sum = ref(0)
let point = usePoint()
//返回一个对象(常用)
return {
sum,
point
}
}
}
</script>
Test.vue 组件中
引入封装好的 usePoint.js ,可以直接使用返回的 point
javascript
<template>
<h2>我是Test组件</h2>
<h3>姓名:张三</h3>
<h3>鼠标点击的坐标:x:{{point.x}},y:{{point.y}}</h3>
</template>
<script>
import {ref} from 'vue'
import usePoint from '../hooks/usePoint'
export default {
name: "test",
setup(){
let name = ref('张三')
let point = usePoint()
return{
name,
point
}
}
}
</script>
<style scoped>
</style>