FE_Vue学习笔记 - 计算属性 监视属性

news2024/11/16 11:41:27

1 计算属性

1.1 计算属性的引入

组件模板应该只包含简单的表达式,复杂的表达式则应该重构为计算属性或方法。复杂表达式会让你的模板变得不那么声明式。我们应该尽量描述应该出现的是什么,而非如何计算那个值。而且计算属性和方法使得代码可以重用。

<body>
<div id="name-methods">
    姓:<input type="text" v-model="firstName"><br/>
    名:<input type="text" v-model="secondName"><br/>
    全名:<span>{{firstName.slice(0,3)}}-{{secondName}} </span>
</div>
<script type="text/javascript">
    new Vue({
        el: '#name-methods',
        data() {
            return {
                firstName: 'zhao',
                secondName: 'shuai-lc'
            }
        },
        methods: {}
    })
</script>
</body>
</html>

抽象成如下方式更为合适:

<body>
<div id="name-methods">
    姓:<input type="text" v-model="firstName"><br/>
    名:<input type="text" v-model="secondName"><br/>
    全名:<span>{{ fullName() }}</span>
</div>
<script type="text/javascript">
    new Vue({
        el: '#name-methods',
        data() {
            return {
                firstName: 'zhao',
                secondName: 'shuai-lc@inspur.com'
            }
        },
        methods: {
            fullName() {
                return this.firstName + '-' + this.secondName
            }
        }
    })
</script>
</body>
</html>

1.2 计算属性的理解

  1. 定义:要用的属性不存在,要通过已有的属性计算得来。

  2. 原理:底层借助了Object.defineproperty方法提供的getter和setter。

  3. get函数什么时候执行?
    1)初次读取时会执行一次。
    2)当依赖的数据发生改变时会被再次调用。

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

  5. 备注:
    1)计算属性最终会出现在vm上,直接读取使用即可。
    2)如果计算属性要被修改,那必须直接写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。

<body>
<div id="name-calculate">
    姓:<input type="text" v-model="firstName"><br/>
    名:<input type="text" v-model="secondName"><br/>
    全名:<span>{{ fullName }}</span>
</div>
<script type="text/javascript">
    Vue.config.productionTip = false
    new Vue({
        el: '#name-calculate',
        data: {
            firstName: 'zhao',
            secondName: 'shuai-lc@inspur.com'
        },
        methods: {},
        computed: {
            fullName: {
                // 当有人读取fullName的时候调用get()
                // 1)初次读取时会执行一次。
                // 2)当依赖的数据发生改变时会被再次调用。
                get() {
                    return this.firstName + ' - ' + this.secondName
                },
                // 当有人修改fullName时候调用set()
                set(value) {
                    const list = value.split('-');
                    this.firstName = list[0]
                    this.secondName = list[1]
                }
            }
        }
    })

</script>
</body>
</html>

注意的是 :

  1. vm._data里面是没有计算属性的
    在这里插入图片描述
  2. 计算属性中get函数的this,Vue已经维护好了,并把getter中的this指向调成了vm。
  3. 书写多次fullName但是getter只用了一次,说明Vue有缓存。如果用上集methods方法,则书写几次方法就调用几次,显然有弊端。

1.3 计算属性简写

确定了只读,不可以修改,才能使用简写方式。

<body>
<div id="root">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{ fullName }}</span> <br/><br/>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false

    const vm = new Vue({
        el: '#root',
        data: {
            firstName: '张',
            lastName: '三'
        },
        computed: {
            // 简写
            fullName: function () {
                return this.firstName + '-' + this.lastName
            }
        }
    })
</script>
</body>
</html>

2 监视属性

2.1 监视属性

  1. 当被监视的属性变化时,回调函数自动调用,进行相关操作
  2. 监视的属性必须存在,才能进行监视!
  3. 监视的两种写法:
    1)new Vue时传入watch配置
    2)通过vm.$watch监视
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.1/vue.js"></script>
</head>
<body>
<div id="weather">
    <h1>今天天气很 - {{ info }}</h1>
    <button @click="changeWeather()">切换天气</button>
</div>

<script type="text/javascript">
    new Vue({
        el: '#weather',
        data: {
            judgeHot: true,
        },
        computed: {
            info() {
                return this.judgeHot ? '炎热' : '凉爽'
            }
        },
        methods: {
            changeWeather() {
                this.judgeHot = !this.judgeHot
            }
        },
        watch: {
            judgeHot: {
                // immediate:true, //初始化时让hander()调用一下, 默认为false
                immediate: false,
                // handler什么时候调用?当judgeHot发生改变时
                handler(newValue, oldValue) {
                    console.log('judgeHot 被修改了 ...', newValue, oldValue)
                }
            },

            info: {
                handler(newValue, oldValue) {
                    console.log('info 被修改了 ...', newValue, oldValue)
                }
            }
        }
    })
</script>

</body>
</html>

在这里插入图片描述

2.2 深度监视

  1. Vue中的watch默认不监测对象内部值得改变(一层)。
  2. 配置deep:true可以监测对象内部值改变(多层)。

备注:

  1. Vue自身可以监测对象内部值得改变,但Vue提供得watch默认不可以!
  2. 使用watch时根据数据得具体结构,决定是否采用深度监视。默认不开启是为了提升效率
<body>
<div id="weather">
    <h3>a的值是:{{ numbers.a }}</h3>
    <button @click="autoIncrement()">点我让a+1</button>
</div>

<script type="text/javascript">
    let vm = new Vue({
        el: '#weather',
        data: {
            numbers: {
                a: 1,
                b: 2
            }
        },
        computed: {},
        methods: {
            autoIncrement() {
                return this.numbers.a++
            }
        },
        watch: {
            // 监视多级结构中某个属性的变化
            'numbers.a': {
                handler() {
                    console.log('a has changed ...')
                }
            }
        }
    })

</script>

</body>
</html>

在这里插入图片描述


<body>
<div id="weather">
    <h3>a的值是:{{ numbers.a }}</h3>
    <button @click="autoIncrementA()">点我让a+1</button>
    <h3>b的值是:{{ numbers.b }}</h3>
    <button @click="autoIncrementB()">点我让b+1</button>
    <br/><br/>
</div>

<script type="text/javascript">
    let vm = new Vue({
        el: '#weather',
        data: {
            numbers: {
                a: 1,
                b: 2
            }
        },
        computed: {},
        methods: {
            autoIncrementA() {
                return this.numbers.a++
            },
            autoIncrementB() {
                return this.numbers.b++
            }
        },
        watch: {
            // 监视多级结构中所有属性的变化
            numbers: {
                deep: true,
                handler() {
                    console.log('numbers has changed ...')
                }
            }
        }
    })

</script>

</body>
</html>

2.3 监视的简写形式

简写的前提是,如果不需要immediate、deep等的配置项,即配置项中只有handler的时候才可以简写。

<body>
<div id="root111">
    <h2>今天天气很{{ info }}</h2>
    <button @click="changeWeather">切换天气</button>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false

    const vm = new Vue({
        el: '#root111',
        data: {
            isHot: true
        },
        computed: {
            info() {
                return this.isHot ? '炎热' : '凉爽'
            }
        },
        methods: {
            changeWeather() {
                this.isHot = !this.isHot
            }
        },
        watch: {
            /*isHot:{
                handler(newValue,oldValue){
                    console.log('isHot被修改了',newValue,oldValue)
                }
            }*/

            isHot(newValue, oldValue) {
                console.log('isHot被修改了', newValue, oldValue)
            }
        }
    })

    vm.$watch('isHot', {
        handler(newValue, oldValue) {
            console.log('isHot 被修改了 ...', newValue, oldValue)
        }
    })
    //vm.$watch简写
    vm.$watch('isHot', function (newValue, oldValue) {
        console.log('isHot被修改了', newValue, oldValue)
    })
</script>
</body>
</html>

3 watch对比computed

两者都能实现的时候,选用computed比较简单,需要异步计算等比较复杂实现的时候用watch。computed和watch之间的区别:

  1. computed能完成的功能,watch都可以完成。
  2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。
    两个重要的小原则:
  3. 所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象。
  4. 所有不被Vue所管理的函数(定时器的回调函数、Ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象。
<body>
<div id="watch-name">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{ fullName }}</span>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false
    let vm = new Vue({
        el: '#watch-name',
        data: {
            firstName: 'zhao',
            lastName: 'shuai-lc@inspur.com',
            fullName: 'zhao#shuai-lc@inspur.com'
        },
        watch: {
            firstName(newValue, oldValue) {
                this.fullName = newValue + '#' + this.lastName
            },
            lastName(newValue, oldValue) {
                this.fullName = this.firstName + '#' + newValue
            }
        }
    })
</script>
</body>
</html>

在这里插入图片描述

<body>
<div id="watch-name">
    姓:<input type="text" v-model="firstName"> <br/><br/>
    名:<input type="text" v-model="lastName"> <br/><br/>
    全名:<span>{{ fullName }}</span>
</div>

<script type="text/javascript">
    Vue.config.productionTip = false
    let vm = new Vue({
        el: '#watch-name',
        data: {
            firstName: 'zhao',
            lastName: 'shuai-lc@inspur.com',
            fullName: 'zhao#shuai-lc@inspur.com'
        },
        watch: {
            firstName(val) {
                setTimeout(() => {
                    console.log(this) // vue
                    this.fullName = val + '-' + this.lastName
                }, 1000)

                setTimeout(function () {
                    console.log(this) // window
                    this.fullName = val + '-' + this.lastName
                }, 1000)

            },
            lastName(val) {
                this.fullName = this.firstName + '-' + val
            }
        }
    })
</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文解读|MetaAI图像分割基础模型SAM——解锁数字大脑“视觉区”

原创 | 文 BFT机器人 内容提要 事件背景: 2023年4月5日&#xff0c;MetaAI研究团队发布论文“分割一切”一《Segment Anything》并在官网发布了图像分割基础模型一Segment Anything Model(SAM)以及图像注释数据集Segment-Anything 1-Billion(SA-1B)。 论文核心观点 : 目…

数据库安全+触发器与存储过程

数据库安全触发器与存储过程 目录 数据库安全触发器与存储过程选择题填空题简答题1、建立city值为上海、北京的顾客视图题目代码题解 2、建立城市为上海的客户2016年的订单信息视图题目代码题解 3、创建触发器&#xff0c;当更改商品价格(price列)时&#xff0c;记录价格题目代…

【网络安全】——区块链安全和共识机制

区块链安全和共识机制 摘要&#xff1a;区块链技术作为一种分布式去中心化的技术&#xff0c;在无需第三方的情况下&#xff0c;使得未建立信任的交易双方可以达成交易。因此&#xff0c;区块链技术近年来也在金融&#xff0c;医疗&#xff0c;能源等多个行业得到了快速发展。然…

Medical Image Analyse

NC2022: Federated learning enables big data for rare cancer boundary detection 尽管机器学习&#xff08;ML&#xff09;在各个学科领域都显示出了潜力&#xff0c;但样本外泛化仍然令人担忧。目前通过共享多个站点的数据来解决这个问题&#xff0c;但由于各种限制&#…

内网渗透之linuxwindows密码读取haschcat破解sshrdp

0x00 说明 微软为了防止明文密码泄露发布了补丁KB2871997&#xff0c;关闭了Wdigest功能。 当系统为win10或2012R2以上时&#xff0c;默认在内存缓存中禁止保存明文密码&#xff0c;此时可以通过修改注册表的方式抓取明文&#xff0c;但需要用户重新登录后才能成功抓取。 wind…

知识变现海哥:知识变现的本质就是卖

知识变现的本质就是卖&#xff0c;而有人买的本质&#xff0c;就是你解决了某方面的需求。 好的成交&#xff0c;从来都是相互的&#xff0c; 只靠一边主动推销来维系是远远不够的。 绝对不是靠忽悠&#xff0c;而是靠实力。 先讲一个故事。 19世纪时&#xff0c;一个年轻的…

IOS开发指南之UITableView控件使用

1.创建一个IOS单页应用 2.双击Main.storyboard然后拖放UITableView到视图中 3.添加TableViewCell 成功添加Table View Cell 4.修改Table View Cell属性 选中Table View Cell 在右边的Image栏输入default.png回车 到此布局设计完成,现在运行还是显示 空白,要在代码中做相关的实…

B.【机器学习实践系列二】数据挖掘-二手车价格交易预测(含EDA探索、特征工程、特征优化、模型融合等)

【机器学习入门与实践】入门必看系列&#xff0c;含数据挖掘项目实战&#xff1a;数据融合、特征优化、特征降维、探索性分析等&#xff0c;实战带你掌握机器学习数据挖掘 专栏详细介绍&#xff1a;【机器学习入门与实践】合集入门必看系列&#xff0c;含数据挖掘项目实战&…

Spellman高压电源X射线发生器维修XRB160PN480X4593

spellman高压发生器维修VMX40P5X4629&#xff1b;Spellman X射线发生器维修X4593系列 X射线源维修。 Spellman所拥有的变频器架构可以使高压电源获得高利用率的效率和功率密度。固体密封的高压模块进一步减少了尺寸和重量。 基于表面贴装控制电路的数字信号处理器提供通讯接口…

2023,谁还在花钱减肥?

【潮汐商业评论/原创】 “这是益生菌、酵素、0蔗糖酸奶&#xff0c;促进肠胃蠕动的&#xff1b;这是蒟蒻果冻、魔芋零食&#xff0c;嘴馋占嘴用的&#xff1b;这是全麦面包&#xff0c;饱腹感强&#xff0c;不易发胖&#xff1b;这是我刚办的健身卡&#xff1b;这是……”Lily…

【Qt编程之Widgets模块】-007:QTextStream类及QDataStream类

1 概述 QTextStream和QDataStream都是对流进行操作 QTextStream只能普通类型的流操作像QChar、QString、int…&#xff0c;其实就很类似我们c或者c中读写文件的感觉&#xff0c; QDataStream就厉害了&#xff0c;无论是QTextStream的普通类型的流操作还是一些特殊类型的流操作…

设计模式之【外观/门面模式】,不打开这扇门永远不知道门后有多少东西

文章目录 一、什么是外观模式&#xff08;门面模式&#xff09;1、外观模式的结构2、使用场景3、外观模式的优缺点4、外观模式注意事项 二、实例1、外观模式的通用写法2、智能家居案例3、积分换礼品案例 参考资料 一、什么是外观模式&#xff08;门面模式&#xff09; 外观模式…

yoloV5项目工程源码解读(2)(未完成)

概述 将主要从三个部分对源码进行解读。 数据层面&#xff0c;dataloader 和 数据增强网络模型&#xff0c;模型细节和逻辑模型训练&#xff0c;训练策略等 数据源解读 utils 中有&#xff0c;在train.py中能跳到该函数。 train.py中 # Trainloader 创建dataloader就是我们…

网络安全工程师辛苦吗?

“人生如寄&#xff0c;何事辛苦怨斜晖”&#xff0c;意思是人活着就像寄生在这个世界上&#xff0c;为什么一定要劳碌奔波&#xff0c;最后还抱怨人生苦短呢&#xff1f; 但说到辛苦二字&#xff0c;什么工作不辛苦呢&#xff1f;除了体制内的一些工作稍微轻松一些&#xff0c…

打家劫舍问题

题目&#xff1a; 打家劫舍https://leetcode.cn/problems/house-robber/ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上…

重写Properties类,实现对properties文件的有序读写,数据追加,解决中文乱码

前言 *.properties文件&#xff0c;是 Java 支持的一种配置文件类型&#xff0c;并且 Java 提供了 properties 类来读取 properties 文件中的信息。文件中以键值对 "键值"的形式&#xff0c;存储工程中会多次重复使用的配置信息&#xff0c;通过“Properties”类来读…

【Mysql实战】使用存储过程和计算同比环比

背景 同环比&#xff0c;是基本的数据分析方法。在各类调研表中屡见不鲜&#xff0c;如果人工向前追溯统计数据&#xff0c;可想而知工作量是非常大的。 标题复制10行&#xff0c;并且每行大于10个字符【源码解析】SpringBoot接口参数【Mysql实战】使用存储过程和计算同比环比…

超全总结:硬件设计基础60条

硬件是一个非常复杂的系统&#xff0c;在设计过程中都会遇到或多或少的问题&#xff0c;本文中总结了非常基础的60个问题&#xff0c;供大家参考。 1、请说明一下滤波磁珠和滤波电感的区别。 磁珠由导线穿过铁氧体组成&#xff0c;直流电阻很小&#xff0c;在低频时阻抗也很小…

数字化转型,目的是为了转型还是数字化?

受第四次工业革命浪潮的影响&#xff0c;传统工业经济社会快速向数字经济转型过渡&#xff0c;企业创新面临的经济环境发生根本性变革。数字技术广泛应用于生产、交换、消费等经济环节&#xff0c;为企业产品创新、服务创新以及数字化开放式创新提供了动力源泉。数字经济背景下…

如何利用生产管理系统提高粉末治金工业的生产调度能力

在粉末冶金工业中&#xff0c;生产管理系统的应用已经成为了一个必不可少的部分。生产管理系统可以帮助企业实现自动化、信息化、智能化的生产&#xff0c;提高生产效率、降低生产成本、提高产品质量。生产管理系统可以对生产流程进行全面的监控和管理&#xff0c;从而实现生产…