首頁  >  文章  >  web前端  >  vue3中的watch和computed怎麼使用

vue3中的watch和computed怎麼使用

PHPz
PHPz轉載
2023-05-20 22:16:04930瀏覽

一、watch

1.偵測reactive內部資料

<template>
  <p>{{ obj.hobby.eat }}</p>
  <button @click="obj.hobby.eat = &#39;面条&#39;">click</button>
</template>

<script>
  import { watch, reactive } from &#39;vue&#39;
  export default {
      name: &#39;App&#39;,
      setup() {
          const obj = reactive({
              name: &#39;ifer&#39;,
              hobby: {
                  eat: &#39;西瓜&#39;,
              },
          })
          watch(obj, (newValue, oldValue) => {
              // 注意1:监听对象的时候,新旧值是相等的
              // 注意2:强制开启深度监听,配置无效
              console.log(&#39;触发监听&#39;);
              console.log(newValue === oldValue) // true
          })

          return { obj }
      },
  }
</script>

注意點:對reactive 本身的修改則不會觸發監聽。 【相關推薦:vuejs影片教學、web前端開發】

<template>
    <p>{{ obj.hobby.eat }}</p>
    <button @click="obj.hobby = { eat: &#39;面条&#39; }">click</button>
</template>

<script>
    import { watch, reactive } from &#39;vue&#39;
    export default {
        name: &#39;App&#39;,
        setup() {
            const obj = reactive({
                name: &#39;ifer&#39;,
                hobby: {
                    eat: &#39;西瓜&#39;,
                },
            })
            watch(obj.hobby, (newValue, oldValue) => {
                // obj.hobby = { eat: &#39;面条&#39; }
                console.log(&#39;对 reactive 自身的修改不会触发监听&#39;)
            })
            return { obj }
        },
    }
</script>

vue3中的watch和computed怎麼使用

#一定要注意不能修改reactive本身,修改本身不觸發

2.監聽ref 資料

  • 2.1監聽一個ref 資料

<template>
  <p>{{ age }}</p>
  <button @click="age++">click</button>
</template>

<script>
  import { watch, ref } from &#39;vue&#39;
  export default {
      name: &#39;App&#39;,
      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 &#39;vue&#39;
    export default {
        name: &#39;App&#39;,
        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>

vue3中的watch和computed怎麼使用

立即觸發監聽屬性:

                {
                    immediate: true,
                }
<template>
    <p>{{ age }}</p>
    <button @click="handleClick">click</button>
</template>

<script>
    import { watch, ref } from &#39;vue&#39;
    export default {
        name: &#39;App&#39;,
        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>

vue3中的watch和computed怎麼使用

開啟深度監聽ref 資料

? 问题:修改 ref 对象里面的数据并不会触发监听,说明 ref 并不是默认开启 deep 的。见下
<template>
    <p>{{ obj.hobby.eat }}</p>
    <button @click="obj.hobby.eat = &#39;面条&#39;">修改 obj.hobby.eat</button>
</template>

<script>
    import { watch, ref } from &#39;vue&#39;
    export default {
        name: &#39;App&#39;,
        setup() {
            const obj = ref({
                hobby: {
                    eat: &#39;西瓜&#39;,
                },
            })
            // 注意:ref 监听对象,默认监听的是这个对象地址的变化
            watch(obj, (newValue, oldValue) => {
                console.log(newValue === oldValue)
            })

            return { obj }
        },
    }
</script>

vue3中的watch和computed怎麼使用
面對這樣的沒有觸發watch我們解決辦法有三個:

  • ##解決1:當然直接修改整個物件的話一定是會被監聽到的(注意模板中對obj 的修改,相當於修改的是obj.value)。

    -`

    {{ obj.hobby.eat }}

vue3中的watch和computed怎麼使用

  • #解決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 = &#39;面条&#39;">修改 obj</button>
</template>

<script>
    import { watch, ref } from &#39;vue&#39;
    export default {
        name: &#39;App&#39;,
        setup() {
            const obj = ref({
                hobby: {
                    eat: &#39;西瓜&#39;,
                },
            })
            watch(obj.value, (newValue, oldValue) => {
                console.log(newValue, oldValue)
                console.log(newValue === oldValue)
            })

            return { obj }
        },
    }
</script>

vue3中的watch和computed怎麼使用

  • 監聽普通資料

    監聽響應式物件中的某一個普通屬性值,要透過函數傳回的方式進行(如果傳回的是對象/響應式對象,修改內部的資料需要開啟深度監聽)。

  • <template>
        <p>{{ obj.hobby.eat }}</p>
        <button @click="obj.hobby.eat = &#39;面条&#39;">修改 obj</button>
    </template>
    
    <script>
        import { watch, reactive } from &#39;vue&#39;
        export default {
            name: &#39;App&#39;,
            setup() {
                const obj = reactive({
                    hobby: {
                        eat: &#39;西瓜&#39;,
                    },
                })
                // 把 obj.hobby 作为普通值去进行监听,只能监听到 obj.hobby 自身的变化
                /* watch(
          () => obj.hobby,
          (newValue, oldValue) => {
            console.log(newValue, oldValue)
            console.log(newValue === oldValue)
          }
        ) */
                // 如果开启了深度监听,则能监听到 obj.hobby 和内部数据的所有变化
                /* watch(
          () => obj.hobby,
          (newValue, oldValue) => {
            console.log(newValue, oldValue)
            console.log(newValue === oldValue)
          },
          {
            deep: true,
          }
        ) */
                // 能监听影响到 obj.hobby.eat 变化的操作,例如 obj.hobby = { eat: &#39;面条&#39; } 或 obj.hobby.eat = &#39;面条&#39;,如果是 reactive 直接对 obj 的修改则不会被监听到(ref 可以)
                watch(
                    () => obj.hobby.eat,
                    (newValue, oldValue) => {
                        console.log(newValue, oldValue)
                        console.log(newValue === oldValue)
                    }
                )
                return { obj }
            },
        }
    </script>

二、computed

#作用:computed 函數用來定義計算屬性,上述的基礎概念都是同vue2一樣的,關於vue2中這兩個知識點的定義大家可以移步:【vue2】計算與偵聽的用法。

<template>
  <p>firstName: {{ person.firstName }}</p>
  <p>lastName: {{ person.lastName }}</p>
  <input type="text" v-model="person.fullName" />
</template>
<script>
  import { computed, reactive } from &#39;vue&#39;
  export default {
      name: &#39;App&#39;,
      setup() {
          const person = reactive({
              firstName: &#39;初&#39;,
              lastName: &#39;映&#39;,
          })
          // 也可以传入对象,目前和上面等价
          person.fullName = computed({
              get() {
                  return person.firstName + &#39;*&#39; + person.lastName
              },
              set(value) {
                console.log(value,&#39;value&#39;);//为上述get的返回值
                  const newArr = value.split(&#39;*&#39;)
                  person.firstName = newArr[0]
                  person.lastName = newArr[1]
              },
          })
          return {
              person,
          }
      },
  }
</script>

vue3中的watch和computed怎麼使用#

以上是vue3中的watch和computed怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除