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

Vue框架学习笔记——计算属性

文章目录

  • 前文提要
  • 代码需求描述
    • 插值语法实现
    • methods实现
  • 计算属性
      • getter执行时间:
      • setter
  • 计算属性简写形式(只读不改,才能如此简写)
  • slice截取元素,限制输入字符数量


前文提要

本人仅做个人学习记录,如有错误,请多包涵


代码需求描述

输入姓和名,能够将二者结合起来输出,姓和名之间使用’-'符号分隔

插值语法实现

<body>
  <div id="box">
    姓:<input type="text" placeholder="" v-model:value="firstName"><br/><br/>
    名:<input type="text" placeholder="" v-model:value="secondName"><br/><br/>
    姓名:{{firstName}}-{{secondName}}
  </div>
  <script type="text/javascript">
    Vue.config.productionTip = false
    const vm = new Vue({
      el: '#box',
      data: {
        firstName:'张',
        secondName:'三',
      }
    })
  </script>
</body>

其中v-model:value=可以简写为v-model=,也就是’:value’可以省略掉
实现效果如下:
在这里插入图片描述
在这里插入图片描述

methods实现

代码如下:

<body>
  <div id="box">
    姓:<input type="text" placeholder="" v-model:value="firstName"><br /><br />
    名:<input type="text" placeholder="" v-model:value="secondName"><br /><br />
    姓名:{{name()}}<br /><br />
    测试:<input type="text" placeholder="测试" v-model:value="nn"><br /><br />
  </div>
  <script type="text/javascript">
    Vue.config.productionTip = false
    const vm = new Vue({
      el: '#box',
      data: {
        firstName: '张',
        secondName: '三',
        nn:'yi'
      },
      methods: {
        name(){
          console.log(1)
          return this.firstName+'-'+this.secondName
        }
      }
    })
  </script>
</body>

methods中的函数会被添加到Vue实例中,因此可以直接在插值语法中调用。
data中的任何数据发生变化的时候,Vue的模版都会被重新解析,模版中含有methods中的name函数,methods不管函数返回值有没有变化,都会调用一次函数,因此会多次调用name函数。
所以每次查看和修改姓和名,都会调用一次该函数。
method中的函数,没有写成箭头函数,则可以从this指针这里访问Vue实例,Vue实例中因为数据代理添加了data中的数据,因此可以如此写。

呈现效果:
在这里插入图片描述

在这里插入图片描述

每在名中添加、删除一次字符,都会调用一次函数,在控制台输出一次1。

就算修改的不是和函数返回值有关的属性,也会调用函数
在这里插入图片描述

计算属性

将上文的代码修改为这样,使用计算属性computed也可以起到上文的效果,而且效率更高。

<body>
  <div id="box">
    姓:<input type="text" placeholder="" v-model:value="firstName"><br /><br />
    名:<input type="text" placeholder="" v-model:value="secondName"><br /><br />
    姓名:{{name_}}<br /><br />
    测试:<input type="text" placeholder="测试" v-model:value="nn"><br /><br />
  </div>
  <script type="text/javascript">
    Vue.config.productionTip = false
    const vm = new Vue({
      el: '#box',
      data: {
        firstName: '张',
        secondName: '三',
        nn:"yi"
      },
      methods: {
        name(){
          return this.firstName+'-'+this.secondName
        }
      },
      computed:{
        name_:{
          get(){
            console.log('调用了get')
            return this.firstName+'-'+this.secondName
          },
          set(value){
            console.log('调用了set')
            const arr=value.split('-')
            this.firstName=arr[0]
            this.secondName=arr[1]
          }
        }
      }
    })
  </script>
</body>

呈现效果:
在这里插入图片描述
代码解释:
computed中的属性不能和methods中的函数名一致,会出错。
set函数中无法直接通过firstName访问到data中的firstName,必须通过this指针锁定Vue实例,再进一步锁定firstName

计算属性中的属性是不存在的,是使用其他的属性计算出来的,这也是为什么叫做计算属性的原因。
原理:底层借助了Object.defineproperty提供的getter和setter。

getter执行时间:

(1)初次读取时,会执行一次。
(2)当依赖的数据被改变时会再次调用。

注意点:不要使用vm.data_.get()调用函数,这是错误的

和methods方法不同,当返回的数据没有发生变化的时候,methods是会继续执行一遍了,而computed内部含有缓存机制(复用),当没有触发get函数执行的时候,有用到该计算属性的时候,会直接从缓存中提取,效率更高,调试更加方便。

示例图片:
在这里插入图片描述
当你修改的属性,和计算属性中包含的属性全无关系的时候,就算整个模版被重新解析,methods中的函数重新执行,computed中的计算属性也只会执行最开始的那次(因为相关data属性没有发生变化)

setter

在这里插入图片描述
当你对计算属性进行更改的时候,会调用setter,而和计算属性有关的属性发生变化的时候,会触发调用get函数,因此控制台会如此输出

计算属性简写形式(只读不改,才能如此简写)

当你规定的计算属性只读不写,则可以通过修改上文代码,写成这样应用:

computed:{
  name_:function(){
      console.log('调用了get')
      return this.firstName+'-'+this.secondName
  }
}

注意:要求只读不写,别修改计算属性。
不过这还不是最简形式,还可以进一步简化:

computed:{
  name_(){
      console.log('调用了get')
      return this.firstName+'-'+this.secondName
  }
}

注意name_不是函数,依旧是属性。

slice截取元素,限制输入字符数量

可以将getter中的代码改为下述样式:

return this.firstName.slice(0,3)+'-'+this.secondName

从而限制字符个数,最少为0,最多3个

示例图片:
在这里插入图片描述
超过3个字符的无法记录到计算属性中。


至此,结束。

如果你觉得这篇文章写的不错,多多点赞~收藏吧!


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

相关文章:

  • 【MySQL从入门到放弃】InnoDB磁盘结构(一)
  • vue项目npm run serve出现【- Network: unavailable】(从排查到放弃)
  • 字节跳动核心技术:TT推荐系统从0-1落地应用
  • 探索 JNI - Rust 与 Java 互调实战
  • 一文了解珈和科技在农业遥感领域的服务内容和能力
  • 【时间之外】IT人求职和创业应知【34】-人和机器人,机器人更可靠
  • C++内存管理
  • 西南科技大学信号与系统A实验三(线性连续时间系统的分析)
  • 前后端分离前端请求后端接口的方式
  • 正向和反向代理区别
  • STM32 基础知识
  • 查看各ip下的连接数
  • 第一个php扩展开发的demo
  • 模拟实现offsetof宏(详解)
  • 第三方发起备份的ORA-00245问题
  • vue实现动态路由菜单!!!
  • 19. Python 数据处理之 Pandas
  • 奇葩问题:arp缓存与ip地址冲突(实际是ip地址被占用导致arp缓存出现问题)
  • ssh管理
  • Android12强制所有应用跟随gsensor旋转
  • 23.解释不同方式的自动装配,spring 自动装配 bean 有哪些方式?
  • 【带头学C++】----- 八、C++面向对象编程 ---- 8.10 函数的默认参数
  • Python基础语法之学习字符串快速格式化
  • C\C++:原子计数操作 之__syn_fetch_and_add性能研究
  • 前后端分离开发出现的跨域问题
  • 压缩字符串II