首页 > 其他分享 >Vue 3 Composition API进阶指南

Vue 3 Composition API进阶指南

时间:2024-09-12 18:51:21浏览次数:10  
标签:Vue const computed valid value API ref Composition

在上一篇文章中,我们介绍了Vue 3的Composition API基础,包括如何使用setup函数、refreactive来创建响应式数据,以及使用watchEffect来监控数据变化。本文将继续深入探讨Composition API的高级用法,帮助你更好地理解和利用Vue 3的新特性。

组合多个Hooks

在实际开发中,我们经常需要组合使用多个自定义的Hooks来实现复杂的功能。Vue 3的Composition API提供了这样的灵活性。下面通过一个简单的例子来展示如何组合多个Hooks。

示例:动态表单验证

假设我们需要创建一个表单组件,该组件需要对用户的输入进行实时验证,并在验证失败时显示错误信息。我们可以使用多个Hooks来组织这个功能:

<template>
  <div>
    <input v-model="username" placeholder="Username" />
    <span v-if="usernameError">{{ usernameError }}</span>
    <input v-model="email" placeholder="Email" />
    <span v-if="emailError">{{ emailError }}</span>
    <button :disabled="!isValid" @click="submitForm">Submit</button>
  </div>
</template>

<script>
import { ref, watchEffect, computed } from 'vue';

function useValidation(value, rules) {
  const error = ref('');
  const valid = ref(true); // 使valid成为一个响应式引用

  watchEffect(() => {
    let localValid = true;
    for (const rule of rules) {
      const validationResult = rule(value.value);
      if (validationResult !== true) {
        error.value = validationResult.message;
        localValid = false;
        break;
      }
    }
    valid.value = localValid; // 更新valid的值
  });

  return { error, valid };
}

export default {
  setup() {
    const username = ref('');
    const email = ref('');

    const usernameRules = [
      value => !!value || { message: 'Username is required.' },
      value => (value && value.length >= 5) || { message: 'Username must be at least 5 characters.' }
    ];

    const emailRules = [
      value => !!value || { message: 'Email is required.' },
      value => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) || { message: 'Invalid email format.' }
    ];

    const { error: usernameError, valid: usernameIsValid } = useValidation(username, usernameRules);
    const { error: emailError, valid: emailIsValid } = useValidation(email, emailRules);

    const isValid = computed(() => usernameIsValid.value && emailIsValid.value);

    function submitForm() {
      if (isValid.value) {
        console.log('Form submitted!');
      } else {
        console.log('Form is not valid.');
      }
    }

    return {
      username,
      email,
      usernameError,
      emailError,
      isValid,
      submitForm
    };
  }
};
</script>

解释:

  1. 验证规则

    • 每个验证规则函数应该返回一个布尔值或一个带有message属性的对象。如果验证失败,返回的对象应该包含一个message属性。
  2. watchEffect的回调

    • watchEffect的回调函数中,我们遍历所有规则并检查每个规则的返回值。如果任何一个规则返回非true值,就认为验证失败,并更新errorlocalValid
    • 最终将localValid的值赋给valid.value
  3. 计算属性isValid

    • isValid是一个computed属性,它依赖于usernameIsValidemailIsValid的状态。只有当这两个状态都是true时,isValid才是true
  4. 提交按钮的禁用逻辑

    • 提交按钮的disabled属性绑定到了!isValid,确保只有在表单有效时按钮才能被点击。

在这个例子中,我们定义了一个useValidation函数作为自定义Hook,它接受一个值和一组验证规则,然后返回一个表示是否有错误的信息和一个布尔值表示是否有效。我们在setup函数中分别使用这个Hook来验证用户名和邮箱地址,并将结果暴露给模板使用。

使用Computed属性

除了watchEffect之外,Vue 3还提供了computed函数,用于计算基于其他响应式状态的新状态。这对于需要根据多个源数据计算得出的结果特别有用。

示例:复杂计算

假设我们需要根据用户输入的数值计算一些统计数据,比如平均值、最大值和最小值:

<template>
  <div>
    <input v-model="numbers" placeholder="Enter numbers separated by commas" />
    <p>Average: {{ average }}</p>
    <p>Max: {{ max }}</p>
    <p>Min: {{ min }}</p>
  </div>
</template>

<script>
import { ref, computed } from 'vue';

export default {
  setup() {
    const numbers = ref('');

    const parsedNumbers = computed(() => {
      return numbers.value.split(',').map(Number).filter(n => !isNaN(n));
    });

    const average = computed(() => {
      const nums = parsedNumbers.value;
      return nums.reduce((acc, cur) => acc + cur, 0) / nums.length;
    });

    const max = computed(() => Math.max(...parsedNumbers.value));

    const min = computed(() => Math.min(...parsedNumbers.value));

    return {
      numbers,
      average,
      max,
      min
    };
  }
};
</script>

在这个例子中,我们定义了一个numbers输入框,用户可以输入逗号分隔的数字。我们使用computed来计算平均值、最大值和最小值,并将这些值暴露给模板使用。

结语

通过本文的学习,我们进一步掌握了Vue 3 Composition API的一些高级用法,包括如何组合多个Hooks、使用computed属性来计算响应式状态。这些技术可以帮助你在实际项目中更好地组织组件逻辑,提高代码的可维护性和可读性。

在接下来的文章中,我们将继续深入探讨Vue 3的其他特性和最佳实践,帮助你成为更高效的Vue开发者。如果你有任何问题或想要分享的经验,请在评论区留言。

 

标签:Vue,const,computed,valid,value,API,ref,Composition
From: https://blog.csdn.net/qq_39813901/article/details/142148825

相关文章

  • 【F172】基于Springboot+vue实现的智能菜谱系统
    作者主页:Java码库主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。收藏点赞不迷路 关注作者有好处文末获取源码项目描述近些年,随着中国经济发展,人民的生活质量逐渐提高,对网络的依赖性越来越高,通过网......
  • 面试-JS Web API-JSONP和cors
    JSONP(JSONwithPadding)JSONP是通过<script>标签来实现跨域数据传输的技术。它是为了绕过浏览器的同源策略限制而诞生的。访问一个网址,服务端一定返回一个html文件吗?---不是的服务器可以任意动态拼接数据返回的,只要符合html格式的要求就可以。JSONP的工作原理:客......
  • 基于SpringBoot+Vue的酷听音乐系统设计与实现(SpringBoot+Vue+MySQL+Tomcat)
    文章目录前言系统演示录像论文参考代码运行展示图技术框架SpringBoot技术介绍系统测试系统测试的目的系统功能测试推荐选题:代码参考实现案例找我做程序,有什么保障?联系我们前言......
  • 微服务引擎 MSE 及云原生 API 网关 2024 年 8 月产品动态
    ......
  • vue2动态生成(绘制)图形验证码(验证码图片)
     方案1:js绘制条形验证码 参考文档:https://blog.csdn.net/LOVE_mingjing/article/details/130622848 utils文件夹下新建GVerify.js文件:functionGVerify(options){//创建一个图形验证码对象,接收options对象为参数this.options={//默认options参数值......
  • 面试-JS Web API
    手写一个简易的Ajax跨域的常用实现方式GET请求//创建一个XMLHttpRequest对象constxhr=newXMLHttpRequest();//初始化一个GET请求//第三个参数true表示异步,一般都为truexhr.open('GET','/data/test.json',true);//设置事件处理函数,当readyState......
  • 基于Node.js+vue中心医院药品管理系统的设计与实现(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着医疗技术的不断进步和人们对健康需求的日益增长,中心医院作为医疗服务的重要载体,其运营效率和管理水平直接影响到患者的治疗效果与满意度。药品作为医疗......
  • 基于Node.js+vue基于springboot的影视资讯管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景随着互联网的飞速发展,影视行业迎来了前所未有的繁荣期。海量影视资源的涌现,使得用户对于高效、便捷地获取影视资讯的需求日益增长。传统的影视资讯管理方式......
  • 基于Node.js+vue在线新闻网站系统的设计与实现(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容研究背景在信息爆炸的时代,新闻资讯的获取与传播速度成为了衡量一个社会信息化水平的重要指标。随着互联网技术的飞速发展,传统新闻媒体逐渐向数字化、网络化转型,在线......
  • 牛逼!在Vue3.5中仅仅2分钟就能封装一个自动cancel的fetch函数
    前言在欧阳的上一篇这应该是全网最详细的Vue3.5版本解读文章中有不少同学对Vue3.5新增的onWatcherCleanup有点疑惑,这个新增的API好像和watchAPI回调的第三个参数onCleanup功能好像重复了。今天这篇文章来讲讲新增的onWatcherCleanup函数的使用场景:封装一个自动cancel的fetch......