vue3-HOOKS模块化处理方式
短信预约 -IT技能 免费直播动态提醒
vue3模块化处理
vue3版本的更新,就是能搞更好的重用机制,可以把想要得模块独立出去
eg:显示一个当前时间的工能,在多个页面需要调用的时候不用重复的调用
可以在class="lazy" data-src目录下,新建一个文件夹hooks(所有抽离出来的功能模块都可以放到这个文件夹里),
然后再新建一个文件useNowTime.js,这里使用use开头是一个使用习惯,代表是一个抽离出来的模块
import { ref } from "vue";
const nowTime = ref("00:00:00");
const getNowTime = () => {
const now = new Date();
const hour = now.getHours() < 10 ? "0" + now.getHours() : now.getHours();
const minu =
now.getMinutes() < 10 ? "0" + now.getMinutes() : now.getMinutes();
const sec =
now.getSeconds() < 10 ? "0" + now.getSeconds() : now.getSeconds();
nowTime.value = hour + ":" + minu + ":" + sec;
setTimeout(getNowTime, 1000);
};
export { nowTime, getNowTime }
注意:需要将定义的变量nowTime和方法getNowTime通过export导出
- 使用的时候跟在setup中定义的变量和方法一样使用
- 使用模块化封装一个远程调用接口的组件
建立useURLAxios.js文件
在文件中定义远程加载需要的 变量和axios请求
import {ref} from 'vue'
import axios from 'axios';
function usURLAxios(url) {
const result = ref(null)
const loading = ref(true)
const loaded =ref(false)
const error =ref(null)
axios.get(url).then((res)=>{
loading.value = false
loaded.value = true
result.value = res.data
}).catch(e=>{
error.value = e
loading.value = false
})
return {
result,
loading,
loaded,
error
}
}
export default usURLAxios
使用时
新增一个.vue文件
<template>
<div>
<button @click="getImg">随机展示图片</button>
<div v-if="thisloading">Loading.....</div>
<img v-if="thisloaded" :class="lazy" data-src="thisresult.message" />
<div></div>
</div>
</template>
<script>
import { reactive, toRefs } from "vue";
import useUrlAxios from "../hooks/useURLAxios";
export default {
setup() {
const data = reactive({
thisresult: null,
thisloading: true,
thisloaded: false,
getImg: () => {
const { result, loading, loaded } = useUrlAxios(
"https://dog.ceo/api/breeds/image/random"
);
data.thisresult = result;
data.thisloading = loading;
data.thisloaded = loaded;
console.log(
22222,
data.thisresult,
data.thisloading,
data.thisloaded,
result,
loaded,
loading
);
},
});
const refData = toRefs(data);
return { ...refData };
},
};
</script>
<style lang="scss" scoped>
</style>
vue hooks理解与使用
vue的hooks和mixins功能相似,但又比mixins具有以下几个优势:
- 允许hooks间相互传递值
- 组件之间重用状态逻辑
- 明确指出逻辑来自哪里
demo源码示意
hook1:
import { useData, useMounted } from 'vue-hooks';
export function windowwidth() {
const data = useData({
width: 0
})
useMounted(() => {
data.width = window.innerWidth
})
// this is something we can consume with the other hook
return {
data
}
}
import { useData, useMounted } from 'vue-hooks';
export function windowwidth() {
const data = useData({
width: 0
})
useMounted(() => {
data.width = window.innerWidth
})
// this is something we can consume with the other hook
return {
data
}
}
hook2:
// the data comes from the other hook
export function logolettering(data) {
useMounted(function () {
// this is the width that we stored in data from the previous hook
if (data.data.width > 1200) {
// we can use refs if they are called in the useMounted hook
const logoname = this.$refs.logoname;
Splitting({ target: logoname, by: "chars" });
TweenMax.staggerFromTo(".char", 5,
{
opacity: 0,
transformOrigin: "50% 50% -30px",
cycle: {
color: ["red", "purple", "teal"],
rotationY(i) {
return i * 50
}
}
},
...
在组件内部,我们可以将 hook1 作为参数传递给 hook2:
<script>
import { logolettering } from "./../hooks/logolettering.js";
import { windowwidth } from "./../hooks/windowwidth.js";
export default {
hooks() {
logolettering(windowwidth());
}
};
</script>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341