首页 > 其他分享 >vue3学习之逻辑复用

vue3学习之逻辑复用

时间:2023-12-26 16:25:58浏览次数:23  
标签:逻辑 const 复用 value js vue3 import ref event

逻辑复用-组合式函数

 src/views/ad/User.vue

<script setup>
import { useMouse } from "../../js/mouse.js";
import { useFetch } from "../../js/fetch.js";
import { ref, computed } from "vue";

//组合式函数
const { x, y } = useMouse(); // x 和 y 是两个 ref

const todoId = ref(1);
const url = computed(() => {
  return `https://jsonplaceholder.typicode.com/todos/${todoId.value}`;
});
const { data, error } = useFetch(url);
</script>

<template>
  <div>
    <div>
      <p>Mouse position is at: {{ x }}, {{ y }}</p>
    </div>

    <div>
      <p>id:{{ todoId }}</p>
      <button @click="todoId++">Fetch next todo</button>
      <p v-if="!data">Loading...</p>
      <pre v-else-if="error">{{ error }}</pre>
      <pre v-else>{{ data }}</pre>
    </div>
  </div>
</template>

<style scoped>
</style>

 src/js/fetch.js

import { ref, watchEffect, toValue } from "vue";

export function useFetch(url) {
  const data = ref(null);
  const error = ref(null);

  const fetchData = (dt) => {
    fetch(toValue(url))
      .then((res) => res.json())
      .then((json) => (data.value = json))
      .catch((err) => (error.value = err));
  };

  watchEffect(() => {
    fetchData(url);
  });

  return { data, error };
}

 src/js/mouse.js

import { ref } from "vue";
import { useEventListener } from "./event";

export function useMouse() {
  const x = ref(0);
  const y = ref(0);

  useEventListener(window, "mousemove", (event) => {
    x.value = event.pageX;
    y.value = event.pageY;
  });

  return { x, y };
}

 src/js/event.js

import { onMounted, onUnmounted } from "vue";

export function useEventListener(target, event, callback) {
  onMounted(() => target.addEventListener(event, callback));
  onUnmounted(() => target.removeEventListener(event, callback));
}

 

跟踪鼠标位置变化的其它写法:

import { ref, onMounted, onUnmounted } from "vue";

// 按照惯例,组合式函数名以“use”开头
// 每一个调用 useMouse() 的组件实例会创建其独有的 x、y 状态拷贝,因此他们不会互相影响。
export function useMouse() {
  // 被组合式函数封装和管理的状态
  const x = ref(0);
  const y = ref(0);

  // 组合式函数可以随时更改其状态。
  function update(event) {
    x.value = event.pageX;
    y.value = event.pageY;
  }

  // 一个组合式函数也可以挂靠在所属组件的生命周期上
  // 来启动和卸载副作用
  onMounted(() => window.addEventListener("mousemove", update));
  onUnmounted(() => window.removeEventListener("mousemove", update));

  // 通过返回值暴露所管理的状态
  return { x, y };
}

 

标签:逻辑,const,复用,value,js,vue3,import,ref,event
From: https://www.cnblogs.com/caroline2016/p/17928367.html

相关文章

  • Python为什么空字符串的逻辑值是True
    在Python中,空字符串(即'')的逻辑值被定义为True。这是因为Python中的逻辑值是基于所谓的"真值测试"规则进行判断的。根据这个规则,除了一些特定的值被认为是False之外,其他所有的值都被认为是True。在Python中,以下值被认为是False:-None-False-0(包括0.0和其他表示零的数值)-空的容器对象(......
  • vue3学习基础之组件
    组件Comp.vue<scriptsetup>import{ref,provide,readonly,defineAsyncComponent}from"vue";importDemoCompfrom"../../components/simple/DemoComp.vue";importErrorComponentfrom"../../components/simple/ErrorComp.vue&......
  • vue3学习基础之响应式状态
    响应式状态<scriptsetup>import{ref,reactive,computed,watch,watchEffect}from"vue";//reactive响应式对象只能用于对象、数组和集合类型constauthor=reactive({name:"JohnDoe",books:["Vue2-AdvancedGuide","Vue3-......
  • vue3学习基础之事件绑定
    事件绑定<scriptsetup>import{nextTick,ref}from"vue";functionclickA(){console.log("点击了a标签,点击事件传递到了外层p标签");}functionclickStop(){console.log("点击了a标签,点击事件停止向外层传递");}functionclickOnce(){console.log......
  • vue3学习基础之表单相关
    表单相关<scriptsetup>import{ref}from"vue";constmessage=ref("hello");constchecked=ref();constcheckedNames=ref([]);constpicked=ref();constselected=ref();constmulSelected=ref([]);constnum=ref(5);......
  • vue3学习基础之vue-router
    我的vue3学习之路总是学学停停,最开始在18年开发微信小程序,就发现小程序和vue的语法有些相似,然后就去看了vue2的文档,随后忙其它的事情就丢下了。直到22年又开始捡起来vue3,有了组合式api,语法简明很多,然后又不知道忙什么丢下。。。前段有些空时间,就把vue3的学习整理下,使用vite构建......
  • 【源码系列#04】Vue3侦听器原理(Watch)
    专栏分享:vue2源码专栏,vue3源码专栏,vuerouter源码专栏,玩具项目专栏,硬核......
  • 跟着王洋老师学编程 - 1.5 小球撞墙(switch逻辑,问题是:小球会出现消失的状态。。)
    一、我的思路-创建窗体、设定窗体大小-在窗体中添加画布,并将画布添加至线程-线程run()方法持续执行,坐标不断变化,画布随之重绘,形成小球下落的效果,并随时判断小球X轴、Y轴坐标,触底后,通过flag值调整坐标加减方向代码一1importjava.awt.*;2publicclassBallHitWall{......
  • VUE3 + Three.js 坑
    VUE3+Three.js坑1.问题描述将scene、camera、renderer、controls等变量用reactive变成响应式时,页面渲染会报错:three.module.js?5a89:24471UncaughtTypeError:'get'onproxy:property'modelViewMatrix'isaread-onlyandnon-configurabledatapropertyonthe......
  • 页表、物理地址、逻辑地址
    页表:虚拟内存的概念。操作系统虚拟内存到物理内存的映射,被称为页表。不可能每一个虚拟内存的Byte都对应到物理内存的地址,因为这样的页表非常大,于是引入页(Page)概念,进行分页,减小虚拟内存页对应物理内存页映射表的大小。缺页异常:malloc和mmap函数分配内存是仅建立了......