精通Vue.js系列实例教程 │ 分割setup函数

简介: Vue框架的组合API的主要用途是更加灵活地对项目进行模块化的分割。如果setup()函数本身非常庞大,也必须对它进行分割,这样才能发挥组合API的特长。

640.jpg
Vue框架的组合API的主要用途是更加灵活地对项目进行模块化的分割。如果setup()函数本身非常庞大,也必须对它进行分割,这样才能发挥组合API的特长。
对setup()函数的分割包括以下两个步骤。

(1) 把setup()函数分割成多个函数,把处理相关业务逻辑的代码分割到同一个函数中。

(2)把从setup()函数中分割出来的每个函数放到单独的.js文件中。

1、把setup()函数分割到多个函数中

例程1定义了PersonFull组件,它的setup()函数会返回person和persons变量,这两个变量都支持响应式机制。setup()函数还会返回add()和remove()方法。add()方法向persons.array数组中加入一个person对象,remove()方法从persons.array数组中删除特定的person对象。

■ 例程1 PersonFull.vue

<template>
  <div>
    <p>姓名:<input type="text" v-model="person.name"></p>
    <p>年龄:<input type="text" id="" v-model="person.age"></p>
    <p><button @click="add()">添加</button></p>
   </div> 

   <div>
    <ul>
      <li v-for="v in persons.array" :key="v.id" >
        ID:{{v.id}},姓名:{{ v.name }},年龄:{{ v.age }}   
        <button @click="remove(v.id)" >删除 </button>
      </li>
    </ul>
  </div>
</template>

<script>
  import { reactive} from 'vue'
  export default {
    setup() {
      const { persons, remove } = useRemovePerson() 
      const { person, add } = useAddPerson(persons)
      return { persons,remove, person, add}
    }
  }
  
  // 向persons数组添加新的person对象
  const useAddPerson = (persons) => {
    const person= reactive({ id: '', name: '', age: '' })
  
    const add = (()=> {  
      //计算新添加person对象的id
      let index=null
      for( index in persons.array){
        if(person.id<=persons.array[index].id)
          person.id=persons.array[index].id+1
      }       
   
      //创建person对象的复制,该复制不支持响应式机制  
      const personCopy = Object.assign({},person)
  
      //添加person对象
      persons.array.push(personCopy)
      
      person.id = ''
      person.name = ''
      person.age = ''
    })
    return { person,add }
  }
  
  // 删除一个person对象
  const useRemovePerson = () => {
    //包含了所有的person对象
    const persons = reactive({
      array: [
        { id: 1, name: "Mary", age: 17 },
        { id: 2, name: "Tom", age: 20 },
        { id: 3, name: "Linda", age: 18 },
      ]
    })
  
    const remove = (id) => {
      //根据id删除特定的person对象
      persons.array =persons.array.filter((v) => v.id !== id)
    }
    return { persons, remove }
  }
</script>

PersonFull组件的setup()函数分割出来两个函数:useAddPerson()和useRemovePerson()。useAddPerson()定义并且返回person变量和add()方法,useRemovePerson()定义并且返回persons变量和remove()方法。

在setup()函数中,利用JavaScript的解构语法,从useAddPerson()和useRemovePerson()函数的返回值中获得相关的变量和方法,然后再由setup()函数把它们返回:

 setup() {
    const { persons, remove } = useRemovePerson() 
    const { person, add } = useAddPerson(persons)
    return { persons,remove, person, add}
  }

Vue组件的混入块也是分割组件的一种方式,是把组件分割成多个混入块,这些混入块没有输入参数和输出值,就像没有生命力的代码,必须把它们合并到组件中才会工作。而setup()函数分割出来的模块仍然是函数,可以有输入参数和返回值,还可以与其他函数模块交换数据,因此这样的模块既能够独立完成特定的功能,又能够方便地与其他的模块整合。这种分割方式更有助于开发团队按照业务逻辑来划分任务并进行分工合作。

在index.js中为PersonFull.vue组件设置的路由如下:


{
      path: '/full',
      name: 'full',
      component: PersonFull
    }```  

通过浏览器访问http://localhost:8080/#/full,会显示如图1所示的网页。

![640.png](https://ucc.alicdn.com/pic/developer-ecology/qd74tgabmnnce_212a7c89c9de4487a5bfe1cf671ba65e.png)

# 2、把setup()函数分割到多个文件中

上文虽然从setup()函数中分割出了useRemovePerson()和useAddPerson()函数,但是它们都位于同一个PersonFull.vue文件中。下面将把它们放到单独的文件中,进一步提高每个函数模块的独立性。

可以把例程1的PersonFull.vue拆分成三个文件:Person.vue、remove.js和add.js,参见例程2、例程3和例程4。

■ 例程2 Person.vue


setup() {
  const { persons, remove } = useRemovePerson() 
  const { person, add } = useAddPerson(persons)
  return { persons,remove, person, add}
}

}

■ 例程3 remove.js

import { reactive} from 'vue'

// 删除一个person对象
const useRemovePerson = () => {

return { persons, remove }
}

export default useRemovePerson

■ 例程4 add.js

import { reactive} from 'vue'

// 向persons数组添加新的person对象
const useAddPerson = () => {

return { person, add }
}

export default useAddPerson

在index.js中,为Person组件设置的路由如下:

{

  path: '/person',
  name: 'person',
  component: Person
}
通过浏览器访问http://localhost:8080/#/person,会显示图1所示的网页。





 



目录
相关文章
|
5月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
479 0
|
9月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
350 19
|
11月前
|
前端开发 JavaScript Java
【Java进阶】JavaScript电灯开关实例:从理论到实践
这个例子展示了JavaScript的基本功能,包括操作HTML元素,监听事件,以及改变元素的样式。通过学习和理解这个例子,你可以了解到JavaScript在网页中的应用,以及如何使用JavaScript来创建交互式的网页。
209 13
|
12月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
11296 25
|
11月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
273 32
|
12月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
资源调度 JavaScript 前端开发
创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
这是一篇关于创建Vue项目的详细指南,涵盖从环境搭建到项目部署的全过程。
1066 1
|
Web App开发 JavaScript 前端开发
2024年5月node.js安装(winmac系统)保姆级教程
本篇博客为2024年5月版Node.js安装教程,适用于Windows和Mac系统。作者是一名熟悉JavaScript与Vue的大一学生,分享了Node.js的基本介绍、下载链接及简单安装步骤。安装完成后,通过终端命令`node -v`验证版本即可确认安装成功。欢迎关注作者,获取更多技术文章。
663 2
2024年5月node.js安装(winmac系统)保姆级教程

热门文章

最新文章