vue3
vue3正式学习
提前条件:安装了16.0或更高版本的Node.js
,可使用node -v
查看版本。
创建一个Vue应用:npm init vue@latest
。
在js中加入setup:表示允许在script
中直接编写组合式API,mount
用于设置挂载点。
组合式api
setup选项
是组合式api的入口,其生命周期早于beforeCreate
。由于执行时机过早,在setup
中无法获取this
。
注意点:
- 在
setup
中定义的数据和函数,都需要通过return
暴露出去,才能在模板或其他地方使用。- 原生写法
setup() {
console.log(1);
const message = 'hello Vue3';
const logMessage = () => {
console.log(message);
};
return {
message,
logMessage
};
}, - 语法糖写法,在
script
标签中加入setup
属性:<script setup>
// 在此处直接编写代码,无需显式return,变量和函数会自动暴露给模板
</script>
reactive() 对象类型
接收一个对象类型的数据,返回一个响应式的对象,类似v-bind
的效果,使用时无需添加.value
。例如:
import { reactive } from 'vue'; |
ref() 简单类型或者对象类型
本质是在原有数据基础上包了一层对象,底层借助reactive
实现响应式。在脚本中访问数据需通过.value
,在模板中则不需要。示例:
import { ref } from 'vue'; |
computed
计算属性默认是只读的,若添加get
和set
属性,就可支持修改。示例:
import { computed } from 'vue'; |
watch函数
用于监听一个或多个数据(ref
对象 )的变化,数据变化时执行回调函数。有两个额外参数:immediate
(立即执行)和deep
(深度侦听)。
- 监听单个数据
import { watch, ref } from 'vue'; |
- 监听多个函数
const count3 = ref(0); |
Immediate
一进入页面就触发监听回调,写法如下:
const userInfo = ref({}); |
deep
默认watch
进行的是简单监视,若要深度监听对象内部属性的变化,需设置deep: true
。注意watch
只能传递两个参数,但immediate
和deep
可以同时在配置对象中设置。
精确监听对象中的某个参数
const userInfo = ref({ age: 20 }); |
生命周期api
(此处因未提供图片内容,无法详细阐述,可参考Vue官方文档查看具体生命周期钩子函数及执行顺序)
父子通讯
父传子
父组件传值方式与Vue2类似,子组件在setup
中通过defineProps
定义接收的属性。示例:
// 父组件 |
子传父
- 父组件在子组件标签上通过
@
绑定事件:
<template> |
- 子组件通过
emit
方法触发事件,支持传参:
<script setup> |
- 触发事件前需先使用
defineEmits
编译器宏生成emit
方法。
模板引用和defineExpose
vue2中,模板引用通过ref
获取真实的dom
对象或组件实例对象。
vue3中,先创建ref
对象,再通过ref
标识绑定到标签。
在语法糖setup
中的属性和方法默认不开放,若要开放,需使用defineExpose
指定开放组件。示例:
<script setup> |
provide 和 inject
语法:顶层组件使用provide('key', 顶层中的数据)
提供数据,底层组件通过const xxx = inject('key')
获取数据。例如:
// 顶层组件 |
pinia vuex的替代品
核心概念包括state
、action
、getter
。
首先安装pinia
:
npm install pinia |
然后进行全局注册:
import { createApp } from 'vue'; |
接着在自己的js
文件中创建函数,注意要返回相关数据或函数:
import { defineStore } from 'pinia'; |
action异步实现
与组件中获取异步数据的写法一致,且无需提交mutation
方法。示例:
import { defineStore } from 'pinia'; |
使用时导入该组件后直接调用方法即可。
注意点
若直接解构store
中的数据,会变成普通数据而失去响应性。因此,若要解构,需使用storeToRefs
方法。示例:
import { useDataStore } from './stores/data'; |
Pinia持久化插件
(此处未提及具体插件使用方法,可参考Pinia官方文档了解相关持久化插件及使用方式)
使用postcss插件实现项目vw适配
官网:vant2
中的进阶用法
安装命令:npm install postcss-px-to-viewport@1.1.1 -D
,@
后边是版本号,-D
表示安装成开发依赖。安装完成后,需在项目的postcss
配置文件中进行相应配置,以实现将px
单位自动转换为vw
单位,适配不同屏幕尺寸。(具体配置可参考插件官方文档)
进阶
全局前置守卫
router.beforeEach
这是Vue Router提供的全局前置守卫函数,在每次路由跳转前执行。
router.beforeEach((to, from, next)) |
实例:
const authUrl = ['/pay', '/myorder']; // 配置需要权限的路由表 |
既希望保留原本的形参,又需要通过调用函数传参
通过箭头函数包装一层,例如:
<CountBox @input="(value) => changeCount(value, item.goods_id, item.goods_sku_id)" :value="item.goods_num"> |
在上述代码中,@input
绑定的事件处理函数使用箭头函数,既保留了input
事件原本传递的value
参数,又可以额外传递item.goods_id
和item.goods_sku_id
参数给changeCount
函数。
跨模块操作
与页面中调用类似,使用commit('模块名/方法', [], {root: true})
进行跨模块操作,{root: true}
表示在根store
中查找该mutation
方法,而不是在当前模块内查找。
懒加载
将组件的导入方式从静态导入改为动态导入,实现组件的懒加载,提高应用加载性能。例如:
// 静态导入 |
Ts
安装TypeScript,全局安装命令:
npm install -g typescript |
TS中类和接口的区别:类不仅可以定义属性,还能包含方法,用于创建对象实例并封装数据和行为;接口主要用于定义对象的类型结构,只包含属性的定义,用于约束对象的形状,确保对象具有特定的属性和类型。
打包作用
将多个文件合成一个文件(可供直接上传或者浏览器能直接访问文件),通过打包可以优化代码,减少文件数量和大小,提高应用的加载性能。
命令:npm build
。
默认情况下是放到服务器的根目录打开。如果希望双击运行就需要在vue.config
中配置publicPath: '/'
,这样可以确保在本地运行打包后的文件时,资源路径能够正确解析。