
尚硅谷视频:https://www.bilibili.com/video/BV1Zy4y1K7SH?p=136
官方文档:https://cn.vuejs.org/guide/introduction.html
本文每小节先总结,之后上案例。
理解: vue3.0中一个新的配置项,值为一个函数。
setup是所有composition API(组合API)“表演的舞台”。
组件中所用到的:数据、方法等等,均要配置在setup中。
setup函数的两种返回值:
返回一个对象,则对象中的属性、方法,在模板中均可以直接使用。(重点关注! )执行时机:在beforCreate之前执行一次,此时this是undefined
参数:
props:值为对象,组件外部传过来,且组件内部props申明接收了的属性;context:上下文对象: this.$attrsthis.$slotsthis.$emit注意点:
基本使用如下图:(以下方式是非响应式的,响应式需借助ref、reactive等函数)

完整代码:
name:{{name}}
age:{{age}}
sayHello:

完整代码如下:
父组件App.vue:
插槽内容...
子组件School.vue
作用: 定义一个响应式的数据
语法:const xxx = ref(初始值);
引用对象(reference对象,简称ref对象)xxx.value.value,直接{{ xxx }}即可备注:
基本类型数据:响应式依然靠 Object.defineProperty() 的 get 与 set完成的对象类型数据:内部“求助”Vue3中的一个新函数 – reactive函数如果想要定义一个响应式的值(例如,age),可通过如下方式:


name:{{name}}
age:{{age}}
sayHello:
incrementAge:
info.hobby:{{info.hobby}}
info.address:{{info.address}}
updateInfo:
对象类型的响应式数据(基本数据类型不要用它,要用 ref 函数)const 代理对象 = reactive(源对象) 接收一个对象(或数组),返回一个代理对象(Proxy对象)深层次的”
info.hobby:{{info.hobby}}
info.address:{{info.address}}
updateInfo:


firstName:
lastName:
fullName:{{ fullName }}
set fullName:
oldVal无法正常获取、强制开启了深度监视(deep配置失效)某个属性时,deep配置有效

js:

html:

效果:

js:

html:

效果:

js:

html:

效果:

num1:{{ num1 }}
num2:{{ num2 }}
sum:{{ num1 + num2 }}
cat:
name:{{ cat.name }}
age:{{ cat.age }}
friend.name:{{ cat.friend.name }}
person:
name:{{ person.name }}
pass:{{ person.pass }}
age:{{ person.age }}
car.color:{{ person.car.color }}
用到哪个属性,就监视哪个属性
price:{{ price }}
count:{{ count }}
total:{{ total }}

hooks目录下useMouse.js:

使用:

useMouse.js:
// mouse.js
import { ref, onMounted, onUnmounted } from 'vue'// 按照惯例,组合式函数名以“use”开头
export function useMouse() {// 被组合式函数封装和管理的状态const x = ref(0)const y = ref(0)// 组合式函数可以随时更改其状态。function update(event) {x.value = event.pageXy.value = event.pageY}// 一个组合式函数也可以挂靠在所属组件的生命周期上// 来启动和卸载副作用onMounted(() => window.addEventListener('mousemove', update))onUnmounted(() => window.removeEventListener('mousemove', update))// 通过返回值暴露所管理的状态return { x, y }
}
App.vue:
Mouse position is at: {{ x }}, {{ y }}
const name = toRef(person,'name;)toRefs(person),类似于对person的所有属性使用toRef()
person:{{ person }}
pName:{{ pName }}
jobName:{{ jobName }}
name:{{ name }}
age:{{ age }}
job:{{ job }}
总结:
例子:

完整代码:
person:{{ person }}
pName:{{ pName }}
jobName:{{ jobName }}
cat name:{{ cat.name }}
总结:
例子:

完整代码:
person:{{ person }}
pName:{{ pName }}
jobName:{{ jobName }}
person2:{{ person2 }}
pName2:{{ pName2 }}
jobName2:{{ jobName2 }}
总结:
例子:

完整代码:
person: {{ person }}
person name:{{ person.name }}
person toRaw: {{ pToRaw }}
person toRaw 的 name:{{ pToRaw.name }}
person.job.name:{{ person.job.name }}
总结:
例子:

完整代码:
name:{{ name }}

总结:
祖与后代组件间通信provide选项用来提供数据,后代组件有一个inject用来使用这些数据例子:
provide:(App.vue中)

inject:(DeepChild.vue中)

效果:

完整代码:
我是App(祖)cat:{{ cat }}
我是Footer(父)
我是DeepChild(孙)cat:{{ cat }}
总结:
isRef:检查一个值是否为一个 ref 对象isReactive:检查一个对象是否是由 reactive 创建的响应式代理isReadonly:检查一个对象是否由 readonly 创建的只读代理isProxy:检查一个对象是否是由 reactive 或者 readonly 方法创建的代理例子:

完整代码:
var num = ref(0);var b1 = isRef(num);b1:{{ b1 }}var person = reactive({name:"张三"});var b2 = isReactive(person);b2:{{ b2 }}var p = readonly(person);var b3 = isReadonly(p);b3:{{ b3 }}var b4 = isProxy(person);var b5 = isProxy(p);b4:{{ b4 }}b5:{{ b5 }}
总结:
官网:https://cn.vuejs.org/guide/built-ins/teleport.html

总结:
Teleport 是一种能将我们的组件html结构移动到指定位置的技术to 的值可以是一个 CSS 选择器字符串,也可以是一个 DOM 元素对象。如: to="body"的作用就是告诉 Vue“把模板片段传送到 body 标签下”。例子:
MyModal.vue中使用Teleport将组件移动到html的body中:
完整代码:
Tooltips with Vue 3 Teleport
Hello from the modal!
总结:
等待异步组件时渲染一些额外内容,让应用有更好的体验;
使用步骤:
异步引入组件

使用Suspense包裹组件,并配置default(要显示哪个组件)与fallback(如果要显示的组件没加载完成,显示的内容)

例子:
Suspense标签:
Child未加载出来的时候,显示正在加载...字样
Child组件中的内容:
Child中的内容:
完整代码:
我是父组件!!!
正在加载...
我是子组件!!!



上一篇:Flask详解