Vue3的computed计算属性和watch监视(四)

这篇具有很好参考价值的文章主要介绍了Vue3的computed计算属性和watch监视(四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、computed计算属性

<template>
    <div class="person">

        姓:<input type="text" v-model="first_name"><br>
        名:<input type="text" v-model="last_name"><br>
        <button @click="changeFullName">修改全名</button><br>

        <!-- 计算属性的意义在于,full_name可以缓存起来,多次输出的时候,不用计算多次(如果使用函数,则会) -->
        全名<span>{{full_name}}</span><br>
        全名<span>{{full_name}}</span><br>


    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { ref, computed } from 'vue'

    let first_name = ref('zhang')
    let last_name = ref('san')
    // 此时full_name是只读的,并不能修改
    // let full_name = computed(() => {
    //     return first_name.value.slice(0, 1).toUpperCase() + first_name.value.slice(1) + '-' + last_name.value
    // })

    // 如果full_name想要实现修改功能,需要实现set方法
    let full_name = computed({
        get() {
            return first_name.value.slice(0, 1).toUpperCase() + first_name.value.slice(1) + '-' + last_name.value
        },

        //当full_name被修改时,set被调用,且val会捕获到修改后的值
        set(val) {
            const [str1, str2] = val.split('-')
            first_name.value = str1
            last_name.value = str2
        }
    })

    function changeFullName() {
        //从这里引用方式(通过value才可以获取该值)可以看出,full_name其实是一个ref对象
        full_name.value = 'li-si'
    }


</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

二、watch监视

1、场景一

监视【ref】定义的【基本数据】类型

<template>
    <div class="person">

        <h1>场景1:监视【ref】定义的【基本数据】类型</h1><br>
        sum的值: {{sum}}<br>
        <button @click="changeSum">修改sum的值</button><br>


    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { ref, watch } from 'vue'

    let sum = ref(0)

    function changeSum() {
        sum.value += 1
    }

    let stopWatch = watch(sum, (newVal, oldVal) => {
        console.log('sum值变了', newVal, oldVal)
        if (newVal > 10) {
            stopWatch()
        }
    })


</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

2、场景二

监视【ref】定义的【对象类型】数据

<template>
    <div class="person">

        <h1>情况二:监视【ref】定义的【对象类型】数据</h1><br>
        姓名: {{person.name}}<br>
        年龄: {{person.age}}<br>
        <button @click="changeName">修改name的值</button><br>
        <button @click="changeAge">修改age的值</button><br>
        <button @click="changePerson">修改person</button><br>
    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { ref, watch } from 'vue'

    let person = ref({
        name: 'Maple',
        age: 18
    })

    function changeName() {
        person.value.name = 'Max'
    }

    function changeAge() {
        person.value.age = 28
    }

    function changePerson() {
        person.value = { name: 'Kelly', age: 20 }
    }


    // 对于对象,watch监视的是对象的地址,所以如果只是对象的属性值(name和age)发生变化,并不会被监视到
    // 除非手动开启深度监视
    watch(person, (newVal, oldVal) => {
        console.log('person值变了', newVal, oldVal)
    }, { deep: true })


</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

Vue3的computed计算属性和watch监视(四),Vue,vue.js,前端,javascript

3、场景三

监视【reactive】定义的【对象类型】数据

<template>
  <div class="person">
    <h1>情况三:监视【reactive】定义的【对象类型】数据</h1>
    <h2>姓名:{{ person.name }}</h2>
    <h2>年龄:{{ person.age }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="changePerson">修改整个人</button>
    <hr>
    <h2>测试:{{obj.a.b.c}}</h2>
    <button @click="test">修改obj.a.b.c</button>
  </div>
</template>

<script lang="ts" setup name="Person">
  import {reactive,watch} from 'vue'
  // 数据
  let person = reactive({
    name:'张三',
    age:18
  })
  let obj = reactive({
    a:{
      b:{
        c:666
      }
    }
  })
  // 方法
  function changeName(){
    person.name += '~'
  }
  function changeAge(){
    person.age += 1
  }
  function changePerson(){
    Object.assign(person,{name:'李四',age:80})
  }
  function test(){
    obj.a.b.c = 888
  }

  // 监视,情况三:监视【reactive】定义的【对象类型】数据,且默认是开启深度监视的
  watch(person,(newValue,oldValue)=>{
    console.log('person变化了',newValue,oldValue)
  })
  watch(obj,(newValue,oldValue)=>{
    console.log('Obj变化了',newValue,oldValue)
  })
  
</script>

<style scoped>
  .person {
    background-color: skyblue;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
  }
  button {
    margin: 0 5px;
  }
  li {
    font-size: 20px;
  }
</style>

 与场景二不同的是,newVal和oldVal是一样的,表明通过Object.assign重新赋值的时候,并不是生成一个新的对象,而是新的值覆盖了旧值

Vue3的computed计算属性和watch监视(四),Vue,vue.js,前端,javascript

4、场景四

监视【ref】或者【reactive】定义的【对象类型】数据的某个属性(基本数据类型或者对象类型-都建议写成函数形式)

<template>
    <div class="person">
        <h1>情况四:监视【ref】或者【reactive】定义的【对象类型】数据的某个属性</h1><br>
        姓名: {{person.name}}<br>
        年龄: {{person.age}}<br>
        家人: {{person.family}}<br>
        <button @click="changeName">修改name的值</button><br>
        <button @click="changeAge">修改age的值</button><br>
        <button @click="changePerson">修改person</button><br>
        <button @click="changePersonFamily">修改person的family</button>
    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { reactive, watch } from 'vue'

    let person = reactive({
        name: 'Maple',
        age: 18,
        family: { 'father': 'David', 'mother': 'Lily' }
    })


    function changeName() {
        person.name = 'Max'
    }

    function changeAge() {
        person.age = 28
    }

    function changePersonFamily() {
        person.family = { 'father': 'Bob', 'mother': 'kathy' }
    }

    function changePerson() {
        Object.assign(person, { 'name': 'Jay', 'age': 30, family: { 'father': 'Bob', 'mother': 'kathy' } })
    }


    // 如果要监视某个属性,且该属性是基本数据类型,需要写成函数的形式(因为watch能够监视的对象只能是ref,reactive
    //、对象或者函数)
    watch(() => person.name, (newVal, oldVal) => {
        console.log('person的name值变了', newVal, oldVal)
    })

    //person.family虽然是对象数据类型,也要写成函数形式
    watch(() => person.family, (newVal, oldVal) => {
        console.log('person的family发生了变换', newVal, oldVal)
    }, { deep: true })
</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

5、场景五

监视上述多个数据文章来源地址https://www.toymoban.com/news/detail-833551.html

<template>
    <div class="person">

        <h1>情况五:监视上述多个数据</h1><br>
        姓名: {{person.name}}<br>
        年龄: {{person.age}}<br>
        家人: {{person.family}}<br>
        <button @click="changeName">修改name的值</button><br>
        <button @click="changeAge">修改age的值</button><br>
        <button @click="changePerson">修改person</button><br>
        <button @click="changePersonFamily">修改person的family</button>


    </div>
</template>

<script lang="ts">
    export default {
        name: 'Person'
    }
</script>

<script setup lang="ts">
    //1. 首先从vue引入ref
    import { reactive, watch } from 'vue'

    let person = reactive({
        name: 'Maple',
        age: 18,
        family: { father: 'David', mother: 'Lily' }
    })


    function changeName() {
        person.name = 'Max'
    }

    function changeAge() {
        person.age = 28
    }

    function changePersonFamily() {
        person.family = { father: 'Bob', mother: 'kathy' }
    }

    function changePerson() {
        Object.assign(person, { 'name': 'Jay', 'age': 30, family: { father: 'Bob', mother: 'kathy' } })
    }


    // 如果要监视多个属性,以函数的形式放在数组里
    watch([() => person.name, () => person.family], (newVal, oldVal) => {
        console.log('person的name和family值变了', newVal, oldVal)
    }, { deep: true })


</script>

<style scoped>
    .person {
        background-color: skyblue;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }

    button {
        margin: 0 50px;
    }
</style>

到了这里,关于Vue3的computed计算属性和watch监视(四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3监视属性watch详解(附带详细代码与讲解!!!)

    watch() 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 第一个参数是侦听器的 源 。这个来源可以是以下几种: 一个函数, 一个返回值 一个ref 一个响应式对象(reactive定义的) ...或是由以上类型的值组成的数组 第二个参数是一个回调函数, 这个回调函数可接收三个

    2024年02月11日
    浏览(36)
  • Vue3前端开发,computed计算属性的基础练习

    Vue3前端开发,computed计算属性的基础练习! 在新版里面,和传统的vue2一样,计算属性,都是对一些数据运算进行了封装操作。返回结果是一个实时监控的效果。区别在于,写法不同。效果是一样。 下面给大家展示一个简单的案例。 如图,自定义一个组件,ComputedDemo.vue。里

    2024年01月18日
    浏览(48)
  • 【Vue3】setup的注意点及watch监视属性的六种情况

    1.1setup的执行时间 1.setup的执行时间要比beforCreate执行要早 1.2.steup参数 setup的参数 1.props: 值为对象,包含: 组件外部传递过来,且组件内部声明接收了的属性 2.context:上下文对象 ①attrs:值为对象,包含: 组件外部传递过来,但没有在props配置中声明的属性,相当于 this.$attrs ②sl

    2023年04月22日
    浏览(35)
  • 【vue2】计算属性(computed)与侦听器(watch)详解

    🥳博       主: 初映CY的前说(前端领域) 🌞个人信条: 想要变成得到,中间还有做到! 🤘本文核心: 计算属性与侦听属性的用法 目录( 文末有给大家准备好的Xmind思维导图 ) 一、计算属性computed ①默认get()方法,仅是获取值 ②不仅仅是获取值,还具有修改属性功能

    2024年01月16日
    浏览(50)
  • Vue3 第三节 计算属性,监视属性,生命周期

    1.computed计算属性 2.watch监视函数 3.watchEffect函数 4.Vue的生命周期函数 计算属性简写和完整写法 2.1 监视情况分类  情况① 监视ref定义的响应式数据: 第一个参数是监视的数据,第二个参数是一个回调函数 immediate:一上来就执行,放到第三个参数中 情况② 监视多个ref定义的响应

    2024年02月14日
    浏览(46)
  • 【Vue2从入门到精通】Vue监听器watch,计算属性computed,方法methods的区别及使用场景

    ✍创作者:全栈弄潮儿 🏡 个人主页: 全栈弄潮儿的个人主页 🏙️ 个人社区,欢迎你的加入:全栈弄潮儿的个人社区 📙 专栏地址:vue2从入门到精通 【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用

    2023年04月15日
    浏览(46)
  • Vue3/ Vue3 计算属性computed函数 语法 与 介绍 、Vue3 Vue2computed计算属性 能不能传参 怎么传参

    语法: // 第一种语法get方法 (没有set) const 函数名 = computed(() = {   return  }) // 第二种语法 get set 方法 带有set参数 可以设置 const 函数名 = computed(() = { get() { return 结果 }, set( val ){  } }) 触发场景:  如果要访问计算属性 会自动执行 get 如果要修改计算属性 会自动执行 set 简介

    2024年02月02日
    浏览(49)
  • 【Vue3】computed 计算属性

    computed 是计算属性,它会根据响应式数据的变化⾃动计算出新的值,并缓存结果,只有在计算属性所依赖的响应式数据发⽣改变时才会重新计算。 computed 适⽤于需要根据响应式数据计算得出结果的场景,例如根据商品的数量和单价计算商品的总价,或者根据选中的过滤条件过

    2024年02月15日
    浏览(51)
  • vue3-computed计算属性!!!

    1.计算属性具有缓存特性,在computed中的响应式数据不发生变化时,就不重新加载computed中的逻辑。(作用于大量耗时的逻辑解构,并为其数据不经常发生变化,可采取computed计算属性提高程序效率--常用于购物车数据计算) 代码如下:  通过F12检测数据变化:

    2024年02月05日
    浏览(48)
  • vue全家桶进阶之路33:Vue3 计算属性computed

    在Vue3中,计算属性可以使用 computed 函数来定义。 computed 函数接受两个参数:第一个参数是一个函数,该函数返回计算属性的值;第二个参数是一个可选的配置对象,可以包含getter和setter函数,以及控制计算属性缓存的缓存配置。 Vue3中的计算属性与Vue2中的计算属性相比有以

    2023年04月18日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包