当前位置: 首页 > news >正文

孙卫琴的《精通Vue.js》读书笔记-分割setup()函数

本文参考孙卫琴,杜聚宾所创作的 <<精通Vue.js: Web前端开发技术详解>>一书
在这里插入图片描述
Vue框架的组合API的主要用途是更加灵活地对项目进行模块化的分割。当setup()函数本身非常庞大,也必须对它进行分割,这样才能发挥组合API的特长。
对setup()函数的分割包括两个步骤:
(1)把setup()函数分割成多个函数。把处理相关业务逻辑的代码分割到同一个函数中。
(2)把从setup()函数中分割出来的每个函数放到单独的.js文件中。

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

例程1的PersonFull.vue定义了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所示的网页。
在这里插入图片描述

图1 PersonFull组件的网页

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

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

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

<template>……</template>
<script>
  import useAddPerson from './add.js'
  import useRemovePerson from './remove.js'
  export default {
    setup() {
      const { persons, remove } = useRemovePerson()
      const { person, add } = useAddPerson(persons)
      return { persons,remove, person, add}
    }
  }
</script>

例程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所示的网页。

相关文章:

  • 哈希表、集合、映射
  • webpack5 之 css与js相关
  • 最新总结MySQL核心知识点
  • Servlet 项目的创建和部署
  • android获取进程内存使用信息、一键加速(内存清理)与进程重要级别解析
  • 面试题之HashMap与HashTable的区别
  • ASEMI整流桥SKBPC3516,SKBPC3516参数,SKBPC3516应用
  • java固定资产设备管理系统(源码开源分享)
  • 计算机网络学习笔记
  • Leetcode 84.柱状图中最大的矩形
  • 鸿蒙智联开发者平台项目的理解介绍
  • apollo配置中心
  • 华为CSE框架的一些知识点
  • vxe-table 将表格指定行设置颜色后,选中行、悬浮行样式失效解决。
  • 这些提高摸鱼效率的自动化测试技巧,提高打工人幸福感~
  • SegmentFault for Android 3.0 发布
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • angular学习第一篇-----环境搭建
  • JSONP原理
  • Mybatis初体验
  • nfs客户端进程变D,延伸linux的lock
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 百度地图API标注+时间轴组件
  • 从零开始在ubuntu上搭建node开发环境
  • 仿天猫超市收藏抛物线动画工具库
  • 力扣(LeetCode)965
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 我从编程教室毕业
  • 小程序开发中的那些坑
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • $(selector).each()和$.each()的区别
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4.10~4.16)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (三) diretfbrc详解
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .chm格式文件如何阅读
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .NET Micro Framework初体验
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 常见的偏门问题
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .net和php怎么连接,php和apache之间如何连接
  • .net快速开发框架源码分享
  • .NET中winform传递参数至Url并获得返回值或文件
  • @JoinTable会自动删除关联表的数据
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell