文章目录

  • ​​toRef​​
  • ​​toRefs​​
  • ​​computed​​
  • ​​watch​​
  • ​​监听Ref​​
  • ​​监听Reactive​​
  • ​​watchEffect​​

toRef

如果原始对象是非响应式的就不会更新视图 数据是会变的
如果原始对象是响应式的是会更新视图并且改变数据的

<template>
<div>
<button @click="change">按钮</button>
{{state}}
</div>
</template>

<script setup lang="ts">
import { reactive, toRef } from 'vue'

const obj = {
foo: 1,
bar: 1
}
const obj1 = {
foo: 1,
bar: 1
}

const state = toRef(obj, 'bar')
const state1 = toRef(obj1, 'bar')
// bar 转化为响应式对象

const change = () => {
state.value++;// 不会更新视图
state1.value++;// 会更新视图
console.log(obj, state);

}
</script>

toRefs

可以帮我们批量创建ref对象主要是方便我们解构使用

import { reactive, toRefs } from 'vue'
const obj = reactive({
foo: 1,
bar: 1
})

let { foo, bar } = toRefs(obj);

foo.value++; // 会更新视图并且改变数据的
console.log(foo, bar);

computed

计算属性就是当依赖的属性的值发生变化的时候,才会触发他的更改,如果依赖的值,不发生变化的时候,使用的是缓存中的属性值。
1 函数形式

import { computed, reactive, ref } from 'vue'
let price = ref(0)//$0

let m = computed<string>(()=>{
return `$` + price.value
})

price.value = 500

2 对象形式

<template>
<div>{{ mul }}</div>
<div @click="mul = 100">click</div>
</template>

<script setup lang="ts">
import { computed, ref } from 'vue'
let price = ref<number | string>(1)//$0
let mul = computed({
get: () => {
return price.value
},
set: (value) => {
price.value = '$' + value
}
})
</script>

<style>
</style>

watch

监听Ref

import { ref, watch } from 'vue'

let message = ref({
nav:{
bar:{
name:""
}
}
})


watch(message, (newVal, oldVal) => {
console.log('新的值----', newVal);
console.log('旧的值----', oldVal);
},{
immediate:true,
deep:true
})

监听多个ref 注意变成数组啦

import { ref, watch ,reactive} from 'vue'

let message = ref('')
let message2 = ref('')

watch([message,message2], (newVal, oldVal) => {
console.log('新的值----', newVal);
console.log('旧的值----', oldVal);
})

监听Reactive

使用reactive监听深层对象开启和不开启deep 效果一样

import { ref, watch ,reactive} from 'vue'

let message = reactive({
nav:{
bar:{
name:""
}
}
})


watch(message, (newVal, oldVal) => {
console.log('新的值----', newVal);
console.log('旧的值----', oldVal);
})

监听reactive 对象的属性

import { ref, watch ,reactive} from 'vue'

let message = reactive({
name:"",
name2:""
})


watch(()=>message.name, (newVal, oldVal) => {
console.log('新的值----', newVal);
console.log('旧的值----', oldVal);
})

watchEffect

立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数。

如果用到message 就只会监听message 就是用到几个监听几个 而且是非惰性 会默认调用一次

let message = ref<string>('')
let message2 = ref<string>('')
watchEffect(() => {
//console.log('message', message.value);
console.log('message2', message2.value);
})

清除副作用
就是在触发监听之前会调用一个函数可以处理你的逻辑例如防抖

import { watchEffect, ref } from 'vue'
let message = ref<string>('')
let message2 = ref<string>('')
watchEffect((oninvalidate) => {
//console.log('message', message.value);
oninvalidate(()=>{

})
console.log('message2', message2.value);
})

停止跟踪 watchEffect 返回一个函数 调用之后将停止更新

const stop =  watchEffect((oninvalidate) => {
//console.log('message', message.value);
oninvalidate(()=>{

})
console.log('message2', message2.value);
},{
flush:"post",
onTrigger () {

}
})
stop()

副作用刷新时机 flush 一般使用post

[vue3] toRef toRefs computed watch watchEffect_javascript


onTrigger 可以帮助我们调试 watchEffect

import { watchEffect, ref } from 'vue'
let message = ref<string>('')
let message2 = ref<string>('')
watchEffect((oninvalidate) => {
//console.log('message', message.value);
oninvalidate(()=>{

})
console.log('message2', message2.value);
},{
flush:"post",
onTrigger () {

}
})

参考:

​​小满Vue3​​

​小满Vue3视频bilibili​