# Vue3 语法变化
# vue3 配置项
# 1.vue.config.js
| module.exports = { |
| devServer: { |
| port: 80, |
| open: true, |
| proxy: 'http://localhost:4000', |
| } |
| } |
# 2.Vue-router 配置
| import {createRouter,createWebHistory} from "vue-router"; |
| import Demo01 from "../components/Demo01"; |
| |
| const routes = [ |
| {path: '/demo',component: Demo01}, |
| ] |
| export default createRouter({ |
| history: createWebHistory(), |
| |
| routes |
| }) |
# 3.Vue 对象实例化
| import { createApp } from 'vue' |
| import App from './App.vue' |
| import router from './router' |
| |
| const app = createApp(App) |
| app.use(router) |
| app.mount('#app') |
# 4.npm 常用命令
- 查看 vue 最新版本
npm list vue
- 升级 vue 版本
npm install vue@next --save
- 升级 vue-router 版本
npm install vue-router@next --save
- 查找模块 :
npm search moduleName
- 安装最新模块 :
npm istall moduleName@latest
- 卸载模块 :
npm uninstall moduleName
- 清除 npm 缓存 :
npm cache clean --force
- 打开模块文档 :
npm docs moduleName
- 常用参数:
@next npm
上的可用最新版本--save
运行时依赖--save-dev
开发时依赖
# Node 17.+
启动参数变化
# vue3 + TypeScript
# 1.vue-router
# 1. 创建并使用 vue-router
| |
| const routes: Array<RouteRecordRaw> = [ |
| { |
| path: '/' |
| } |
| ] |
| |
| const router = createRouter({ |
| history: createWebHashHistory(process.env.BASE_URL), |
| history: createWebHistory(process.env.BASE_URL) |
| routes |
| }) |
| |
| export default router |
# 2. 路由信息对象: route
route 对象属性
属性名 | 类型 | 释义 |
---|
path | string | 当前路由路径 <解析为绝对路径> |
params | object | 动态片段和全匹配片段,无查询参数则为空 |
hash | string | 当前路由的 hash 值 |
fullPath | string | 解析后的 URL, 含查询参数和 hash 路径 |
matched | Array<RouteRecord> | 当前路由所有前台路径片段的路由记录 (routes 中的对象) |
name | string | 当前路由名称 |
redirectedFrom | string | 重定向来源路由名称 |
meta | string | 路由元信息 |
setUp 模式下获取 route 对象
| |
| const route = getCurrentInstance()?.proxy?.$route |
| |
| const route = useRoute() |
# 3. 全局路由实例: router
router 路由实属性
属性名 | 类型 | 释义 |
---|
app | | 配置了 router 的 Vue 根实例 |
mode | string | 路由使用的模式 |
currentRoute | Route | 当前路由的路由信息对象 |
START_LOCATION | Route | 初始路由地址 |
router 实例方法
方法名 | 方法签名 | 作用 |
---|
beforeEach | router.beforeEach ((to, from, next) => <br />{/* 必须调用 next */}) | 全局前置守卫 |
beforeResolve | router.beforeResolve ((to, from, next) => <br />{/* 必须调用 next */}) | 全局解析守卫 |
afterEach | router.afterEach((to, from) => {}) | 全局后置钩子 |
push | router.push(location)<br />.then(onComplete).catch(onAbort) | 路由到新路由 |
replace | router.replace(location)<br />.then(onComplete).catch(onAbort) | 替换当前路由,history 不会添加新记录 |
go | router.go(n) | history 变化 n 步 |
back | router.back() | history 回退一步 |
forward | router.forward() | history 前进一步 |
getMatchedComponents | const matchedComponents: Array<Component> = router.getMatchedComponents(location?) | 返回目标位置,或当前路由匹配的组件数组 |
resolve | const resolved: {<br /> location: Location;<br /> route: Route;<br /> href: string;<br />} = router.resolve(location, current?, append?) | 解析目标位置 |
addRoute | addRoute(route: RouteConfig): ()=>void | 添加一条路由规则,相同则覆盖 |
addRoute | addRoute(parentName: string,route: RouteConfig): ()=> void | 添加一条现有路由的子路由 |
getRoutes | getRoutes(): RouteRecord[] | 获取活跃路由记录列表 |
onReady | router.onReady(callback,[errorCallback]) | callback: 路由初始化回调 <br />errorCallback: 初始化路由出错时回调 |
onError | router.onError(callback) | 注册一个路由出错时的回调 |
setup 模式下获取 router 实例
| |
| const router = getCurrentInstance()?.proxy?.$router |
| |
| const router = useRouter() |
| |
| |
| router.push({name:'echartsMap',params:{id:10001,name:'从主页跳转的路由'}}) |
| |
| router.push({path:'/echarts/province',query:{id:10001,name:'从主页跳转的路由'}}) |
# vue3 组合式 API
# 1.setup 函数
<script>
export default {
setup(){
const res = 'str'
const arr = [1, 3, 5, 7, 9]
const func = ()=>{
...
}
// setUp中的数据,方法 必须导出才可以使用
return {res, arr, func}
}
}
</script>
# 2.ref 响应式数据
- ref 创建一个响应式的对象
ref(val)
- 当 ref 中的值发生改变时,视图层会自动更新
- ref 可操作基本数据类型,也可以操作复杂数据类型:对象,数组
- 默认: ref 默认用于操作基本数据类型:数字,字符串
# 3.reactive 响应式引用
- reactive 为传入值创建一个响应式的引用
reactive({ data: {code: 200}})
- 定义基本数据类型
只能
使用 ref - reactive 主要定义复杂数据类型, <数组,对象>
- reactive 可响应深层次的数据,<多维数组>
- reactive 返回一个响应式的 proxy 对象
# 4.toRef 介绍
- toRef 创建一个响应式的数据
- ref 本质是拷贝粘贴一份数据,脱离了原数据的交互
- ref 函数将对象中的属性变成响应式的数据,修改响应式数据 不会影响到原数据,但是会更新视图层
- toRef 本质是引用,与原数据有交互,修改响应式数据会影响到原数据,但是
不会更新视图层
- toRef 接收两个参数,第一个参数是要操作的对象,第二个参数是对象的某个属性
| import {toRef} from 'vue' |
| const obj = {name: 'user'} |
| toRef(obj,'name') |
# 5.toRefs 介绍
- 用于批量设置多个数据为响应式数据
toRefs(obj)
- toRefs 与原始数据有交互,修改响应式数据会影响到原数据,但是不会更新视图层
- toRefs 还可以与其他响应式函数交互,更加方便处理视图层数据
# 6.computed 计算属性
| const num1,num2 = 0 |
| const res = reactive({num1,num2}) |
| const sum = computed(()=>{ |
| return res.num1 + res.num2 |
| }) |
# 7.watch 侦听器
<script>
const p1 = ref(0)
const p2 = ref(0)
const p3 = reactive({
name: '',
age: {
num: 1
}
})
一: 监听一个 ref数据变化
watch(p1,(newVal,oldVal)=>{
// oldVal: 变化前的数据 newVal: 变化后的数据
console.log(newVal,oldVal)
})
二: 监听多个 ref的数据变化
watch([p1,p2],(newVal,oldVal)=>{
console.log(newVal,oldVal)
})
三: 监听整个 reactive响应式数据变化
// 只能监听到最新的结果,上一次的数据无法监听
watch(p3,(newVal,oldVal)=>{
console.log(newVal,oldVal)
})
四: 监听 reactive响应式数据中某一个值的变化
/**
* 变化前后的结果都可以得到
* {immediate: true}: 页面挂载完成立即开启监听
*/
watch(()=>p3.age.num,(newVal,oldVal)=>{
console.log(newVal,oldVal)
},{immediate: true})
</script>
# 8. watchEffect
watchEffect 在组件初始化的时候就会执行一次用以收集依赖
watch 可以获取新值与旧值 (更新前后的值), 而 watchEffect 中拿不到
watchEffect 不需要指定监听的属性,会自动收集依赖,
只要回调中引用了响应式属性,当属性变更时,这个回调都会执行,
watch 只监听指定的属性而做出变更
| const p1 = ref(0) |
| const p2 = reactive({ |
| name: 'name', |
| age: { |
| num: 1 |
| } |
| }) |
| const res = watchEffect(()=>{ |
| const temp = p1.value |
| const b = p3.age.num |
| console.log(a,b) |
| }) |
| |
| res() |
# 9. shallowRef 和 shallowReactive
- shallowRef 只处理基本数据类型 (string, boolean, number, arr)
- shallowReactive 只处理第一层数据 (无法处理对象中深层嵌套属性)
| |
| |
| const p1 = shallowReactive({ |
| name: 'name', |
| product: { |
| money: 10 |
| } |
| }) |
| |
| const p2 = shallowRef({ |
| val: 1 |
| }) |
| return {...toRefs(p1),p2} |
# 10. 组件传值
- 进入页面后即刻传值 (无论组件层次结构有多深,子组件都可以通过 Inject 接收数据)
| const p1 = reactive({name:'bai',age:20}) |
| |
| provide('key',p1) |
| |
| const res = inject('p') |
- 点击触发传值
| |
| <components ref="moduleName" /> |
| |
| const receive = (val) =>{ console.log(val)} |
| |
| |
| const moduleName = ref() |
| const p1 = reactive({name: 'father',data: 'defaultData'}) |
| |
| moduleName.value.receive(p1) |