shallowReactive
只处理对象最外层属性的响应式(浅响应式,只考虑第一层次数据的响应式)
<template>
<h1>{{ obj.n }}</h1>
<button @click="obj.n++">n+1</button>
<h1>{{ obj.m.x }}</h1>
<button @click="obj.m.x++">x+1</button>
</template>
<script>
import { shallowReactive } from 'vue'
export default {
name: 'HelloComponent',
setup() {
let obj = shallowReactive({
n:10,
m:{x:1}
})
return {obj}
}
}
</script>
此时obj中的n是响应式数据,m中的x不是响应式数据,虽然能对x的值进行操作,但是页面不发生响应式改变
shallowRef
只处理基本数据类型的响应式, 不进行对象的响应式处理。
<template>
<h1>{{ n }}</h1>
<button @click="n++">n+1</button>
<h1>{{ obj.n }}</h1>
<button @click="obj.n++">n+1</button>
</template>
<script>
import { shallowRef } from 'vue'
export default {
name: 'HelloComponent',
setup() {
let n = shallowRef(0)
let obj = shallowRef({
n: 10,
})
return {
n,
obj
}
}
}
</script>
此时n为为响应式数据,而obj里面的n不是响应式数据
readonly
让一个响应式数据变为只读的(深只读)。
<template>
<h1>{{ n }}</h1>
<button @click="n++">n+1</button>
</template>
<script>
import { ref, readonly } from 'vue'
export default {
name: 'HelloComponent',
setup() {
let n = readonly(ref(0))
return {n}
}
}
</script>
这里的n不是响应式数据,无法改变n的值。
shallowReadonly
响应式对象式数据的第一层数据变为只读,而深层的数据仍然是响应式数据
<template>
<h1>{{ n.y }}</h1>
<button @click="n.y++">n+1</button>
<h1>{{ n.x.z }}</h1>
<button @click="n.x.z++">z+1</button>
</template>
<script>
import { reactive, shallowReadonly } from 'vue'
export default {
name: 'HelloComponent',
setup() {
let n = shallowReadonly(reactive({
y:1,
x:{
z:0
}
}))
return {
n
}
}
}
</script>
n中的y是只读,z是响应式数据
customRef
并对其依赖项跟踪和更新触发进行显式控制。
自定义ref函数
<template>
<input type="text" v-model="keyword">
<h3>{{ keyword }}</h3>
</template>
<script>
import { customRef } from 'vue'
export default {
name: 'HelloC',
setup() {
// let keyword = ref('hello') //使用Vue准备好的内置ref
//自定义一个myRef
function myRef(value, delay) {
let timer
//通过customRef去实现自定义
return customRef((track, trigger) => {
return {
get() {
track() //告诉Vue这个value值是需要被“追踪”的
return value
},
set(newValue) {
clearTimeout(timer)
timer = setTimeout(() => {
value = newValue
trigger() //告诉Vue去更新界面
}, delay)
}
}
})
}
let keyword = myRef('hello', 500) //使用程序员自定义的ref
return {
keyword
}
}
}
</script>
provide 与 inject
作用:实现祖组件与后代组件通信,
父组件有一个 provide 选项来提供数据,后代组件有一个 inject 选项来开始使用这些数据
祖组件
let person = reactive({
name:'zs',
age:18
})
provide('person', person)
后代组件
let person = inject('person')
console.log(person) // 响应式数据对象
return {person}
这样后代组件就能获取祖组件传递的person响应式对象
响应式数据判断
ref 对象reactive创建的响应式代理readonly 创建的只读代理reactive 或者 readonly 方法创建的代理