vue3初体验
学啊…学不动也得学啊…
---- 导语
Vue3 与 Typescript
2021-06-08updated 忘记啥时候写的笔记…之前存在本地, 现在 push 到博客上, 方便以后查阅黑历史 不定期更新
是否还需要 babel?
答案是需要的, tsc 只负责了转义语法, 没有对 Map,Set 等新增数据结构和 react 的 jsx 语法做实现, 所以还是需要 babel(tmd 找了半天是否还需要 babel 全都答非所问)
可以参考: 1. webpack5 搭建 Vue3+TS 项目
也可以看看该博主的 2. webpack4 搭建 Vue 项目
setup
setup
中无法访问 this, return
的属性必须都是 Ref 响应式的
setup
函数接收两个参数props
和emits
, 表示外部传入的参数props
和向外部发送的事件emits
reactive
reactive
方法构建 Proxy, 如果要对 data 中的属性做响应式要做toRefs
或者toRef
1 |
|
watch
参数可以是ref
, reactive
, getter函数
和包含前面三个的数组
如果想要监听reactive
中的属性需要使用getter
的方式, 如watch(() => data.count)
, 而不能直接使用watch(data.count)
props
和 vue2 用法一样, 表示外部传入参数
emits
emits
用于声明需要向外部暴露的事件名, 可以是数组和对象, 对象 key 是事件名, 值可以是函数和 null, 函数必须有布尔类型返回值, 这里的函数不仅作为拦截器, 也作为 typescript 的类型定义 setup
调用使用context.emit
, 用法和 vue2 一样, vue3 会先执行emits
中对应的回调再返回给父组件
1 |
|
teleport
有的组件例如对话框放在TP是英雄联盟的一项召唤师技能
#app
内是不合适的, teleport
可以将组件一键传送到 html 中的另外一个 DOM 结构下, 用法如下
1 |
|
Suspense
vue 从 react 借鉴来的异步组件, 在<Suspense>
中包含两个template
插槽, default
插槽放置异步组件, 在异步组件数据未完全返回时先渲染fallback
插槽内容, 数据完全返回后再渲染异步组件内容
1 |
|
props
- 用法和 vue2 一样
- 在 vue2 基础上添加上对
typescript
的支持, 细化了类型声明, 如Object as PropType<UserProps>
,PropType<T>
为props
的泛型,T
即type
- 记得在 vue 中引入
import { PropType } from 'vue'
1 |
|
ref
vue2 中ref
用于获取 DOM 节点或者组件实例, 在 vue3 中用法类似
1 |
|
禁用 Attribute 继承
- 默认地, vue 会将传向一个组件的非 prop 的
attribute
自动添加到根节点的attribute
中, 可以通过inheritAttrs: false
来禁止这种行为 - 如果要将上述
attribute
全部复制给组件中一个节点, 可以使用v-bind="$attrs"
, 例如<input v-bind="$attrs">
slot
1 |
|
Vuex
vue3 中的 vuex
vue3 中vuex
通过createStore
创建store
, useStore
使用store
, 两个函数都是泛型, 都可以通过xxStore<GlobalProps>
的方式指定store中state
的结构
getter
1 |
|
项目中知识点
组件传参
1 |
|
子元素高度 100%
高度%百分比计算是根据父元素的高度计算的, 所以如果只有父元素设置了height: 100%
, 浏览器并不知道父元素具体 height 是多少, 但是给html
设置height: 100%
则是有效的, 浏览器会知道html
的高度为浏览器可视区域的高度, 所以 css 代码应该对需要子元素的祖先元素都设置height: 100%
1 |
|
遇到的问题
Q: Already included file name … … only in casing.Vetur(1261)
A: 添加"forceConsistentCasingInFileNames": false
到tsconfig.json
的compilerOptions
Q: typescript 中全局变量声明如何配置?
A:tsconfig.json
的compilerOptions
中typeRoots
属性数组加入全局声明文件路径
Q: vue-devtools 在 Vue3 中不显示
A: Chrome 商店下载 beta 版 vue-devtools
Q: F12 控制台 vue panel 不显示
A: 更多工具 > 扩展程序 > vue-devtools 开启允许访问文件网址