I have this watcher (inside <script setup>
:
const form = reactive({
body: '',
image: ''
})
watch(() => form.image, () => {
console.log(form.image)
})
which I want to expand to watch two reactive objects:
watch(() => (form.image, form.body), () => {
console.log(form)
})
but this now only watches form.body
. I've been trying to implement this question's answer, but it doesn't seem to work like my watcher with new and old values. I want the watcher to trigger, when both values are updated.
I have this watcher (inside <script setup>
:
const form = reactive({
body: '',
image: ''
})
watch(() => form.image, () => {
console.log(form.image)
})
which I want to expand to watch two reactive objects:
watch(() => (form.image, form.body), () => {
console.log(form)
})
but this now only watches form.body
. I've been trying to implement this question's answer, but it doesn't seem to work like my watcher with new and old values. I want the watcher to trigger, when both values are updated.
3 Answers
Reset to default 11I figured something out. It'll trigger when both values are true. You can put your own conditions in there.
const form = reactive({
body: '',
image: ''
})
watch(() => [form.image, form.body], () => {
if (form.image && form.body) {
console.log(form)
}
})
Like @tao suggested in the comments, if you're working with nested objects, you have to use { deep: true }
in your watcher.
More about deep watchers in the vue docs.
You need to call watch each time if you need multiple watchers:
watch(() => form.image, () => {
console.log(form.image)
})
watch(() => form.body, () => {
console.log(form.body)
})
if what you need is a watcher to watch the two then :
watch([() => form.image, () => form.body],
([newImage, newBody], [prevImage, prevBody]) => {
console.log(form.body, form.image)
})
if we take example on that answer : https://stackoverflow.com/a/45853349/8126784 from the question you linked
This can be done with watchEffect it will check the reactivity:
watchEffect(() => {
emit('update:selectedProduct', localSelectedProduct.value);
emit('update:selectedOffer', localSelectedOffer.value);
});
Here's the vuejs docs: https://vuejs.org/guide/essentials/watchers.html#watcheffect