尚硅谷视频: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.$attrs
this.$slots
this.$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详解