• 5.Vue中的计算属性(compute)监视属性(watch),二者优点和对比


    目录

    计算属性(compute)

    结合程序来看

    运行结果

    监视属性(watch)

    代码

    运行结果

    监视的简写

    compute和watch的区别


    data中的数据就是属性

    计算属性(compute)

            1.定义:通过自己已有的属性计算得来

            2.原理:底层结束Object.defineproperty方法提供的getter和setter

            3.get函数什么时候执行

                1.初次读取fullName的时候

                2.所依赖的数据发生变化的时候

            4.优势:与methods实现相比,内存有缓存机制(复用),效率更高,调试方便

            5.备注:

                1.计算属性最终会出现再vm上,直接读取即可

                2.如果计算属性要被修改,那必须写set函数去相应修改

    结合程序来看

    1. <body>
    2. <div id="root">
    3. 姓: <input type="text" v-model="fisrtName">
    4. <br>
    5. 名: <input type="text" v-model="lastName">
    6. <br>
    7. 姓名: <span>{{fullName}}span>
    8. div>
    9. <script>
    10. Vue.config.productionTip = false
    11. new Vue({
    12. el: '#root',
    13. data() {
    14. return {
    15. fisrtName: 'fan',
    16. lastName: 'xiyuan'
    17. }
    18. },
    19. // computed: {
    20. // //完整写法
    21. // fullName: {
    22. // //get有什么作用,当人读取fullName时,get就会被调用
    23. // // 且返回值作为fullName的值
    24. // //set什么时候使用:当需要直接修改fullName的时候
    25. // set(value){
    26. // },
    27. // get() {
    28. // return this.fisrtName + this.lastName
    29. // }
    30. // }
    31. // }
    32. //简易写法:
    33. computed: {
    34. fullName() {
    35. return this.fisrtName + this.lastName
    36. }
    37. }
    38. })
    39. script>
    40. body>

    运行结果

    监视属性(watch)

    深度监视:

            (1):Vue中的watch默认不监测对象内部的值的改变(一层)

            (2):配置deep:true可以监测对象内部值改变(多层)

        备注:

            (1)Vue自身可以监测对象内部值的改变,但Vue提供的watch默认不可以

            (2)使用watch时根据数据的具体结构,决定是否采用深度监视

    代码

    1. <body>
    2. <div id="root">
    3. <h2>今天天气{{info}}h2>
    4. <button @click="changeWeather">切换天气button>
    5. <hr>
    6. <h3>a的值是{{number.a}}h3>
    7. <button @click="number.a++">a+1button>
    8. <hr>
    9. <h3>a的值是{{number.b}}h3>
    10. <button @click="number.b++">b+1button>
    11. div>
    12. <script>
    13. Vue.config.productionTip = false
    14. new Vue({
    15. el: '#root',
    16. data() {
    17. return {
    18. isHot: true,
    19. number: {
    20. a: 1,
    21. b: 2
    22. }
    23. }
    24. },
    25. computed: {
    26. info() {
    27. return this.isHot ? '炎热' : '凉爽'
    28. }
    29. },
    30. methods: {
    31. changeWeather() {
    32. this.isHot = !this.isHot
    33. }
    34. },
    35. watch: {
    36. number: {
    37. deep: true,
    38. handler() {
    39. console.log("number改变了")
    40. }
    41. },
    42. isHot: {
    43. //immediate:ture,//初始化时让handler调用一下
    44. handler(newValue, oldValue) {
    45. console.log("isHot被修改了", newValue, oldValue)
    46. }
    47. },
    48. }
    49. })
    50. script>
    51. body>

    运行结果

    监视的简写

    1. <body>
    2. <div id="root">
    3. <h2>今天天气{{info}}h2>
    4. <button @click="changeWeather">切换天气button>
    5. div>
    6. <script>
    7. Vue.config.productionTip = false
    8. const vm = new Vue({
    9. el: '#root',
    10. data() {
    11. return {
    12. isHot: true
    13. }
    14. },
    15. computed: {
    16. info() {
    17. return this.isHot ? '炎热' : '凉爽'
    18. }
    19. },
    20. methods: {
    21. changeWeather() {
    22. this.isHot = !this.isHot
    23. }
    24. },
    25. watch: {
    26. //正常写法
    27. // isHot: {
    28. // //immediate:ture,//初始化时让handler调用一下
    29. // handler(newValue, oldValue) {
    30. // console.log("isHot被修改了", newValue, oldValue)
    31. // }
    32. // }
    33. //简易写法
    34. //简写不能配置immediate和deep
    35. // isHot(newValue, oldValue) {
    36. // console.log('isHot被修改', newValue, oldValue)
    37. // }
    38. }
    39. })
    40. vm.$watch('isHot', {
    41. handler(newValue, oldValue) {
    42. console.log("SB", newValue, oldValue)
    43. }
    44. })
    45. script>
    46. body>

    compute和watch的区别

    computed和wantch之间的区别:

                1.computed能完成的任务,watch都能完成

                2.watch能完成的任务,computed不一定能完成,例如:watch可以进行异步操作(eg:setTimeout)

            ⭐两个重要的原则:

                1.所被Vue管理的函数,最好写成普通函数,这样this指向的才是vm和组件实例对象

                2.所有不被Vue所管理的函数(定时器的回调函数,ajax的回调函数等),最好写成箭头函数

                    这样this的指向才是vm 或者 组件实例对象

    1. <div id="root">
    2. 姓:<input type="text" v-model="firstName">
    3. <br>
    4. 名:<input type="text" v-model="lastName">
    5. <br>
    6. 姓名:<span>{{name}}span>
    7. div>
    8. <script>
    9. Vue.config.productionTip = false
    10. const vm = new Vue({
    11. el: '#root',
    12. data() {
    13. return {
    14. firstName: 'fan',
    15. lastName: 'xiyuan',
    16. name: 'fanxiyuan'
    17. }
    18. },
    19. watch: {
    20. firstName(newValue) {
    21. setTimeout(() => {
    22. this.name = newValue + this.lastName
    23. }, 1000)
    24. },
    25. lastName(newValue) {
    26. this.name = this.firstName + newValue
    27. }
    28. }
    29. })
    30. script>
    31. body>

  • 相关阅读:
    SQL6 查找学校是北大的学生信息
    java计算机毕业设计中医保健网站源码+系统+lw+数据库+调试运行
    Spring 02: 基于xml的Spring接管下的三层项目架构
    IDEA 使用技巧(快速生成list)
    MyBatis核心配置文件之typeAliases
    2024年csdn最新最全pytest系列——pytest-rerunfailures插件之测试用例失败重跑
    操作系统MIT6.S081:P7->Interrupts
    SICP:赋值和局部状态(Python实现)
    编程大师-Netty
    bootstrap 主题
  • 原文地址:https://blog.csdn.net/weixin_46637351/article/details/126071935