iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么快速上手vue3
  • 121
分享到

怎么快速上手vue3

2023-06-29 13:06:23 121人浏览 八月长安
摘要

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

这篇“怎么快速上手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”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: 怎么快速上手vue3

本文链接: https://www.lsjlt.com/news/325148.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 怎么快速上手vue3
    这篇“怎么快速上手vue3”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么快速上手vue3”文章吧。全局 API 和应用 ...
    99+
    2023-06-29
  • 如何快速上手Vue3
    这篇文章主要讲解了“如何快速上手Vue3”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何快速上手Vue3”吧!Vue2 与 Vue3 的对比对 TypeS...
    99+
    2024-04-02
  • OneFlow怎么快速上手
    本文小编为大家详细介绍“OneFlow怎么快速上手”,内容详细,步骤清晰,细节处理妥当,希望这篇“OneFlow怎么快速上手”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。安装 O...
    99+
    2024-04-02
  • SAP系统怎么快速上手
    本篇文章为大家展示了SAP系统怎么快速上手,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。SAP系统如何快速上手作为一个在SAP咨询业界打拼十多年的资深人士,我给你的建议是:1,最好是有一个老师带着你...
    99+
    2023-06-05
  • GN快速上手
    文章目录 背景GN快速入门使用GN建立构建环境交叉编译添加tutorial目标BUILD.gn配置说明 使用config使用默认配置 使用参数了解GN构建过程查找依赖GN文件执行脚...
    99+
    2023-09-12
    linux harmonyos
  • Scrapy快速上手
    超详细官方教程解析 https://blog.csdn.net/fly_yr/article/details/51540269   实战过程: 创建一个Scrapy项目 定义提取的Item 编写爬取网站的 spider 并提取 Item...
    99+
    2023-01-31
    上手 快速 Scrapy
  • 十分钟带你快速上手Vue3过渡动画
    目录写在前面Vue的transition组件过渡democlass的命名规则使用animation过渡模式appear属性animate.css库的使用使用动画序列使用自定义过渡cl...
    99+
    2024-04-02
  • 0基础怎么快速上手C#
    C#是一种强大且广泛使用的编程语言,它在软件开发领域有着重要的地位。对于那些没有编程经验的人来说,学习C#可能会感到有些困难,但是只要掌握了正确的学习方法和技巧,你也可以快速上手C#编程。了解C#的基础知识是非常重要的你可以通过阅读相关的书...
    99+
    2023-10-22
    C#使用 C#编程 (C# Programming)
  • Java排序算法怎么快速上手
    本篇内容主要讲解“Java排序算法怎么快速上手”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java排序算法怎么快速上手”吧!插入排序插入排序的基本思想:每步将一个待排序元素,按其排序码大小插入...
    99+
    2023-06-27
  • 如何快速上手SQL
    这篇文章主要为大家展示了“如何快速上手SQL”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何快速上手SQL”这篇文章吧。两张示例表为了方便练习SQL语法,特地...
    99+
    2024-04-02
  • 如何快速上手Rollup
    本篇内容主要讲解“如何快速上手Rollup”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何快速上手Rollup”吧!什么是rollup?系统的了解rollup...
    99+
    2024-04-02
  • 带你快速上手Servlet
    目录一、Servlet与Tomcat的关系二、什么是Servlet三、Servlet的类结构四、ServletConfig类五、ServletContext类六、Servlet的生命...
    99+
    2024-04-02
  • 如何快速上手Picasso
    这篇文章将为大家详细讲解有关如何快速上手Picasso,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Picasso是Square公司出品的一款非常优秀的开源图片加载库,是目前Android开发中超级流行的...
    99+
    2023-06-27
  • 如何快速上手MongoDB
    小编给大家分享一下如何快速上手MongoDB,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。...
    99+
    2023-06-27
  • 如何快速上手PostgreSQL
    本篇内容介绍了“如何快速上手PostgreSQL”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、安装首先,安装PostgreSQL客户端。...
    99+
    2023-06-27
  • 如何快速上手SaltStack
    这篇文章给大家分享的是有关如何快速上手SaltStack的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。SaltStack是一个服务器基础架构集中化管理平台,具备配置管理、远程执行、监控等功能,基于Python语言...
    99+
    2023-06-27
  • 如何快速上手MMdnn
    这篇“如何快速上手MMdnn”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“如何快速上手MMdnn”文章吧。MMdnn 是微软...
    99+
    2023-06-27
  • 如何快速上手GitHub
    这篇文章给大家分享的是有关如何快速上手GitHub的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 Git...
    99+
    2023-06-27
  • 如何快速上手coLinux
    这篇文章给大家分享的是有关如何快速上手coLinux的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。colinux位是一款可以帮助用户创建虚拟系统的工具,通过该软件,您可以在电脑上运行Linux系统,支持在win中...
    99+
    2023-06-27
  • Vue表单快速上手
    目录普通表单初始数据与自动校验与动态赋值发布表单普通表单 我们先可以创建一个普通的表单,我们知道的是表单是相对比较复杂的,antv被我们诟病为就是其表单,这个设计出来的理念就是和别的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作