首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[ Vue ] 基于 Vue 3 的新特性的理解和思考

[ Vue ] 基于 Vue 3 的新特性的理解和思考

原创
作者头像
GavinUI
修改于 2021-06-28 02:41:29
修改于 2021-06-28 02:41:29
7750
举报
文章被收录于专栏:GavinUIGavinUI

vue 新特性的出现往往需要关注的就是,他的特性对我之前开发的项目或者即将开发的项目有什么能进行更好的技术方案的优化和调整,也可以说是它解决了什么问题。而 Composition API 是这一次 vue 3 的更新重点。

Composition API

Composition API 的出现就是为了解决交互逻辑繁重的情况下,让函数更加方便的调用和易于让开发者理解而出现的。其核心思想就是将相关的代码收集在一起。

先抛开 Vue2 或者 Vue3 ,在我之前的一个项目开发中,由于处理的逻辑相对较多,我就将一些逻辑做了抽离放在了不同的函数里面, Vue2 代码如下:

代码语言:txt
AI代码解释
复制
  methods: {
    format() {
      this.fun1();
      this.fun2();
      this.fun3();
      this.fun4();
      this.fun5();
    },
    fun1() { },
    fun2() { },
    fun3() { },
    fun4() { },
    fun5() { },
  },

当然这里是做了逻辑简化,写肯定不是这样写,只是想说明 format 这个方法里面引用和至少 5 个函数,我在抽离逻辑的时候是弄得很爽的,抽了一大摞的代码之后再调用感觉贼溜。

但是在提 codeReview 给大佬的时候,他看了之后马上说出了这个地方的不足,因为自己写起来很爽,但是看的人却不是这样一会滚动到 20 行看 fun1 ,一会要滚动到 130行看 fun2 ,再一会要滚动到 1000 行看 fun3 ,所以都最后不但是别人看累了,自己看懵了。

所以,他提出了尽可能将相关的函数点放在同一个函数之中,代码如下

代码语言:txt
AI代码解释
复制
  methods: {
    format() {
      const fun1 = () => { };
      const fun2 = () => { };
      const fun3 = () => { };
      const fun4 = () => { };
      const fun5 = () => { };
    },
  },

他的实际优化由原来的:

改为了:

这样能更加清晰的了解这个 format 函数模块是做了什么依赖了什么, 不但自己能非常快的理解函数的执行,别人也容易阅读,这是简化代码开发的思想。

回到 vue 这里,在 Vue2 的版本,开发页面逻辑使用 watch ,methods,data ,computed 等组件选项来组织逻辑都是非常的方便,但是面对交互比较繁重的页面,这些逻辑看起来也会比较臃肿,不容易理解。

官网的说明文档也给出了一个偏向于实际的简单例子:

代码语言:txt
AI代码解释
复制
export default {
  components: { RepositoriesFilters, RepositoriesSortBy, RepositoriesList },
  props: {
    user: { 
      type: String,
      required: true
    }
  },
  data () {
    return {
      repositories: [], 
      filters: { ... }, 
      searchQuery: '' 
    }
  },
  computed: {
    filteredRepositories () { ... }, 
    repositoriesMatchingSearchQuery () { ... }, 
  },
  watch: {
    user: 'getUserRepositories' 
  },
  methods: {
    getUserRepositories () {
    }, 
    updateFilters () { ... }, 
  },
  mounted () {
    this.getUserRepositories() 
  }
}

这里组件的选项全用上,再后面交互越多,各种逻辑的交互代码肯定是以一个个“块”的单位垒起来。而 Composition API 的使用的目的就是要将逻辑进行聚合。

Composition API 的使用

vue 3 中新增加了一个组件选项 setup,他是在创建之前执行,在 props 在解析的时候,就作为 Composition API 的入口。

代码语言:txt
AI代码解释
复制
export default {
  components: { ... },
  props: {
    user: {
      type: String,
      required: true
    }
  },
  setup(props) {
    console.log(props)
    return {}
  }

}

他和 props 等其他组件选项一样统一,返回的是一个对象,这个对象可以在其他的地方进行使用,可以说是组件内提供了一个 api 通用函数。

带 ref 的响应式变量

在 vue3 中 , 可以通过一个新的 ref 函数使任何现响应式变量在任何地方起作用。

代码语言:txt
AI代码解释
复制
import { ref } from 'vue'
const counter = ref(0)
console.log(counter) // { value: 0 }
console.log(counter.value) // 0

counter.value++
console.log(counter.value) // 1

将一个值封装在一个对象内,好处是由于对象取的是一个引用,他在修改新数据的时候不会影响旧的数据, 官网 DEMO 展示。

代码语言:txt
AI代码解释
复制
import { fetchUserRepositories } from '@/api/repositories'
import { ref } from 'vue'

export default {
  components: { RepositoriesFilters, RepositoriesSortBy, RepositoriesList },
  props: {
    user: {
      type: String,
      required: true
    }
  },
  setup (props) {
    const repositories = ref([])
    const getUserRepositories = async () => {
      repositories.value = await fetchUserRepositories(props.user)
    }

    return {
      repositories,
      getUserRepositories
    }
  },
  data () {
    return {
      filters: { ... }, 
      searchQuery: '' 
    }
  },
  computed: {
    filteredRepositories () { ... }, 
    repositoriesMatchingSearchQuery () { ... }, 
  },
  watch: {
    user: 'getUserRepositories' 
  },
  methods: {
    updateFilters () { ... },
  },
  mounted () {
    this.getUserRepositories() 
  }
}

需要注意的是 ,需要将原来 data 中的 repositories 去掉,因为 repositories 这个变量现在由 setup 这个组件选项返回回来。

setup 中钩子函数的使用

在 setup 中,生命周期的钩子函数与选项式 API 是一样的,只不过他的钩子函数的名字在前面增加了 on 。举例 mount 和 beforeount 。

代码语言:txt
AI代码解释
复制
  setup(props) {
    const resList = ref([]);
    const fetchUserList = () => {
      resList.value = props.user;
    }
    onBeforeMount(getClass);
    onMounted(fetchUserList);
    return {
      resList,
      fetchUserList
    }
  },

那么在这里有一些方法也可以不用挂在外层,只要通过 onMounted 来执行。

setup 中的 watch 监听

监听器的方法和选项式 API 方法上大师是一样的,watch 在这里同样是可以监听 props 的内容,但是还是有不同,监听的对象是经过了 toRefs 方法的一层解析, 就是给 props 中 user 的响应式引用。

代码语言:txt
AI代码解释
复制
import {toRefs } from 'vue';
const { user } = toRefs(props);

这么做的目的是更好的监听 props 中 user 的变化,在使用上,watch 的第二个参数就是当监听对象发生改变的时候执行回调函数。

代码语言:txt
AI代码解释
复制
import { ajax } from 'majax';
import { ref, onMounted, watch, toRefs } from 'vue'

setup (props) {
  const { user } = toRefs(props)
  const resList = ref([])
  const fetchUserList = async () => {
    resList.value = await ajax(user.value)
  }
  onMounted(fetchUserList)
  watch(user, fetchUserList)
  return {
    resList,
    fetchUserList
  }
}

setup 的中 computed 属性

结合最基本的 demo 和说明:

代码语言:txt
AI代码解释
复制
import { ref, computed } from 'vue'
const counter = ref(0)
const twiceTheCounter = computed(() => counter.value * 2)
counter.value++
console.log(counter.value) 
console.log(twiceTheCounter.value)

computed 接受一个参数,这个参数是相当于一个回掉函数,在 setup 中还是需要 对新建的变量进行计算 ,如上例 conter.value。真实的使用情况则是:

代码语言:txt
AI代码解释
复制
import { majax } from 'majax'
import { ref, onMounted, watch, toRefs, computed } from 'vue'

setup (props) {
  const { user } = toRefs(props)
  const resList = ref([])
  const fetchUserList = async () => {
    resList.value = await majax(user.value)
  }
  onMounted(fetchUserList)
  watch(user, fetchUserList)
  const searchQuery = ref('')
  const MatchingQuery = computed(() => {
    return resList.value.filter(
      item => item.name.includes(searchQuery.value)
    )
  })
  return {
    resList,
    fetchUserList,
    searchQuery,
    MatchingQuery
  }
}

直到这里整一个 setup 就有个一个完整的功能,他的选项api 包含了 watch,computed,data 还有ref 函数。

在把功能点都挪到了 setup 中之后,虽然逻辑上会更加的清晰明了 ,但是随之而来的也是 setup 的体积越来越大。需要将刚刚的方法再进一步的抽离,举例有查询和列表渲染的两个功能,将他们的功能逻辑和钩子等Composition API 所需属性抽离放在两个不同的 JS 模块导出。我将官网的 DEMO 代码精简了一下,下面的两个代码块,分别是查询和列表获取的功能:

获取列表模块的代码:

代码语言:txt
AI代码解释
复制
// fetchUserList.js
import { ajax } from 'majax';
import { ref, onMounted, watch } from 'vue';

export default function fetchUserList(user) {
  const resList = ref([])
  const fetchUserList = async () => {
    resList.value = await ajax(user.value)
  }
  onMounted(fetchUserList)
  watch(user, fetchUserList)
  return {
    resList,
    fetchUserList
  }
}

筛选模块的代码:

代码语言:txt
AI代码解释
复制
// searchUserList.js
import { ref, computed } from 'vue'

export default function searchName(resList) {
  const searchQuery = ref('')
  const MatchingQuery = computed(() => {
    return resList.value.filter(repository => {
      return repository.name.includes(searchQuery.value)
    })
  })
  return {
    searchQuery,
    MatchingQuery
  }
}

有了这两个模块的代码之后,再将它引入回 setup 选项中:

代码语言:txt
AI代码解释
复制
import fetchUserList from 'fetchUserList.js'
import searchUserList from 'searchUserList.js'
import { toRefs } from 'vue'

export default {
...
  setup (props) {
    const { user } = toRefs(props)
    const { resList, fetchUserList } = fetchUserList(user)
    const { searchQuery, MatchingQuery } = searchUserList(repositories)
    return {
      resList: MatchingQuery,
      fetchUserList,
      searchQuery,
    }
  },
  ...
}

总结一下,Composition API 做了一件这样事情,他将功能相同的逻辑不在像之前一样,逻辑代码分别散落在 watch 或者是 computed 中,而是将所相关的代码逻辑聚合到一个功能模块上,再来使用这个模块上的功能,用一张图来表示就是:

他们转化为以功能为单位的模块。以上是对 Composition API 的功能理解。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
是时候系统学习一下Vue3在Web前端中的用法了!
大家都知道互联网的技术框架更新迭代得非常快,自己如果不及时跟上就容易落伍,尤其是当一门技术或者一个框架在行业内火起来之后,这时候如果还不去学习它就容易让自己被时代所淘汰。Vue3发布都一年多了,最近接手公司项目的前端工程里就开始全面使用Vue3了。笔者也了解到,自从vue3在2020年发布之后,由于Vue3相比Vue2具有很多优势,因此国内很多互联网公司在构建前端项目时都已经开始转向使用Vue3。因为项目需要而去学总显得有些被动,毕竟现学现用多少会在一定程度上耽误自己的工作进展。而平时利用周末时间主动学习掌握的东西等到工作中需要时,直接上手即可,省去了从零开始学习的成本,当然在工作项目中用起来也是对自己学习成果的检验和强化!
用户3587585
2022/03/11
2.2K0
是时候系统学习一下Vue3在Web前端中的用法了!
Vue3 学习笔记 —— (一)深入理解组合式 API
Vue3 是向下兼容 Vue2 API 的,但是 Vue3 中提供了一种全新的 Composition API
Gorit
2021/12/08
7960
Vue3 学习笔记 —— (一)深入理解组合式 API
VUE3.0和VUE2.0语法上的不同
前言:本篇文章只做VUE3.0和VUE2.0语法上的不同分析,不做性能和源码架构等的分析。
javascript艺术
2022/06/08
1.6K0
VUE3.0和VUE2.0语法上的不同
Vue3.0 不畏惧祖传代码的 Composition API
昨晚写这篇文章的时候,隔壁在聚餐,几位女生欢聚一堂,整个楼层充满了欢声笑语的味道,就好像早上刷牙刷一半就跑去吃了个鸡蛋。
用户1890129
2020/12/16
5820
Vue3 初探
3.更友好 提出 composition Api,无论代码的编写还是查看都更加清晰方便
epoos
2022/06/06
8390
vue3-Composition-API实操
我们都知道composition api是可以和options api一起使用、友好相处的,比如下面的示例:
刘嘿哈
2022/10/25
4890
Vue3 Composition API 之 setup 函数
在说 Vue3 之前,我们先看看 Vue2 项目中是如何编写逻辑代码的, 新建一个组件
青年码农
2022/12/13
4950
Vue3 Composition API 之 setup 函数
Vue3.0 新特性全面探索 - 基于 Composition Api 快速构建实战项目
建议配合 Visual Studio Code 和 Vue 3 Snippets 代码插件食用Ψ( ̄∀ ̄)Ψ。
wscats
2020/06/06
1.5K0
vue3.0新特性
在 vue3 的 script 中不再使用 data 和 methods ,而是使用 setup() 方法
青梅煮码
2023/02/18
3950
Vue3.0 新特性以及使用变更总结(实际工作用到的)
Vue3.0 在去年9月正式发布了,也有许多小伙伴都热情的拥抱Vue3.0。去年年底我们新项目使用Vue3.0来开发,这篇文章就是在使用后的一个总结, 包含Vue3新特性的使用以及一些用法上的变更。
@超人
2021/03/23
2.7K0
Vue3.0 新特性以及使用变更总结(实际工作用到的)
@vue/composition-api速成课(通俗易懂版)
Composition API 将是 Vue 3 的核心功能,它具有许多更改和性能改进。我们也可以在 Vue 2 中通过 npm 插件@vue/composition-api 使用它。本人重点将带你了解:
前端迷
2020/09/30
2.9K0
Vue 3.x全面升级指南:Composition API深度探索
Vue 3.x 的全面升级引入了 Composition API,这是对 Vue 2.x 传统 Options API 的一个重大改进,它提供了更加灵活和模块化的代码组织方式.
天涯学馆
2024/05/16
3130
10 个超强 Vue3 实战指南,由此突破新特性!
本篇介绍 10 点如何从实战中学习突破 Vue JS 3 的新特性,细细看完,一定会有收获~
掘金安东尼
2022/09/22
1.2K0
10 个超强 Vue3 实战指南,由此突破新特性!
vue3之Composition API详解
没有Composition API之前vue相关业务的代码需要配置到option的特定的区域,中小型项目是没有问题的,但是在大型项目中会导致后期的维护性比较复杂,同时代码可复用性不高。Vue3.x中的composition-api就是为了解决这个问题而生的
前端进阶之旅
2021/10/16
2.2K0
vue3之Composition API详解
5 种在 Vue 3 中定义组件的方法
英文 | https://fadamakis.com/the-5-ways-to-define-a-component-in-vue-3-aeb01ac6f39f
winty
2023/08/23
7140
5 种在 Vue 3 中定义组件的方法
Taro 支持使用 Vue3 开发小程序
9 月 19 日凌晨,Vue3 在经过多个开发版本的迭代后,终于迎来了它的正式版本,"One Piece" 的代号也昭示了其开拓伟大航路的野心。
一只图雀
2020/11/03
2.7K0
Taro 支持使用 Vue3 开发小程序
vue3简易入门剖析
,发音同 “veet”)是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成:
张哥编程
2024/12/13
5690
Vue 3.0 有哪些新特性值得我们提前了解
Vue.js 作者兼核心开发者尤雨溪宣布 Vue 3.0 进入 Beta 阶段。
Vam的金豆之路
2021/11/30
7210
Vue 3.0 有哪些新特性值得我们提前了解
一文让你30分钟快速掌握Vue3
https://juejin.im/post/6887359442354962445
ConardLi
2020/11/03
1.5K0
一文让你30分钟快速掌握Vue3
让你30分钟快速掌握vue 3
经过了漫长的迭代,Vue 3.0终于在上2020-09-18发布了,带了翻天覆地的变化,使用了Typescript 进行了大规模的重构,带来了Composition API RFC版本,类似React Hook 一样的写Vue,可以自定义自己的hook ,让使用者更加的灵活,接下来总结一下vue 3.0 带来的部分新特性。
前端开发博客
2020/11/04
2.5K0
相关推荐
是时候系统学习一下Vue3在Web前端中的用法了!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档