我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么快速上手vue3

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎么快速上手vue3

这篇“怎么快速上手vue3”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么快速上手vue3”文章吧。

怎么快速上手vue3

全局 API 和应用 API

vue3的一个新概念,返回一个提供应用上下文的应用实例,应用实例挂载的整个组件树共享同一个上下文:

const app = createApp(App);app.use(store).use(router).mount("#app");

vue2:

new Vue({  router,  store,  render: (h) => h(App),}).$mount("#app");

然后以前用Vue.的那些API都变成用这个应用实例app.:

vue2vue3
Vue.componentapp.component
app.configapp.config
app.directiveapp.directive
app.mixinapp.mixin
app.useapp.use

其它API像nextTick、h等都是直接从vue结构出来使用:

import { createApp, h, nextTick } from 'vue'

composition API

tips
  • vue3中不再使用this

  • vue3组件不需要根标签,但是会有警告Extraneous non-props attributes

  • 推荐使用单文件组件,后面的实现代码都是单文件组件方式

setup

这个可太重要了,vue3把这个函数当作了入口点。接收两个参数props和context。函数会在beforeCreate、created之前执行,可以说取代了beforeCreate、created成为新的生命周期。新增的composition API都写在setup函数中。

props就是vue2的props,context则提供attrs、slots、emit等。通过return一个对象,把响应式数据暴露给template,相当于vue2的data,不同的是函数也是这样暴露给template:

<template>  <div class="hello">    <h2>{{ msg }}</h2>    <h2 @click="test">{{ isRef }}</h2>  </div></template><script lang="ts">import { defineComponent, ref } from "vue";export default defineComponent({  name: "HelloWorld",  props: {    msg: String,  },  setup(props) {    console.log(props.msg);    let isRef = ref("is ref");    const test = () => {      console.log(isRef.value);    };    return {      isRef,      test,    };  },});</script>
单文件组件

vue3还提供了单文件组件(推荐),将setup加到script上,里面的代码就会被编译成setup函数。比较重要的几个点:

顶层的绑定会被暴露给模板

声明的顶层的绑定 (包括变量,函数声明,以及 import 引入的内容) 都能在模板中直接使用响应式数据、组件等也可以直接使用:

<template>  <div class="hello">    <h2>{{ msg }}</h2>    <h2 @click="test">{{ isRef }}</h2>  </div><MyComponent /></template><script lang="ts" setup>import MyComponent from './MyComponent.vue'import { ref } from "vue";const msg = "msg";const isRef = ref("");function test() {  console.log(isRef.value);}</script>

使用单文件组件,一些属性的使用也要改变,当然也有其它替代的API:

属性对应
props和emitsdefineProps和defineEmits
ref或者$parentdefineExpose
slots和attrsuseSlots和useAttrs()
ref

接受一个内部值并返回一个响应式且可变的 ref 对象,在setup函数内部访问ref函数需要加.value,如果要加类型,要用泛型,不加则会类型推论,也可以不给初始值,则是any,且是undefined:

const ref1 = ref(1);const ref2 = ref<number>(2);const ref3 = ref1.value;//不是响应式,相当于变量const ref4 = ref();//refs.value是undefinedref2.value = 5;//赋值 读取都要.value

一般来说,ref只会赋值基础数据类型和数组,也可以泛型联合类型如果将对象分配为ref值,则它将被reactive函数处理为深层的响应式对象:

//不建议,内部也是reactive处理const ref1 = ref({  a: 10,});//不确定类型const ref3 = ref<string | number>();ref3.value = 1;ref3.value = "";//数组对象,ts类型声明,用泛型type Obj1 = { c: string };type Obj2 = {  b: string;  c: Obj1[];};const ref2 = ref<Obj2[]>([  {    b: "",    c: [{ c: "" }],  },]);
reactive

用来声明响应式的对象,类型通过泛型添加:

type Obj = {  a: number;  b: string;};let obj = reactive<Obj>({  a: 10,  b: "",});let state = reactive({  a: 10,  b: "",});

reactive将会解包所有深层的 refs,同时维持ref的响应性,将ref分配给reactive的property时,ref也会被自动解包。简单说就是ref的值和reactive的值响应式了

const count = ref(1)const obj = reactive({ count })// ref 会被解包console.log(obj.count === count.value) // true// 它会更新 `obj.count`count.value++console.log(count.value) // 2console.log(obj.count) // 2// 它也会更新 `count` refobj.count++console.log(obj.count) // 3console.log(count.value) // 3//跟上面一样效果const count = ref(1)const obj = reactive({})obj.count = countconsole.log(obj.count) // 1console.log(obj.count === count.value) // true
toRef

为源响应式对象上的某个property新创建一个ref,也就是reactive创建的才可以,会保持对其源 property 的响应式连接:

const state = reactive({  foo: 1,  bar: 2})const fooRef = toRef(state, 'foo')fooRef.value++console.log(state.foo) // 2state.foo++console.log(fooRef.value) // 3
toRefs

将响应式对象转换为普通对象,其中结果对象的每个property都是指向原始对象相应property的ref:

const state = reactive({  foo: 1,  bar: 2})const stateAsRefs = toRefs(state)// ref 和原始 property 已经“链接”起来了state.foo++console.log(stateAsRefs.foo.value) // 2stateAsRefs.foo.value++console.log(state.foo) // 3

toRef和toRefs在对一些响应式对象结构展开会很有用,可以有用的时候看看。

watch

watch接收两个参数,第一个参数可以是有return的函数,也可以是一个ref,第二个参数则跟vue2相同的函数,并且watch可以很多个:

//一般ref不用这种方式let count = ref(0);watch(  () => count.value,  (val, old) => {    console.log(old, val);  });//单个ref推荐watch(count, (val, old) => {  console.log(old, val);});//监听reactive对象let state = reactive({ count: 0 });//函数参数必须具体到某个值,如果是() => state无效,或者加上{ deep: true }watch(  () => state.count,  (val, old) => {    console.log(old, val);  });//加上{ deep: true }watch(  () => state,  (val, old) => {    console.log(old, val);  },  { deep: true });//监听整个对象,新旧的值都相同,或者用lodash.cloneDeep进行深拷贝//state改成() => _.cloneDeep(state)watch(state, (val, old) => {  console.log(old.count, val.count);});

也可以同时监听多个,两个参数分别用数组,个人还是建议单个:

const state = reactive({ count: 1 });const count = ref(0);// 监听一个数组watch(  [() => state.count, count],  ([newState, newCount], [oldState, oldCount]) => {    console.log("new:", newState, newCount);    console.log("old:", oldState, oldCount);  });

官网一直提到惰性,其实就是是否加immediate: true,加了初始化就会执行。

watchEffect

它"立即执行"传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数:

const state = reactive({ count: 1 });const count = ref(0);watchEffect(() => {  if (state.count > 3) {    count.value++;  }});watchEffect(() => console.log(count.value));

至于watch和watchEffect共享停止侦听,清除副作用 (相应地 onInvalidate 会作为回调的第三个参数传入)、副作用刷新时机和侦听器调试行为后面要仔细研究一下。

computed

从vue2开始,就很多人分不清什么时候用computed什么时候用watch,computed主要是用来声明有两个及以上的依赖的数据,也就是说一个变量是根据多个数据进行判断的,用computed,单个的用watch。至于语法的不同就不多说了,vue3的computed常用语法是一个带有return的函数,也可以同时存在多个:

let count = ref(0);let page = ref(0);let pg = computed(() => {  return count.value + page.value;});

要注意,computed声明的变量(pg)是不能直接去修改的(只读),跟vue2一样也有get、set函数(可读可写)。

defineProps、defineEmits

在单文件组件中必须使用defineProps和defineEmits API来声明props和emits,可以算是语法糖。父组件还是跟原来一样传值,子组件接收:

//父组件<template>  <div class="home">    <input v-model="msg" />    <HelloWorld :msg="msg" @change="change" />  </div></template><script lang="ts" setup>import { ref } from "vue";import HelloWorld from "@/components/HelloWorld.vue";let msg = ref("is parent");const change = (val: string) => {  msg.value = val;};</script>//子组件<template>  <div>{{ msg }}</div>  <button @click="change">emit</button></template><script lang="ts" setup>import { defineProps, defineEmits } from "vue";const props = defineProps({  msg: String,});console.log(props.msg);const emit = defineEmits(["change"]);const change = () => {  emit("change", "is son");};</script>//设置默认值defineProps({  msg: {    type: Number,    default: 100,  },});

template可以直接使用msg,要调用的话就得props.msg。

withDefaults

defineProps只能限制类型,没有提供默认值(这边应该是限定用ts的接口才没有默认值)。为了解决这个问题,提供了 withDefaults 编译器宏:

type Porps = {  msg: string;};const props = withDefaults(defineProps<Porps>(), {  msg: "default",});

withDefaults接收两个参数,第一个参数是defineProps加props字段的泛型,第二个字段是默认值,也可以不设置。

也可以监听props:

watch(  () => props.msg,  (val) => {    console.log(val);  });
this.$refs

vue2很多情况还是需要用到这个api,vue3中比较特别,为了获得对模板内元素或组件实例的引用,我们可以像往常一样声明ref,在渲染上下文中暴露root,并通过ref="root",将其绑定到 div 作为其 ref。在虚拟DOM补丁算法中,如果 VNode 的 ref 键对应于渲染上下文中的 ref,则VNode的相应元素或组件实例将被分配给该ref的值。这是在虚拟 DOM 挂载/打补丁过程中执行的,因此模板引用只会在初始渲染之后获得赋值。

<button ref="testRef">testRef</button>let testRef = ref(null);onMounted(() => {  // DOM 元素将在初始渲染后分配给 ref  console.log(testRef.value); // <button>testRef</button>});
nextTick

跟vue2一样的使用:

nextTick(() => {  console.log(testRef.value);});

也可以跟官网提供的一样用async的函数await:

let testRef = ref(null);const nextTickFn = async () => {  await nextTick();  console.log(testRef.value);};nextTickFn();
defineExpose

vue2有时候会用this.$refs调用子组件的函数或者变量,单文件组件是默认关闭的,所以单文件组件要用defineExpose编译器宏暴露出去:

//父组件<template>  <div class="home">    <HelloWorld ref="sonRef" />  </div></template><script lang="ts" setup>import { nextTick, ref } from "vue";import HelloWorld from "@/components/HelloWorld.vue";let sonRef = ref();nextTick(() => {  sonRef.value.sonFn();  console.log(sonRef.value.sonRef);});</script>//子组件let sonRef = ref("is son");const sonFn = () => {  console.log("is son fn");};defineExpose({ sonFn, sonRef });

vue2的this.$parent在单文件组件中,自己是实现了,但是官方没有直接给出代码:

//父组件const parentRef = ref("is parent ref");const parentFn = () => {  console.log("is parent fn");};defineExpose({  parentRef,  parentFn,});//子组件let parent = getCurrentInstance();console.log(parent?.parent?.exposed?.parentRef.value);parent?.parent?.exposed?.parentFn();

新增组件

teleport

官网介绍了很多,这个组件最大的作用就是可以让组件脱离固定的组件位置,可以挂载在逻辑上最优的位置,其它使用都跟组件一样,只有位置改变:

<teleport to="#teleportDiv">  <HelloWorld /></teleport><teleport to="body">  <HelloWorld /></teleport>

挂载的元素会从上向下解析,第一个to的元素,标签、class、id等。一般使用也不会随便,都会用id元素或者body。

Suspense

Suspense是一个试验性的新特性,官方也说生产环境请勿使用。主要是允许将组件异步处理等待过程提升到组件树中处理。

单文件组件里面顶层await里面提到:async setup() 必须与 Suspense 组合使用,Suspense 目前还是处于实验阶段的特性。我们打算在将来的某个发布版本中开发完成并提供文档。

所以这边就不给出不是单文件组件的代码实现了。

生命周期

生命周期还是跟原来的一样,只是前面都加上了on,destroy都变成了unmount。setup会在beforeCreate、created之前执行,取代了beforeCreate、created。

  • beforeCreate --> beforeCreate

  • created --> setup

  • beforeMount --> onBeforeMount

  • mounted --> onMounted

  • beforeUpdate --> onBeforeUpdate

  • updated --> onUpdated

  • beforeDestroy --> onBeforeUnmount

  • destroyed --> onUnmount

使用:

onMounted(() => {  console.log("mounted");});

试了一下,居然可以写多个。

vue3新增或者删除了哪些API,其实没必要一下子全部去记住,当一些API使用的时候如果发现不生效了,再去官网查一下,当然,基础的这些API就得记下来。

以上就是关于“怎么快速上手vue3”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎么快速上手vue3

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么快速上手vue3

这篇“怎么快速上手vue3”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么快速上手vue3”文章吧。全局 API 和应用
2023-06-29

SAP系统怎么快速上手

本篇文章为大家展示了SAP系统怎么快速上手,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SAP系统如何快速上手作为一个在SAP咨询业界打拼十多年的资深人士,我给你的建议是:1,最好是有一个老师带着你
2023-06-05

Scrapy快速上手

超详细官方教程解析https://blog.csdn.net/fly_yr/article/details/51540269 实战过程:创建一个Scrapy项目定义提取的Item编写爬取网站的 spider 并提取 Item编写 Item
2023-01-31
2023-09-12

0基础怎么快速上手C#

C#是一种强大且广泛使用的编程语言,它在软件开发领域有着重要的地位。对于那些没有编程经验的人来说,学习C#可能会感到有些困难,但是只要掌握了正确的学习方法和技巧,你也可以快速上手C#编程。了解C#的基础知识是非常重要的你可以通过阅读相关的书
2023-10-22

Java排序算法怎么快速上手

本篇内容主要讲解“Java排序算法怎么快速上手”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java排序算法怎么快速上手”吧!插入排序插入排序的基本思想:每步将一个待排序元素,按其排序码大小插入
2023-06-27

如何快速上手MMdnn

这篇“如何快速上手MMdnn”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何快速上手MMdnn”文章吧。MMdnn 是微软
2023-06-27

如何快速上手GitHub

这篇文章给大家分享的是有关如何快速上手GitHub的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 Git
2023-06-27

如何快速上手Picasso

这篇文章将为大家详细讲解有关如何快速上手Picasso,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Picasso是Square公司出品的一款非常优秀的开源图片加载库,是目前Android开发中超级流行的
2023-06-27

如何快速上手coLinux

这篇文章给大家分享的是有关如何快速上手coLinux的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。colinux位是一款可以帮助用户创建虚拟系统的工具,通过该软件,您可以在电脑上运行Linux系统,支持在win中
2023-06-27

如何快速上手PostgreSQL

本篇内容介绍了“如何快速上手PostgreSQL”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、安装首先,安装PostgreSQL客户端。
2023-06-27

如何快速上手MongoDB

小编给大家分享一下如何快速上手MongoDB,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。
2023-06-27

如何快速上手SaltStack

这篇文章给大家分享的是有关如何快速上手SaltStack的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言
2023-06-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录