首页 > 编程笔记 > JavaScript笔记
阅读:167
Vue3自定义hook的用法(附带实例)
Vue3 推荐利用 Vue 的组合式 API 函数进行代码封装,这种封装方式统称为自定义 hook。
假设现在想要实现,切换 Comp1、Comp2 两个组件,这两个组件的实现效果基本相同,它们都可以对 msg、count 数据进行处理,以及设置 count 的 increase 递增功能、count 的 computed 计算属性和对 count 数据进行 watch 监听,唯一的区别就是 Comp1 中 count 的始初值是 0,而 Comp2 中 Count 的初始值是 2。
Comp1.vue 文件代码如下,这是 Vue2 的编码方式,现在在这个基础上修改代码,实现自定义 hook 封装。
在 src 目录下创建 hooks 目录,并在 hooks 目录下创建 countHook.js 文件。将 Comp1 中的逻辑脚本迁移至 countHook.js 文件中,并做简单修改:引入 ref、computed、watch 函数,将数据、方法、计算属性和监听中的内容重新声明并默认暴露,最终将 msg、count、increase、double 这些变量、函数、计算结果值返回。
值得一提的是,由于后续会改变 Comp1 与 Comp2 的 count 值,因此这里使用函数传参的方式对 count 的值进行设置。
src/hooks/countHook.js 文件代码如下:
这里只展示 Comp1.vue 文件的代码,具体如下:
假设现在想要实现,切换 Comp1、Comp2 两个组件,这两个组件的实现效果基本相同,它们都可以对 msg、count 数据进行处理,以及设置 count 的 increase 递增功能、count 的 computed 计算属性和对 count 数据进行 watch 监听,唯一的区别就是 Comp1 中 count 的始初值是 0,而 Comp2 中 Count 的初始值是 2。
Comp1.vue 文件代码如下,这是 Vue2 的编码方式,现在在这个基础上修改代码,实现自定义 hook 封装。
<template>
<div>
<p>msg:{{ msg }}</p>
<p>count:{{ count }}</p>
<p>double:{{ double }}</p>
<button @click="increase">increase</button>
</div>
</template>
<script>
export default {
data() {
return {
msg: '你好,C语言中文网!',
// Comp1 中 count 的初始值为 0,Comp2 中 count 的初始值为 2
count: 0,
};
},
methods: {
increase() {
this.count++;
},
},
computed: {
double() {
return this.count * 2;
},
},
watch: {
count(newVal, oldVal) {
console.log('count 发生了变化', newVal, oldVal);
},
},
};
</script>
直接复制 Comp1.vue 文件的代码,将其中 count 的初始值修改为 2,完成 Comp2.vue 文件代码的编写。在 src 目录下创建 hooks 目录,并在 hooks 目录下创建 countHook.js 文件。将 Comp1 中的逻辑脚本迁移至 countHook.js 文件中,并做简单修改:引入 ref、computed、watch 函数,将数据、方法、计算属性和监听中的内容重新声明并默认暴露,最终将 msg、count、increase、double 这些变量、函数、计算结果值返回。
值得一提的是,由于后续会改变 Comp1 与 Comp2 的 count 值,因此这里使用函数传参的方式对 count 的值进行设置。
src/hooks/countHook.js 文件代码如下:
import { ref, computed, watch } from 'vue';
export default (initCount = 0) => {
const msg = ref('你好,C语言中文网!');
const count = ref(initCount);
const increase = () => {
count.value++;
};
const double = computed(() => {
return count.value * 2;
});
watch(double, (newVal, oldVal) => {
console.log('newVal', newVal);
console.log('oldVal', oldVal);
});
return { msg, count, increase, double };
};
此时就可以在 Comp1 中引入 countHook,并传递 count 的初始值。如果不传递值,则默认使用 hook 中设置的 initCount 初始值。由于 Comp1 的初始值需要设置为 0、Comp2 的初始值需要设置为 2,所以 Comp1 不需要传值,Comp2 传递 2 即可。这里只展示 Comp1.vue 文件的代码,具体如下:
<template>
<div>
<p>msg:{{ msg }}</p>
<p>count:{{ count }}</p>
<p>double:{{ double }}</p>
<button @click="increase">increase</button>
</div>
</template>
<script setup>
import countHook from '../hooks/countHook';
const { msg, count, increase, double } = countHook();
</script>
ICP备案:
公安联网备案: