目录
一、setup函数
vue2与vue3变量区别
二、生命周期
三、reactive方法
四、ref方法
1、简介
2、使用
3、ref与reactive
4、获取标签元素或组件
五、toRef
1、简介
2、ref与toRef的区别
六、toRefs
七、shallowReactive 浅reactive
1、简介
2、shallowreactived的浅reactive
八、shallowRef
1、简介
2、triggerRef
九、toRaw方法
十、markRaw
十一、provide && inject
1、简介
2、代码实例
十二、watch && watchEffect
1、watch 简介
2、watchEffect与 watch 的区别
十三、getCurrentInstance
1、输出值ctx
2、输出值proxy
十四、useStore
{{ number }}
1、vue2访问data或props中的变量,需要通过this
2、vue3的setup函数有两个参数,分别是props、context
(1)props:存储定义当前组件允许外界传递来的参数名及参数值
(2)context:上下文对象,能从中访问到attr、emit、slots
【emit就是vue2中父组件通信的方法,可以直接拿来调用】
Vue2 |
Vue3 |
---|---|
beforeCreate |
setup |
created |
setup |
beforeMount |
onBeforeMount |
mounted |
onMounted |
beforeUpdate |
onBeforeUpdate |
updated |
onUpdated |
beforeDestory |
onBeforeUnmount |
destoryed |
onUnmounted |
vue3生命周期的使用,也是先从vue中导入,再进行直接调用
用来创建一个响应式的数据对象,该API也很好地解决了Vue2通过 defineProperty
实现数据响应式的缺陷
{{ state.count }}
包装了一个响应式的数据对象,ref是通过 reactive
包装了一个对象,然后是将值传给该对象中的 value
属性
注意:.value是在访问ref方法才需要,在template模板是不需要的
可以简单地把 ref(obj)
理解为这个样子 reactive({value: obj})
(1)基本类型值(string、number、boolean等)或单值对象(像{count:3}只有一个属性值的)使用ref
(2)引用类型值(object、array)使用reactive
(1)在Vue2中,我们获取元素都是通过给元素一个 ref
属性,然后通过 this.$refs.xx
来访问的,在Vue3中已经不再适用
(2)vue3获取元素如下
div元素
(3)获取元素的操作步骤:
补充:设置的元素引用变量只有在组件挂载后才能访问到,因此在挂载前对元素进行操作都是无效的
将某对象中的某值转化为响应式数据,其接收两个参数
(1)第一个参数为 obj
对象
(2)第二个参数为对象中的属性名
{{ state }}
上面的例子ref也可以实现,那为什么还要toRef呢,来看看他们的区别吧
{{ state1 }}
{{ state2 }}
(1)ref是对传入数据的拷贝;toRef是对传入数据的引用
(2)ref值会改变更新视图;toRef值改变不会更新视图
将传入的对象里所有的属性的值都转化为响应式数据对象,该函数支持一个参数,即 obj
对象
{{ state }}
shallowReactive传递给reactive的obj对象不止一层,那么每一次都会用Proxy包装
{{ state }}
如果一个对象层级比较深,那么每一层都用 Proxy
包装后,对于性能是非常不友好的
shallowreactive只有第一层被Proxy处理了,即只有修改第一层的值,才会响应式更新
{{ state.a }}
{{ state.first.b }}
{{ state.first.second.c }}
浅层ref,一样是用来做性能优化的
(1)shallowReactive
是监听对象第一层的数据变化用于驱动视图更新
(2)shallowRef
则是监听 .value
的值的变化来更新视图的
(3)代码实例
{{ state.a }}
{{ state.first.b }}
{{ state.first.second.c }}
①第二个按钮点击数据改变但是视图没变
②第一个按钮将整个 .value
重新赋值,视图才更新
triggerRef
triggerRef
可以解决上面实例的第二个按钮的问题,可以立马更新视图,其接收一个参数 state
,即需要更新的 ref
对象
{{ state.a }}
{{ state.first.b }}
{{ state.first.second.c }}
toRaw
方法是用于获取 ref
或 reactive
对象的原始数据的
{{ state.name }}
{{ state.age }}
上述代码就证明了 toRaw
方法从 reactive
对象中获取到的是原始数据,因此我们就可以很方便的通过修改原始数据的值而不更新视图来做一些性能优化了
注意: 补充一句,当 toRaw
方法接收的参数是 ref
对象时,需要加上 .value
才能获取到原始数据对象
markRaw
方法可以将原始数据标记为非响应式的,即使用 ref
或 reactive
将其包装,仍无法实现数据响应式,其接收一个参数,即原始数据,并返回被标记后的数据
{{ state.name }}
{{ state.age }}
被 markRaw
方法处理过后的数据不能被 reactive
包装成响应式数据,修改了值也不会更新视图了,即没有实现数据响应式
key
,即数据的名称;第二个参数为 value
,即数据的值key
,即父组件或祖先组件传递的数据名称假设这有三个组件,分别是 A.vue
、B.vue
、C.vue
,其中 B.vue
是 A.vue
的子组件,C.vue
是 B.vue
的子组件
// A.vue
// B.vue
// C.vue
watch
和 watchEffect
都是用来监视某项数据变化从而执行指定的操作的,但用法上还是有所区别
watch 格式:watch( source, cb, [options])
(1)监听ref类型时:
(2)监听reactive类型时:
(3)当同时监听多个值时:
(4)因为 watch
方法的第一个参数我们已经指定了监听的对象,因此当组件初始化时,不会执行第二个参数中的回调函数,若我们想让其初始化时就先执行一遍,可以在第三个参数对象中设置 immediate: true
(5)watch
方法默认是渐层的监听我们指定的数据,例如如果监听的数据有多层嵌套,深层的数据变化不会触发监听的回调,若我们想要其对深层数据也进行监听,可以在第三个参数对象中设置 deep: true
(6)watch方法会返回一个stop方法,若想要停止监听,便可直接执行该stop函数
2、watchEffect
与 watch
的区别(1)不需要手动传入依赖
(2)每次初始化时会执行一次回调函数来自动获取依赖
(3)无法获取到原值,只能得到变化后的值
没有像 watch
方法一样先给其传入一个依赖,而是直接指定了一个回调函数
当组件初始化时,该回调函数会执行一次,自动获取到需要检测的数据
{{ num }}
ctx
和 proxy
的内容十分类似,只是后者相对于前者外部包装了一层 proxy
,由此可说明 proxy
是响应式的
通过vuex中的useStore方法
// store 文件夹下的 index.js
import Vuex from 'vuex'
const store = Vuex.createStore({
state: {
name: '前端印象',
age: 22
},
mutations: {
……
},
……
})
// example.vue