尚硅谷Vue3入门到实战,最新版vue3+TypeScript前端开发教程
PBitW
编辑于 2024年04月22日 09:35

只记忆部分重点知识:

p8

结果界面直接渲染成了

所以

p9

setup函数 可以和 选项式 api 的data、method 一起使用! 但是不建议

选项式 api 可以用 this.xxx 访问setup里面的数据或者方法,但是setup不能反过来访问!

p10

setup函数 和 setup 语法糖有区别,暴露的东西不一样!

setup语法糖更加严格,阻止你打破单向数据流!(defineExpose)

参考:网页链接​

可以帮 setup 语法糖使用name属性的插件:vite-plugin-vue-setup-extend

script 不能同时使用 ts 和 js

报错!

p14

区别第二条视频:

014.ref对比reactive P14 - 06:21

reactive定义的对象不能整体修改!

区别第二条参考:

网页链接​ 的p8

p16

computed 可读可写写法:

016.computed计算属性 P16 - 18:31

p17

情况一

使用:

注意:

这里插件没有补.value,所以watch监听ref数据不用加value! 见第一条

如何解除监听?watch其实有返回值,可以直接接收!

直接调用返回值就行(x()):

017.watch监视_情况一 P17 - 10:44

情况二

未开启深度监视:

开启:

解释新旧值相同:

018.watch监视_情况二 P18 - 08:54

代码解释:

网页链接​ 的p12

其实可以理解为,引用类型和基本类型!引用类型的新旧值一样,基本类型肯定不一样!

情况三

默认开启的深度监听不能通过deep:false关闭

情况四

基本类型:

函数:能返回一个值的函数!

可以简写为: () => xxxx

对象类型:

直接写(对象类型,打印出来就是proxy对象,所以可以直接写),就会监听里面的变化。

函数,就会监听大的变化(地址)

020.watch监视_情况四 P20 - 16:20

推荐:

使用函数+深度监听!!!

情况五

p22

如果数据很多,则太多了,这个时候就要watchEffect

注意:

1、watchEffect 一开始就会执行一次

2、可以自动分析数据,自己监听

p23

ref 拿到了组件实例,但是不能获取到组件里面定义的东西!

023.标签的ref属性 P23 - 12:03

其实解释过,见该文章 p10

p25

ts写法 (官网有):

js写法:

注意:

definexxxx的函数(编译宏)在vue3里面不用引入,因为编译的时候根本不是这个函数,只是做个对应

p28

vue 先挂载子,后挂载父,所以App.vue永远是最后挂载的!

p29

hooks:让一个功能的数据和方法在一起!避免变成vue2了,有点像mixins

命名规范是 usexxx.js ,一定要 return 一些东西!

p32

路由和一般组件区分:

p33

nginx 处理路径就靠这个:

后端管理系统什么的用hash模式就行!

p35

to 不带参数,跳转的3种形式!

1、字符串跳转

2、对象跳转

2.1 名字跳转

2.2 path跳转

p36

子级路由没有 /

p37

路由使用 query 三种传参方式!

第二种也可以替换成name

接收:

p38

动态路由(params参数),两种传参方式

注意:

传的不能是对象或者数组!!!

动态路由后面加?表示可以传也可以不传!!!

接收:

p39

第一种:将路由收到的所有params参数作为props传给路由组件!

所以子路由组件要这样接收:

第二种:函数写法,可以自己决定将什么作为props给路由组件!

第三种:对象写法,可以自己决定将什么作为props给路由组件! 基本不用,因为写死了

p40

p46

p59

注意:

打印c不用 .value ! 可以看出,如果是自己直接定义的 ref 必须要 .value ,但如果是响应式对象里面的,会自动拆包

pinia 里面的数据有两种拿取方式

注意:

如果浏览器的 vue插件的 pinia 里面没有数据,可能是你并没有在界面中使用导致光定义了并不会显示出来!

p47

完整的store

方式一 直接修改

pinia的数据可以直接修改,且工具还能监听到!!!

047.修改数据(三种方式) P47 - 01:53

方式二 批量修改

发生了三次 mutation

047.修改数据(三种方式) P47 - 06:19

只发生一次 $patch ,且会自动替换对应的!

方式三 借助actions

这里就要修改store文件,添加上actions

this是当前的store对象!

action的意义 --》 限制:

047.修改数据(三种方式) P47 - 12:56

p48

storeToRefs 只会把 store 中的数据变成响应式,如果是 toRefs 就会把 store 里面的不需要变成响应式的都变成响应式!!!

p49

getters 接收 state 为参数,也可以直接用 this

p50

$subscribe 相当于 pinia 的 watch !

p51

组合式写store

记得return !!!

写组合式还是选项式看复杂度,return太多就选项式!!!

p52 父传子 常用

props 父传子(推荐),也可以子传父(不推荐)

子传父,要父传一个函数,子调用函数,并将值传给父!

p53 子传父 常用

defineEmits --》 自定义事件

推荐接收名用 xxx-xxx

p55

v-model 在组件上使用,一般个人开发很少使用,但是组件库大部分都是v-model 实现的

v-model 在 html 标签上:

v-model 在组件标签上:

055.组件通信_方式4_v-model P55 - 14:04

$event:

v-model原理见:

网页链接​ 的p35

p56

修改传递名称!

056.组件通信_v-model的细节 P56 - 01:58

可以修改,自然就可以多个v-model

p57 祖孙传值 不常用

会打扰中间人!

注意一

如果父传给子好几个值,子只接收一个,其他的并没有丢失!可以通过开发者工具看到attrs,接收的就在开发者工具里面的props!

界面上使用 {{ $attrs }} 就可以看到未接收的参数!

注意二

注意三

这里$attrs就相当于v-bind一个对象

成功传递!如果是想子传给爷,直接和props一样,用函数不常用

p58 父子传值 不常用

ref 获取子组件,想要访问到组件数据(子、父都是),要使用defineExpose! 但是最好不这样搞

也可以在 html 中直接使用 $refs,包含全部子组件!

html中 $parent 就是该组件的父组件!

p60 祖孙传值 常用

provide(数据名,{数据值/函数})

注意:传数据值时不要 .value,不然孙那边就不是响应式了,祖还是响应式!

xxx = inject(数据名,默认值)

孙传祖也行,不推荐,也是和props一样,使用函数接收参数!

slot 参考:https://blog.csdn.net/langwang_100/article/details/119841015

p61

1、如果多个slot,但是只传了一个元素,那么会全部替换!

2、有多个元素 (超过了插槽),一起作为替换元素放入替换

注意:

其实默认插槽也有名字,叫:default,但是一般不写!

p62

1、具名插槽,传入一个没有带slot="name" 的,那么都不替换,因为不知道替换哪一个!

2、多个具名插槽,传入多个且同slot="name" ,那么只会替代该name,并且是重复添加不是替换!

现在slot="name" 变成了:

v-slot:xxx,且要放 template 或者 组件上,而不是替换的元素上!

语法糖:

v-slot:xxx => #xxx

p63

数据在子,但是结构由父定,所以产生作用域插槽

然后 slot 将值传递给插槽的使用者,及 ul,但使用要用template

如果既是具名又是作用域插槽就变成了这样:

v-slot:xxx = "xxx/{}" ==> {}是解构

另外写法:

#xxx = "xxx/{}"

p64

传值总结:

p64

p65

复制一份只读的响应式数据(保护数据!)

let xxx = readonly(响应式数据)

改原来的数据,readonly里面的响应式数据也会一起改变!但是不能直接改 xxx

p66

let xxx = toRow(响应式数据)

不保留持久引用的意思是:最好是当成参数传给函数啥的!(及别人需要用并改某个数据,但是不影响界面!)

p67

为什么不使用ref:

customRef:

set 可以接收 value,但是就一个尴尬的事情,get 写死了,set不知道设置谁的值,所以引入一个变量!

不管怎么写,html 里面用的都是 ref,所以是msg!

难点:

到上面,发现根本不能响应式,所以要接收参数!

get 要在最先调用 track() --》告诉vue数据msg很重要,需要对msg持续关注,一旦msg变化就去更新!

set 要在最后调用 trigger() --》 通知vue,数据msg变化了!

一般 customRef 都会写成 hooks,那就可以不引入变量去存,而是当参数,见下方链接!

更多可见:

网页链接​ p7 5

p69

顶层await

069.Suspense P69 - 04:09

p70

p71

https://v3-migration.vuejs.org/zh/breaking-changes/