reactive
只支持索引类型(Array, Object, Map, Set),而ref支持所有类型
reactive取值赋值不需要加.value 而ref需要加.value
reactive是一个proxy代理对象,直接复制会覆盖,破坏其响应式,解决方案,数组用push或者reactive值原本是对象,然后修改对象里面的数组
readonly
const read = readonly(obj) obj为reactive对象
被readonly包裹的对象只读不可修改
但是给原始obj赋值,read此时会受原始对象影响
const obj2 = shallowReactive({
foo: {
num: 1
}
})
obj2.foo.num = 2
obj2.foo = {
num: 2
}
obj2.foo.num = 2
第一种可以改变视图,第二种方式无法改变视图
和ref一样 改变reactive会变为深层次响应 因为依赖被收集了
to全家桶 toRef toRefs toRaw
toRef
toRef将非响应式数据变为响应式,从而达到能更新视图的目的
const man = {name: 'xm', age: 18, sex: 1}
let sex = toRef(man, 'sex') toRef无法修改非响应式对象
使用场景:从一个对象里拿出来一个属性
toRefs
let man = reactive({
name: 'zs',
age: 18,
sex: 1
})
let {name, age, sex} = man
使用场景:解构要用toRefs 不然不是响应式的
toRaw 解除响应式
toRaw(man) 此时man对象变为了原始
computed计算属性
如果触发依赖属性值被改变时就会更新,如果触发依赖值没改变则用缓存中的值
let all = computed<string>({
get() {
return xing.value + '-' + name.value
},
set(newVal) {
console.log('newVal', newVal)
}
})
const changeName = () => {
all.value = 'C'
}
如果给计算属性赋了值,在set的参数中可以接收到
函数式写法 let all = computed(() => xing.value + '-' + name.value) 这种方式不允许其他函数修改值(all)
watch 只能监听响应式数据
watch(message, (newVal, oldVal) => {
console.log('监听', newVal)
}) 如果需要监听多个 message改为数组就可以,同时newVal也是数组形式
对象深层嵌套开启深度监听
let message = ref({
foo: {
bar: {
name: 'xm'
}
}
})
watch(message, (newVal, oldVal) => {
console.log('监听', newVal)
console.log('监听old', oldVal)
}, {
deep: true
}) 同时会带来问题:newVal和oldVal一样