Vue3 使用

title: Vue3 使用 id: 374fa499baec7b3f797cb34a70d028f4 tags: [] date: 2000/01/01 00:00:00 updated: 2023/03/04 19:29:12 isPublic: true --#|[分隔]|#--

Vue3 使用

由于 vue3 使用的新技术,一些旧版本的插件或依赖,可能支持的不太完善,下面是 vue3 技术栈的相关文档们。

使用脚手架创建 vue3 项目

官方提供了两种方式创建脚手架。

使用传统 vue/cli

传统的 vue/cli,使用 webpack 编译打包。

yarn global add @vue/cli
# 或
npm install -g @vue/cli

然后在 Vue 项目运行:

vue upgrade --next

使用官方推荐的新编译工具框架 vite

Vite 是一个 web 开发构建工具,由于其原生 ES 模块导入方法,它允许快速提供代码。

需要 node 版本 >=12.0.0。

直接执行下面指令,后面再填写项目名称、选择项目模板时选择 vue

以前还有几种方式,比如执行 npm init @vitejs/appnpm init vite-app 【项目名称】 ,这些是之前版本的 vite 的生成项目的方式,已弃用。

Tip:后续启动开发服务和打包时,可能会报错如下所示:

则有可能是因为,当前 nodejs 使用的 npm 是 v7 以上的版本,这是 npm 的一个小bug,需要再执行一下下面的指令,即可正常使用:

此后,只有当重新安装了 esbuild 这个依赖后,才需要再执行该指令。

组合API --- Composition API

组合API,又名注入API。

setup、ref 和 reactive

setup 方法:

  • 它是组合API的入口函数

  • 在 beforeCreate 和 created 之间执行

  • 方法内部的 this 为 undefined,所以无法访问 this(可以通过 vue 的 getCurrentInstance 方法,获取到当前实例 ctx

  • 第一个参数为 props,但前提需要先用 vue2 中的 props 字段接收一下

  • 方法返回一个对象,对象中的字段,比如字段和方法,后续都可以使用 this 访问,且可以用在页面模板中

所以,要使用组合 API,就必须使用 setup,组合 API主要就是在 setup 中,使用 ref 和 reactive 两个新方法的开发方式。

ref 和 reactive 方法的使用方式一模一样,区别就是:

  • ref 官方建议只传入一个简单数据类型,这样再后续使用时,会比较方便

  • reactive 官方建议,也只能传入复杂数据类型(对象或数组)

两个方法生成的数据,都会使用 proxy 进行深度包装,也就是会深度监听。

下面是三者简单的配合使用。

创建简单类型变量 - ref

基本使用方法,就是调用 ref 方法,传入一个简单类型的值,它再返回被包装过的值。

对于传入的值,会复制一份,修改不影响原值,即使原值是对象。

以下是使用组合 API,创建一个点击按钮,给数值 + 1的功能:

创建复杂数据类型 - reactive

Reactive: 传入的必须是个对象或数组。

和 ref 一样,对于传入的值,会复制一份,修改不影响原值。

非深度监听版本

ref 其实 reactive 默认都会使用 proxy 进行深度包装,这一点在处理大批量对象或数组、而又没有必要深度监听时,会比较浪费性能。

所以两个方法各自都有一个浅层包装监听的方法,分别为 shallowRefshallowReactive

两个的用法和 refreactive 一样,区别仅仅是只浅层监听,当直接修改深层数据时,不会触发重新渲染。

但使用浅层监听后,有时候又想改了某个深层数据,还又想触发界面渲染怎么办?

ref 还有一个方法 --- triggerRef,使用 shallowRef 生成的深层数据后,当我们修改了深层数据,界面没有重新渲染,此时再使用 triggerRef 方法,就可以出发一次渲染了:

toRaw 获取原始数据

ref 和 reactive,是把原本的对象,使用 proxy 包装一下,我们也可以通过 toRaw 方法,来获取原始对象。

需要注意的是,ref 需要传入 ref.value:

toRef 和 toRefs

toRef 和 ref 的区别还是挺大的。

用法:

可见,toRef 是对对象的某个字段进行包装,返回一个 ref 对象,但是,这个用 toRef 包装的 age,如果用在页面上,当值修改时,是不会自动触发重新渲染的。

toRef 和 ref 不同,它是源值的引用,修改也会修改源值:

大多数用法:

使用 toRef 对 reactive 包装出来的对象,单独再包装某个需要的字段,方便使用和传参等。

toRefs 的用法比较直接,直接是 toRef 的批量包装用法:

获取路由信息

setup 中可以获取到路由信息,需要调用 vue-router 中的方法。

数据传输 provide 和 reject

Vue 提供了providereject 属性为高阶组件提供了便利的数据传递。

父组件,使用 provide 传递数据:

子组件(直接子组件或更深层组件),使用 reject 接收数据:

watch 监听

使用 watch 监听,常规用法:

可以给 watch 传入配置,也可以在合适时候,执行 stop 方法取消监听:

watchEffect 监听

watchEffectwatch 都是监听,但它的用法不太一样。

  • 只传入一个方法,方法中用到的变量更新时,该方法自动执行。

  • 传入的方法,在组件刚初始化后,会自动执行一次

  • 和 watch 一样,同样可以使用 stop 方法

  • 传入方法,会给方法传入一个回调方法 onInvalidate,可以给 onInvalidate 再传入一个回调方法【B】,B 方法会在以下三种情况下执行:

    • watchEffect 监听函数即将执行

    • 调用了 stop 方法,即将停止监听

    • 该组件即将被销毁

见例子:

computed 计算

用法和 vue2 的计算属性类似,直接使用:

可以配置 get()set() ,配置更复杂的赋值功能:

readonly 数据只读包装

正常开发,常用的有 provide 和 props 两种方式,可以传递数据给子组件。

但正常情况,两种方式传递给子组件,子组件是可以修改数据的。

如果使用 props 传递的是简单数据类型,则子组件得到的是一个直接量,修改不会影响父组件,但父组件的这个变量更新时,子组件会跟着更新。

父组件中:

子组件中:

可见,子组件是可以修改父组件传递的数据的。

但很多时候,为了保持数据的统一性和维护性,我们只希望子组件能调用父组件方法来更新传递的值,不希望子组件能直接修改。

这时就需要使用 readonly 方法了,使用此方法包装后的值,只读,不可修改。

父组件把即将传递给子组件的数据,使用 readonly 包装一下。

这样,父组件可另写方法来更新两个值,再把更新的方法传递给子组件即可。

钩子函数新用法

mounted => onMounted

onMounted 方法,用法类似于 addEventListener

且使用 onMounted 添加的方法,将先于 mounted 执行。

其他功能

获取dom元素

vue 获取 dom 元素,之前是使用 this.$refs[ref名字] 的方式,现在 vue3 提供了新的方式。

Last updated

Was this helpful?