聊聊vue3中watch和computed的使用方法

广告:宝塔Linux面板高效运维的服务器管理软件 点击【 https://www.bt.cn/p/uNLv1L 】立即购买

聊聊vue3中watch和computed的使用方法

本篇文章带大家学习vue3,深入聊聊计算属性computed与侦听器watch的使用方法,希望对大家有所帮助!

一、watch

1.检测reactive内部数据

<template>  <p>{{ obj.hobby.eat }}</p>  <button @click="obj.hobby.eat = '面条'">click</button></template><script>  import { watch, reactive } from 'vue'  export default {      name: 'App',      setup() {          const obj = reactive({              name: 'ifer',              hobby: {                  eat: '西瓜',              },          })          watch(obj, (newValue, oldValue) => {              // 注意1:监听对象的时候,新旧值是相等的              // 注意2:强制开启深度监听,配置无效              console.log('触发监听');              console.log(newValue === oldValue) // true          })          return { obj }      },  }</script>
登录后复制

注意点:对 reactive 自身的修改则不会触发监听。【相关推荐:vuejs视频教程、web前端开发】

<template>    <p>{{ obj.hobby.eat }}</p>    <button @click="obj.hobby = { eat: '面条' }">click</button></template><script>    import { watch, reactive } from 'vue'    export default {        name: 'App',        setup() {            const obj = reactive({                name: 'ifer',                hobby: {                    eat: '西瓜',                },            })            watch(obj.hobby, (newValue, oldValue) => {                // obj.hobby = { eat: '面条' }                console.log('对 reactive 自身的修改不会触发监听')            })            return { obj }        },    }</script>
登录后复制

一定得注意不能修改reactive本身,修改本身不触发

2.监听 ref 数据

2.1监听一个 ref 数据
<template>  <p>{{ age }}</p>  <button @click="age++">click</button></template><script>  import { watch, ref } from 'vue'  export default {      name: 'App',      setup() {          const age = ref(18)          // 监听 ref 数据 age,会触发后面的回调,不需要 .value          watch(age, (newValue, oldValue) => {              console.log(newValue, oldValue)          })          return { age }      },  }</script>
登录后复制2.2监听多个 ref 数据

可以通过数组的形式,同时监听 age 和 num 的变化。

<template>    <p>age: {{ age }} num: {{ num }}</p>    <button @click="handleClick">click</button></template><script>    import { watch, ref } from 'vue'    export default {        name: 'App',        setup() {            const age = ref(18)            const num = ref(0)            const handleClick = () => {                age.value++                num.value++            }            // 数组里面是 ref 数据            watch([age, num], (newValue, oldValue) => {                console.log(newValue, oldValue)            })            return { age, num, handleClick }        },    }</script>
登录后复制

立即触发监听属性:

                {                    immediate: true,                }
登录后复制
<template>    <p>{{ age }}</p>    <button @click="handleClick">click</button></template><script>    import { watch, ref } from 'vue'    export default {        name: 'App',        setup() {            const age = ref(18)            const handleClick = () => {                age.value++            }            watch(                age,                (newValue, oldValue) => {                    console.log(newValue, oldValue) // 18 undefined                },                {                    immediate: true,                }            )            return { age, handleClick }        },    }</script>
登录后复制

开启深度监听 ref 数据

? 问题:修改 ref 对象里面的数据并不会触发监听,说明 ref 并不是默认开启 deep 的。见下
登录后复制
<template>    <p>{{ obj.hobby.eat }}</p>    <button @click="obj.hobby.eat = '面条'">修改 obj.hobby.eat</button></template><script>    import { watch, ref } from 'vue'    export default {        name: 'App',        setup() {            const obj = ref({                hobby: {                    eat: '西瓜',                },            })            // 注意:ref 监听对象,默认监听的是这个对象地址的变化            watch(obj, (newValue, oldValue) => {                console.log(newValue === oldValue)            })            return { obj }        },    }</script>
登录后复制

面对这样的没有触发watch我们解决办法有三个:

解决 1:当然直接修改整个对象的话肯定是会被监听到的(注意模板中对 obj 的修改,相当于修改的是 obj.value)。 -`

{{ obj.hobby.eat }}

`

解决 2:开启深度监听 ref 数据。
watch(    obj,    (newValue, oldValue) => {        console.log(newValue, oldValue)        console.log(newValue === oldValue)    },    {        deep: true,    })
登录后复制

就加上一句话,故此没有截图

解决 3:还可以通过监听 ref.value 来实现同样的效果。

因为 ref 内部如果包裹对象的话,其实还是借助 reactive 实现的,可以通过 isReactive 方法来证明。

<template>    <p>{{ obj.hobby.eat }}</p>    <button @click="obj.hobby.eat = '面条'">修改 obj</button></template><script>    import { watch, ref } from 'vue'    export default {        name: 'App',        setup() {            const obj = ref({                hobby: {                    eat: '西瓜',                },            })            watch(obj.value, (newValue, oldValue) => {                console.log(newValue, oldValue)                console.log(newValue === oldValue)            })            return { obj }        },    }</script>
登录后复制

监听普通数据 监听响应式对象中的某一个普通属性值,要通过函数返回的方式进行(如果返回的是对象/响应式对象,修改内部的数据需要开启深度监听)。
<template>    <p>{{ obj.hobby.eat }}</p>    <button @click="obj.hobby = { eat: '面条' }">click</button></template><script>    import { watch, reactive } from 'vue'    export default {        name: 'App',        setup() {            const obj = reactive({                name: 'ifer',                hobby: {                    eat: '西瓜',                },            })            watch(obj.hobby, (newValue, oldValue) => {                // obj.hobby = { eat: '面条' }                console.log('对 reactive 自身的修改不会触发监听')            })            return { obj }        },    }</script>0
登录后复制二、computed

作用:computed 函数用来定义计算属性,上述的基础概念都是同vue2一样的,关于vue2中这两个知识点的定义大家可以移步:【vue2】计算与侦听的用法。

<template>    <p>{{ obj.hobby.eat }}</p>    <button @click="obj.hobby = { eat: '面条' }">click</button></template><script>    import { watch, reactive } from 'vue'    export default {        name: 'App',        setup() {            const obj = reactive({                name: 'ifer',                hobby: {                    eat: '西瓜',                },            })            watch(obj.hobby, (newValue, oldValue) => {                // obj.hobby = { eat: '面条' }                console.log('对 reactive 自身的修改不会触发监听')            })            return { obj }        },    }</script>1
登录后复制

(学习视频分享:vuejs入门教程、编程基础视频)

以上就是聊聊vue3中watch和computed的使用方法的详细内容,更多请关注9543建站博客其它相关文章!

广告:SSL证书一年128.66元起,点击购买~~~

9543建站博客
一个专注于网站开发、微信开发的技术类纯净博客。
作者头像
admin创始人

肥猫,知名SEO博客站长,14年SEO经验。

上一篇:如何使用Uniapp绘制横线
下一篇:怎么弄css

发表评论

关闭广告
关闭广告