vue3 watch試用看看
watch
先註冊
import { ref, reactive, watch } from "vue";
js
以下分別測試了幾種情況
1. 單個ref監聽
如果是物件陣列類型的時候要使用.value才可以
2.多個ref監聽
多個的時候要使用陣列傳遞
3.單個reactive的監聽
直接監聽
拿不到old Value
不管多深層都能監聽
4.單個reactive監聽裡面的某個屬性
監聽reactvie裡的某個屬性的時候要用func return 裡面的key
5.多個reactive監聽裡面的屬性
使用陣列搭配func return裡面的key
6.監聽reactive裡面屬性為物件的key
若是監聽return出來的還是物件陣列的話要開啟第三個選項deep:true
export default {
name: 'HelloWorld',
setup() {
let sum = ref(0)
let msg = ref('hi')
let person = reactive({
name: 'jason',
age: '20',
job: {
j1: {
salary: 20
}
}
})
// 1.單個ref不需.value 除非值是object的ref才需要.value拿到Proxy物件
watch(sum, (nV, oV) => {
console.log(nV, oV)
}, {
immediate: true
})
// 2.多個ref不需.value 除非值是object的ref才需要.value 或是開起deep:true才可以使用
watch([sum, msg], (nV, oV) => {
console.log(nV, oV)
}, {
immediate: true
})
// 3.單個reactive
// 如果用reactive或是ref定義的物件與陣列的話(Proxy)oV無法獲得
// 如果用reactive或是ref定義的物件與陣列的話的話(Proxy)不管多深都可以監聽而且是必定監聽
watch(person, (nV, oV) => {
console.log(nV, oV)
}, {
immediate: true
})
// 4.監視reactive中的某一個屬性,前面要使用函式
watch(() => person.age, (nV, oV) => {
console.log(nV, oV)
}, {
immediate: true
})
// 5.監視reactive中的某些個屬性,前面要使用陣列搭配函式
watch([() => person.age, () => person.name], (nV, oV) => {
console.log(nV, oV)
}, {
immediate: true
})
// 6.監視reactive中的屬性值為物件或陣列需要開啟deep
watch([() => person.job, () => person.name], (nV, oV) => {
console.log(nV, oV)
}, {
deep: true
})
return {
sum,
msg,
person
}
}
}
</script>
模板
<template>
{{ sum }}
<button @click="sum++">++</button>
<hr />
{{ msg }}
<button @click="msg += '!'">change</button>
<hr />
{{ person.name }}
{{ person.age }}
{{ person.job.j1.salary }}
<button
@click="person.name += '!'"
>name</button>
<button @click="person.age++">age</button>
<button @click="person.job.j1.salary++">salary</button>
</template>
watchEffect
這個理解起來就比較間單個人理解就是
- watchEffect的回調有用到的變數有變動就會觸發此回調
- 只能監聽值不能監聽整個object
- 感覺有點像computed不會return東西
- 也可以用於初始的賦予值
先註冊
import { ref, reactive, watchEffect } from "vue";
js
export default {
setup() {
let count = ref(0)
let person = reactive({
name: 'jason',
job: {
name: 'j1'
}
})
// watchEffect全都監視
// 無法獲得nV oV
// 只能監聽某個值不能監聽object
watchEffect(() => {
// 裡面用到誰就監視誰的變化 監視對象要為普通數據類型
// 感覺有點像沒有return的computed
const x1 = count.value
const x2 = person
console.log('watchEffect fb')
})
return {
count,
person
}
}
}
模板
<template>
{{ count }}
<button @click="count++">count</button>
<hr />
{{ person.name }}
<button @click="person.name += '!'">name</button>
</template>
參考文章