<template>
<div>
<div>{{ girl }}</div>
<div>{{ boy }}</div>
<button @click="changeSex">changeSex</button>
</div>
</template>
<script >
import { reactive, toRefs, watch, ref } from 'vue'
export default {
name: 'Watch',
setup() {
const boy = ref('我是男孩')
const index = ref(0)
const data = reactive({
girl: '我是女孩',
changeSex: () => {
data.girl = '我是男孩'
boy.value = '我是女孩'
index.value++
},
})
watch([boy, index], (newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
})
return {
...toRefs(data),
boy,
index,
}
},
}
</script>
vue3的watch監聽多個值的時候,要傳入數組的形式。
<template>
<div>
<div>{{ girl }}</div>
<div>{{ boy }}</div>
<button @click="changeSex">changeSex</button>
</div>
</template>
<script >
import { reactive, toRefs, watch, ref } from 'vue'
export default {
name: 'Watch',
setup() {
const boy = ref('我是男孩')
const data = reactive({
name: '小紅',
girl: '我是女孩',
hobby: ['打籃球', '玩游戲', '聽音樂'],
job: {
j1: {
money: 10,
},
},
changeSex: () => {
data.girl = '我是男孩'
boy.value = '我是女孩'
data.job.j1.money++
},
})
// 監聽reactive數據
/*
此時是有問題的:oldvalue會和newvalue數據保持一致,當data里面的任意值改變,都會觸發該監聽,強制開啟深度監聽,deep配置在此時是無效的
*/
watch([() => data], (newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
})
// 監聽reactive中的某個值
// 基礎類型值
watch(
() => data.name,
(newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
}
)
// 數組 此時deep的配置生效(此處的oldVal也是有問題的)
watch(
() => data.hobby,
(newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
},
{ deep: true }
)
// 對象 此時deep的配置生效(此處的oldVal也是有問題的) 若要監聽對象內的money: data.job.j1.money 即可
watch(
() => data.job,
(newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
},
{ deep: true }
)
// 監聽reactive中的某些值
// 都為基本數據類型 一切正常
watch([() => data.name, () => data.girl], (newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
})
//基本數據類型+數組/對象 deep有效 基本數據類型oldVal正常 引用數據類型oldVal存在問題
watch(
[() => data.name, () => data.hobby],
(newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
},
{ deep: true }
)
//引用數據類型+引用數據類型 deep有效 引用數據類型oldVal存在問題
watch(
[() => data.hobby, () => data.job],
(newvalue, oldvalue) => {
console.log(newvalue, oldvalue)
},
{ deep: true }
)
return {
...toRefs(data),
boy,
}
},
}
</script>
