Vue3中watch的诸多疑点,看完再也不敢说我懂了!

watch 官方描述:侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。 第一个参数是侦听器的 源 。 第二个参数是在发生变化时要调用的回调函数。这个回调函数接受三个参数:新值、旧值,以及一个用于注册副作用清理的回调函数。 第...

这篇文章已从掘金同步到个人博客,原始发布地址为 掘金原文

前端领秀.png

watch

官方描述:侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。

1.基本概论了解完了,话不多说,先来看一段Vue的代码:

image.png

<script setup>
import { watch, ref } from 'vue';
const n = ref(0);
function getN(){
    console.log('getN');
    return n.value;
}
watch(
    () => getN(),
    (newVal, oldVal) => {
        console.log('n changed', newVal, oldVal); // 输出:n changed 1, 0
    }
);
setTimeout(() => {
    n.value++;
}, 1000);
</script>

控制台输出:一开始输出一个 getN,1秒后输出getN接着继续输出 n changed 1, 0

image.png

2.我们改一下,增加一个m:

watch-code-1.png

看下输出结果:

watch-code-1-log.png

3.看到这里,你是不是感觉自己好像基本掌握了watch的玩法,那就上难度:

watch-code-2.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: 1,
    b: 2,
    c: 3
})

watch(
    () => {
       console.log(state.a + state.b);
       return state.a + state.b;
    },
    (val) => {
       console.log(val * 2);
    }
)

setTimeout(() => {
    state.a++;
    state.b--;
})
</script>

输出结果: watch-code-2-log.png

4.继续改一下代码:

watch-code-3.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: 1,
    b: 2,
    c: 4
})

watch(
    () => {
       console.log(state.c);
       return state.a + state.b;
    },
    (val) => {
       console.log(val * 2);
    }
)

setTimeout(() => {
    state.c++;
})
</script>

输出结果: watch-code-3-log.png

5.有意思吧,我们继续

watch-code-4.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: {},
    c: 4
})

watch(
    () => {
       console.log(state.c);
       return state.a;
    },
    (val) => {
       console.log("changed");
    }
)

setTimeout(() => {
    state.c++;
})
</script>

输出结果:

watch-code-4-log.png

6.继续上难度:

watch-code-5.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: {},
    c: 4
})

watch(
    () => {
       state.c = 5;
       console.log("1");
       return state.a;
    },
    (val) => {
       console.log("2");
    }
)

setTimeout(() => {
    state.c++;
})
</script>

输出结果:

watch-code-5-log.png

7.继续上难度:

watch-code-6.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: {},
    c: 4
})
const c = state.c;

watch(
    () => {
       console.log(c);
       return state.a;
    },
    (val) => {
       console.log('2');
    }
)

setTimeout(() => {
    state.c++;
})
</script>

输出结果:

watch-code-6-log.png

8.继续上难度:

watch-code-7.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: {},
    c: 4
})
const getC = () => state.c;

watch(
    () => {
       console.log(1);
       getC();
       return state.a;
    },
    (val) => {
       console.log('2');
    }
)

setTimeout(() => {
    state.c++;
})
</script>

输出结果:

watch-code-7-log.png

9.最后一个问题,先不看答案,脑袋里面想一想:

watch-code-8.png

<script setup>
import { watch, reactive } from 'vue';

const state = reactive({
    a: {},
    c: 4
})

watch(
    () => {
       console.log(state);
       return state.a;
    },
    (val) => {
       console.log('2');
    }
)

setTimeout(() => {
    state.c++;
})
</script>

输出结果: watch-code-8-log.png

最后,你学废了吗?