vue3组合式函数(Composables) 使用示例【useValid】

vue实现自定义校验值是否有效_vue数据有效性验证-CSDN博客文章浏览阅读215次。【代码】vue实现自定义校验值是否有效。_vue数据有效性验证 https://blog.csdn.net/m0_74149462/article/details/145511296

组合式函数 | Vue.jsVue.js - 渐进式的 JavaScript 框架https://cn.vuejs.org/guide/reusability/composables.html#comparisons-with-other-techniques

Composables功能就类似vue2的mixins,但还是有些差别

在 Vue 应用的概念中,“组合式函数”(Composables) 是一个利用 Vue 的组合式 API 来封装和复用有状态逻辑的函数。

当构建前端应用时,我们常常需要复用公共任务的逻辑。例如为了在不同地方格式化时间,我们可能会抽取一个可复用的日期格式化函数。这个函数封装了无状态的逻辑:它在接收一些输入后立刻返回所期望的输出。复用无状态逻辑的库有很多,比如你可能已经用过的 lodash 或是 date-fns

相比之下,有状态逻辑负责管理会随时间而变化的状态。一个简单的例子是跟踪当前鼠标在页面中的位置。在实际应用中,也可能是像触摸手势或与数据库的连接状态这样的更复杂的逻辑。

鼠标跟踪器示例

如果我们要直接在组件中使用组合式 API 实现鼠标跟踪功能,它会是这样的:

<script setup>
import { ref, onMounted, onUnmounted } from 'vue'

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))
</script>

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

但是,如果我们想在多个组件中复用这个相同的逻辑呢?我们可以把这个逻辑以一个组合式函数的形式提取到外部文件中:

// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'

// 按照惯例,组合式函数名以“use”开头
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 }
}

下面是它在组件中使用的方式:

<script setup>
import { useMouse } from './mouse.js'

const { x, y } = useMouse()
</script>

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

与其他模式的比较

和 Mixin 的对比

Vue 2 的用户可能会对 mixins 选项比较熟悉。它也让我们能够把组件逻辑提取到可复用的单元里。然而 mixins 有三个主要的短板:

  1. 不清晰的数据来源:当使用了多个 mixin 时,实例上的数据属性来自哪个 mixin 变得不清晰,这使追溯实现和理解组件行为变得困难。这也是我们推荐在组合式函数中使用 ref + 解构模式的理由:让属性的来源在消费组件时一目了然。

  2. 命名空间冲突:多个来自不同作者的 mixin 可能会注册相同的属性名,造成命名冲突。若使用组合式函数,你可以通过在解构变量时对变量进行重命名来避免相同的键名。

  3. 隐式的跨 mixin 交流:多个 mixin 需要依赖共享的属性名来进行相互作用,这使得它们隐性地耦合在一起。而一个组合式函数的返回值可以作为另一个组合式函数的参数被传入,像普通函数那样。

基于上述理由,我们不再推荐在 Vue 3 中继续使用 mixin。保留该功能只是为了项目迁移的需求和照顾熟悉它的用户。

和无渲染组件的对比

在组件插槽一章中,我们讨论过了基于作用域插槽的无渲染组件。我们甚至用它实现了一样的鼠标追踪器示例。

组合式函数相对于无渲染组件的主要优势是:组合式函数不会产生额外的组件实例开销。当在整个应用中使用时,由无渲染组件产生的额外组件实例会带来无法忽视的性能开销。

我们推荐在纯逻辑复用时使用组合式函数,在需要同时复用逻辑和视图布局时使用无渲染组件。

和 React Hooks 的对比

如果你有 React 的开发经验,你可能注意到组合式函数和自定义 React hooks 非常相似。组合式 API 的一部分灵感正来自于 React hooks,Vue 的组合式函数也的确在逻辑组合能力上与 React hooks 相近。然而,Vue 的组合式函数是基于 Vue 细粒度的响应性系统,这和 React hooks 的执行模型有本质上的不同。这一话题在组合式 API 的常见问题中有更细致的讨论。

vaild Mixin 修改示例

src/composable/useValid.js

// src/composables/useValid.js
import { ref } from 'vue'

export default function useValid() {
  const invalidValues = ref(["undefined", "null", "NaN", "", null, undefined, NaN])

  const isValidValue = (v) => {
    return !invalidValues.value.includes(v)
  }

  const returnValue = (v) => {
    return isValidValue(v) ? v : "-"
  }

  const returnToFixedValue = (v, part = 2) => {
    return isValidValue(Number(v)) ? Number(v).toFixed(part) : "-"
  }

  const makeDifference = (max, min, part = 2) => {
    return isValidValue(max) && isValidValue(min)
      ? (max - min).toFixed(part)
      : "-"
  }

  return {
    isValidValue,
    returnValue,
    returnToFixedValue,
    makeDifference
  }
}

局部注册使用

import useValid from "@/composable/useValid.js";
const { returnValue } = useValid();



<el-form
    ref="formRef"
    :rules="formRules"
    label-width="5.5rem"
    :model="formData"
>
    <el-form-item label="告警车辆 :" prop="routeName">
        {{ returnValue(formData.routeName) }}
    <el-form-item>
</el-form>

全局注册

方法一: provide/inject
main.js 注册
import useValid from "@/composable/useValid.js";
app.provide('$valid', useValid())
使用
const {
  returnValue
} = inject("$valid")

        <el-form
          ref="formRef"
          :rules="formRules"
          label-width="5.5rem"
          :model="formData"
        >
          
              <el-form-item label="告警车辆 :" prop="routeName">
                {{ returnValue(formData.routeName) }}
              </el-form-item>
        </el-form>

 
方法二: app.config.globalProperties
man.js 注册
import useValid from "@/composable/useValid.js";
app.config.globalProperties.$valid = useValid() // 挂载到全局
使用
const { proxy } = getCurrentInstance();
const { returnValue } = proxy.$valid;


{{ returnValue(formData.routeName) }}

### Vue 3 中的组合式函数及其使用方法 Vue 3 引入了 Composition API,这是一个用于组织和复用逻辑代码的强大工具。Composition API 的核心思想是通过函数来管理组件的状态和行为,而不是传统的选项式(Options API)结构。这种方法提供了更灵活、模块化的代码结构,使得复杂逻辑更容易维护。 #### 组合式函数的基本概念 在 Vue 3 中,**组合式函数**是指那些能够封装和管理状态、逻辑或副作用的函数。这些函数通常会返回一个包含响应式数据的对象,或者直接操作组件的状态。组合式函数的核心优势在于它们可以跨多个组件复用,并且可以轻松地进行测试和调试。 例如,一个简单的组合式函数可能如下所示: ```javascript import { ref, computed } from &#39;vue&#39;; function useCounter() { const count = ref(0); const increment = () => count.value++; const decrement = () => count.value--; return { count, increment, decrement }; } ``` 在这个例子中,`useCounter` 函数定义了一个计数器的状态以及相关的操作方法。这个函数可以在任何需要计数器功能的组件中被调用。 #### 在组件中使用组合式函数 要在 Vue 3 组件中使用组合式函数,首先需要导入所需的函数并调用它。然后,将返回的结果传递给 `setup()` 方法中的 `return` 语句,以便在模板中访问这些数据。 下面是一个使用 `useCounter` 的示例组件: ```vue <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> <button @click="decrement">Decrement</button> </div> </template> <script> import { useCounter } from &#39;./useCounter&#39;; export default { setup() { const counter = useCounter(); return { ...counter }; } }; </script> ``` 在这个组件中,`useCounter` 被调用来获取计数器的状态和方法。通过扩展运算符 (`...`),这些值被传递到组件的 `setup()` 方法的返回对象中,从而可以直接在模板中使用。 #### 组合式函数的优势 1. **代码复用**:组合式函数允许开发者将常见的逻辑抽象为独立的函数,这样可以在多个组件之间共享相同的逻辑。 2. **更好的类型推断**:由于组合式函数返回的是普通的 JavaScript 对象,因此它们与 TypeScript 集成得非常好,可以提供更强的类型安全性。 3. **模块化设计**:组合式函数鼓励将复杂的逻辑拆分为小块,每个函数专注于单一职责,这有助于提高代码的可读性和可维护性。 #### 注意事项 尽管 Composition API 提供了许多好处,但在使用过程中需要注意以下几点: - **避免过度封装**:虽然组合式函数非常适合复用逻辑,但如果过度使用可能会导致代码难以理解和调试。 - **保持函数纯净**:为了确保组合式函数的行为一致,应尽量保持函数的纯度,即不依赖外部状态并且没有副作用。 通过合理利用组合式函数,开发者可以构建出更加清晰、高效的 Vue 3 应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值