vue3组合式API

为什么要用组合式API,我们来看看它是如何解决vue2的局限性的

1.vue2的局限性

  1. 当组件内容越来越多,逻辑越来越复杂,可读性就会降低,并且难以维护。

vue2组件采用配置式API,props,data,methods等相关的配置会被放在一起,导致同样的功能块分散,并和其他的功能块混合。我们希望统一功能块的代码可以放在一起,增加可读性


  1. vue2的代码复用机制存在缺点,(Mixins)
  • 容易冲突
  • 依赖关系不明确,不易维护
  • 函数式的mixins不能在实例化过程中使用
  1. vue2对ts的支持度不够友好

2.组合式API的基本用法

组合式API是vue3新增的语法,它并没有替代vue2的配置API,vue2原先的用法不变。组合式API只是更高级的语法

1. setup和ref方法

1<template>
2  <div>
3    <p>Capacity: {{ capacity }}</p>
4    <button @click="increaseCapacity()">Increase Capacity</button>
5    <h2>Attending</h2>
6    <ul>
7      <li v-for="(name, index) in attending" :key="index">{{ name }}</li>
8    </ul>
9  </div>
10</template>
11
12<script>
13import { ref } from "vue";
14export default {
15  setup() {
16    const capacity = ref(4);
17    function increaseCapacity() {
18      capacity.value++;
19    }
20    const attending = ref(["Tim", "Bob", "Joe"]);
21    return { capacity, attending, increaseCapacity };
22  }
23};
24</script>

使用ref创建响应式数据,模板中使用ref对象会自动结构[ref].value,不需要手写.value

2. reactive和computed方法

1<template>
2  <p>Spaces Left: {{ spacesLeft }} out of {{ capacity }}</p>
3  <h2>Attending</h2>
4  <ul>
5    <li v-for="(name, index) in attending" :key="index">
6      {{ name }}
7    </li>
8  </ul>
9  <button @click="increaseCapacity()">Increase Capacity</button>
10</template>
11
12<script>
13import { reactive, computed, toRefs } from "vue";
14export default {
15  setup() {
16    const event = reactive({
17      capacity: 4,
18      attending: ["Tim", "Bob", "Joe"],
19      spacesLeft: computed(() => {
20        return event.capacity - event.attending.length;
21      })
22    });
23    function increaseCapacity() {
24      event.capacity++;
25    }
26    return { ...toRefs(event), increaseCapacity };
27  }
28};
29</script>

直接解构event会导致响应式失效,使用toRefs解构可以规避

3. 可复用的setup

1<template>
2  ...
3</template>
4<script>
5import useEventSpace from "@/use/event-space";
6import useMapping from "@/use/mapping";
7export default {
8  setup() {
9    return { ...useEventSpace(), ...useMapping() }
10  }
11};
12</script>
13
14<!-- event-space.js -->
15import { ref, computed } from "vue";
16export default function useEventSpace() {
17  const capacity = ref(4);
18  const attending = ref(["Tim", "Bob", "Joe"]);
19  const spacesLeft = computed(() => {
20    return capacity.value - attending.value.length;
21  });
22  function increaseCapacity() {
23    capacity.value++;
24  }
25  return { capacity, attending, spacesLeft, increaseCapacity };
26}

4. setup中的生命周期

  • vue3中 beforeDestroy 和 destroyed 更名为 beforeUnmount 和 unmounted
  • setup中使用生命周期函数需在函数前加on
  • setup中不需要使用beforeCreate和created周期函数,- setup中函数的执行顺序是 beforeCreate() -> setup() -> created()
  • 新增两个生命周期:onRenderTracked 和 onRenderTriggered

5. watch

1<template>
2  <div>
3    Search for <input v-model="searchInput" /> 
4    <div>
5      <p>Number of events: {{ results }}</p>
6    </div>
7  </div>
8</template>
9<script>
10import { ref, watch } from "@vue/composition-api";
11import eventApi from "@/api/event.js";
12export default {
13  setup() {
14    const searchInput = ref("");
15    const results = ref(0);
16    watch(() => {
17      results.value = eventApi.getEventCount(searchInput.value);
18    });
19    <span class="hljs-keyword">return</span> { searchInput, results };
20  }
21};
22</script>
23
24<!-- watch 传参 -->
25watch(searchInput, (newVal, oldVal) => {
26  ...
27});
28watch([firstName, lastName], ([newFirst, newLast], [oldFirst, oldLast]) => {
29  ...   
30});



vue3组合式API的更多相关文章

  1. 解决WebStorm无法正确识别Vue3组合式API的问题

    1 问题描述 Vue3的组合式API无法在WebStorm中正确识别,表现为defineComponent等无法被识别: 2 尝试方案 猜想这种问题的原因是无法正确识别对应的Vue3库,笔者相信Web ...

  2. [Vue]浅谈Vue3组合式API带来的好处以及选项API的坏处

    前言 如果是经验不够多的同志在学习Vue的时候,在最开始会接触到Vue传统的方式(选项式API),后边会接触到Vue3的新方式 -- 组合式API.相信会有不少同志会陷入迷茫,因为我第一次听到新的名词 ...

  3. Vue3 组合式 API 中获取 DOM 节点的问题

    模板引用 Vue 提供了许多指令让我们可以直接操作组件的模板.但是在某些情况下,我们仍然需要访问底层 DOM 元素.在模板中添加一个特殊的属性ref就可以得到该元素. 访问模板引用 <scrip ...

  4. 第三十五篇:vue3,(组合式api的初步理解)

    好家伙, 来一波核心概念:数据劫持是响应式的核心 1.由set up开始 (1)vue3中的一个新的配置项,值为一个函数. (2)组件中所用的到的:数据,方法,计算属性均要配置在set up中. (3 ...

  5. 一篇文章讲明白vue3的script setup,拥抱组合式API!

    引言 vue3除了Composition API是一个亮点之外,尤大大又给我们带来了一个全新的玩意 -- script setup,对于setup大家相信都不陌生,而对于script setup有些同 ...

  6. Vue3全局APi解析-源码学习

    本文章共5314字,预计阅读时间5-15分钟. 前言 不知不觉Vue-next的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步. 我们以官 ...

  7. Vue3 Composition API写烦了,试试新语法糖吧—setup script

    前言 Vue3发布近一年了,相信大家对Vue3的新特性,新语法都很熟悉了.那么在使用Composition API的过程中,有没有觉得整个过程比较繁琐.比如你的模板里用到了大量的state和方法的时候 ...

  8. 熬夜讲解vue3组合API中setup、 ref、reactive的用法

    1.初识setUp的使用 简单介绍下面的代码功能: 使用ref函数,去使用监听某一个变量的变化,并且把它渲染到视图上. setUp函数是组合API的入口函数.这个是非常重要的. setUp可以去监听变 ...

  9. Vue3 中有哪些值得深究的知识点?

    众所周知,前端技术一直更新很快,这不 vue3 也问世这么久了,今天就来给大家分享下vue3中值得注意的知识点.喜欢的话建议收藏,点个关注! 1.createApp vue2 和 vue3 在创建实例 ...

随机推荐

  1. 前端知识之BOM和DOM

    前端基础之BOM和DOM windw对象 指浏览器窗口,所有的浏览器都支持window对象 常用的window方法 window.innerHeight 浏览器窗口的内部高度 window.inner ...

  2. 4月13日 python学习总结 组合与封装

    一.组合      解决类与类之间代码冗余问题有两种解决方案:1.继承 2.组合 1.继承:描述的是类与类之间,什么是什么的关系 2.组合:描述的是类与类之间的关系,是一种什么有什么关系 一个类产生的 ...

  3. 后端跨域问题究极解决 nginx+springboot 解决OPTIONS通过却报CORS的问题

    location /joinus { # 允许跨域请求的"域",有些请求不允许* add_header 'Access-Control-Allow-Origin' $http_or ...

  4. Windows安全加固手册

    1      身份鉴别 1.1         密码安全策略 要求:操作系统和数据库系统管理用户身份鉴别信息应具有不易被冒用的特点,口令应有复杂度要求并定期更换. 目的:设置有效的密码策略,防止攻击者 ...

  5. session 会话机制以及变量覆盖

    session会话机制介绍如下 http是无状态协议.服务器靠cookie和session来记住用户.$_SESSION 和 $_GET等一样,是超全局变量. 后台脚本里面会写: session() ...

  6. 你应该知道的Redis事务

    前两篇 Redis 文章都大几千字,今天我们换个小清新点的 如果你也了解过关系型数据库事务的话,相信这篇文章对你来说是很容易理解的了.具体什么是事务我就不说不多了,直接讲 Redis 事务相关的部分. ...

  7. APUE1--3.8-3.10wirte、read函数以及IO效率

    1read函数 #include<unistd.h> ssize_t read(int fd,void* buf,size_t nbytes) 返回值:读到的字节数,若已到文件尾,返回0; ...

  8. vector存放边的方法

    #include<bits/stdc++.h> using namespace std; struct Edge{ int x; int y; }; vector <Edge> ...

  9. Eureka和ZooKeeper都可以提供服务注册与发现的功能,请说说两个的区别?

    1.ZooKeeper保证的是CP,Eureka保证的是AP ZooKeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka各个节点是平等关系,只要有一台Eureka ...

  10. web.xml---配置文件概要

    web.xml分发器: case1: springMvc的分发器: 作用:将匹配上的请求交由springMvc处理,路径会继续到达springMvc的处理器映射器 <servlet> &l ...