当前位置: 首页 > article >正文

Vue3 中的计算属性和监听属性

1. 计算属性computed

   作用:根据已有数据计算出新数据(和Vue2中的computed作用一致)

<template>
    <div class="person">
        <input type="text" v-model="person.firstName"/>
        <br>
        <input type="text" v-model="person.lastName"/>
        <br>
        <span>全名:{{ person.fullName }}</span>
        <input type="text" v-model="person.fullName"/>
    </div>
</template>
    
<script>
import { reactive,computed } from 'vue'
    export default {
        name: 'Computed',
        setup() {
            let person = reactive({
                firstName: '李',
                lastName: '四',
            })

             //简写形式(只能读)
             person.fullName = computed(() => {
                 return person.firstName + '-' + person.lastName
             })


            //完整形式(可读可改)
            person.fullName = computed({
                get() {
                    return person.firstName + '-' + person.lastName
                },
                set(value){
                    let names = value.split('-')
                    person.firstName = names[0]
                    person.lastName = names[1]
                },
            })

            return {
                person,
            }
            
        }
    }
</script>

2. 监听属性 watch

<template>
    <div>{{ sum }}</div>
    <button @click="sum++">点我+1</button>
    <hr>
    <div>{{ msg }}</div>
    <button @click="msg += '!'">点我修改信息</button>

    <hr>
    <h3>姓名:{{ person.name }}</h3>
    <h3>年龄:{{ person.age }}</h3>
    <h3>薪资:{{ person.job.j1.salary }}K</h3>
    <button @click="person.name += '!'">点我修改姓名</button>
    <button @click="person.age++">点我修改年龄</button>
    <button @click="person.job.j1.salary += 10">点我修改薪资</button>
</template>
    
<script>
import { reactive, ref, watch, watchEffect } from 'vue'
    export default {
        name: 'Watch',
        setup() {
           let sum = ref(0)
           let msg = ref('hello')
           let person = reactive({
               name: '张三',
               age: 18,
               job: {
                   j1: {
                       salary: 20
                   }
               }
           })

           // .....下文在这边补充


            return {
                sum,
                msg,
                person
            } 
        }
    }
</script>

【情况一】监听ref定义的一个响应式数据

监听sum的值的变化 

           watch(sum, (newVal, oldVal) =>{
                console.log('sum的值发生了变化', newVal, oldVal);
           }, {immediate: true})  // {immediate: true, deep: true}

【情况二】 监听ref定义的多个响应式数据

监听sum, msg的值的变化

           watch([sum, msg], (newVal, oldVal) => { // 包装成数组的形式
                console.log('sum或msg的值发生了变化', newVal, oldVal);
           },{immediate: true})

【情况三】监听reactive定义的一个响应式数据的全部属性

注意:此处无法正确的获取oldValue

             watch(person, (newVal, oldVal) =>{
                console.log('person的值发生了变化', newVal, oldVal)
            }) // {deep: false} 加上这个,就监测不到薪资改变了 

【情况四】监听reactive定义的一个响应式数据中的某个属性

            watch(() => person.name, (newVal, oldVal) =>{
                console.log('person的name属性发生了变化', newVal, oldVal)
            })

【情况五】监听reactive定义的一个响应式数据中的某些属性

            watch([() => person.name, () => person.age], (newVal, oldVal) =>{
                console.log('person的name或age属性发生了变化', newVal, oldVal)
            })

【情况六】特殊情况 

             watch(() => person.job, (newVal, oldVal) =>{
                console.log('person的job属性发生了变化', newVal, oldVal)
             }, {deep: true}) 

3. watchEffect

    用谁就监视谁

            watchEffect(() =>{ // 用谁就监视谁

                const x1 = sum.value

                const x2 = person.job.j1.salary

                console.log('watchEffect所指定的回调函数执行了')

            })

 


http://www.kler.cn/a/463305.html

相关文章:

  • dockerignore文件怎么写
  • STM32 拓展 RTC(实时时钟)
  • UE5通过蓝图节点控制材质参数
  • SOLIDWORKS Composer在产品设计、制造与销售中的应用
  • Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验
  • driftingblues2
  • Unity3D Huatuo之AOT泛型限制及原理详解
  • 【Unity3D】A*寻路(2D究极简单版)
  • UWB定位的7种算法
  • YOLOv10-1.1部分代码阅读笔记-block.py
  • Unity-Mirror网络框架-从入门到精通之Basic示例
  • 低空经济服务线路,无人机建筑工地吊运技术详解
  • C中如何实现斐波那契数列的迭代和递归算法?
  • echo vim cat 与 换行符
  • SSRF服务端请求Gopher伪协议白盒测试
  • http性能测试命令ab
  • Sqoop的使用
  • Linux命令——4.重定向、管道
  • rust学习-初识rust
  • 基于OAuth2.0和JWT规范实现安全易用的用户认证
  • [MySQL#1] database概述 常见的操作指令 MySQL架构 存储引擎
  • WireShark4.4.2浏览器网络调试指南:TCP传输包分析(七)
  • TCP/IP协议簇常见协议信息
  • 打造电竞比分网:用Java和Vue实现赛事实时数据与直播功能
  • 【HarmonyOS之旅】ArkTS语法(二) -> 动态构建UI元素
  • 【Ubuntu使用技巧】Ubuntu22.04无人值守Crontab工具实战详解