设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10693|回复: 0

Vue中的computed属性详解

[复制链接]

76

主题

0

回帖

240

积分

中级会员

Rank: 3Rank: 3

积分
240
发表于 2022-3-26 11:02:28 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录

今天来说说vue中的计算属性computed,为了更好的理解计算属性的好处,我们先通过一个案例来慢慢 了解计算属性,有如下案例:定义两个输入框以及一个span标签,span标签中的内容为两个输入框中的值,span标签中的内容随着输入框中的内容变化而变化

插值表达式

我们先用插值表达式的方法来实现这一效果
  1. <body>
  2.     <div id="app">
  3.         姓: <input type="text" v-model=firstName> </br>
  4.         </br>
  5.         名: <input type="text" v-model=lastName></br>
  6.         </br>
  7.         姓名: <span>{{firstName}}{{lastName}}</span>

  8.     </div>
  9. </body>
  10. <script type="text/javascript">
  11.     new Vue({
  12.         el: "#app",
  13.         data: {
  14.             firstName: '张',
  15.             lastName: '三'
  16.         },
  17.         methods: {
  18.         }
  19.     })

  20. </script>
复制代码

我们可以发现能简单实现我们所需要的效果,但是如果现在我想要添加另外的要求,当我输入的是英文的时候就将首字母大写,这个时候我们只能使用以下方法
  1. <body>
  2.     <div id="app">
  3.         firstName: <input type="text" v-model=firstName> </br>
  4.         </br>
  5.         lastName: <input type="text" v-model=lastName></br>
  6.         </br>
  7.         fullName: <span>{{firstName.replace(firstName[0],firstName[0].toUpperCase())}}   {{lastName.replace(lastName[0],lastName[0].toUpperCase())}}</span>

  8.     </div>
  9. </body>
  10. <script type="text/javascript">
  11.     var str = ''

  12.     new Vue({
  13.         el: "#app",
  14.         data: {
  15.             firstName: 'joe',
  16.             lastName: 'lili'
  17.         },
  18.         methods: {
  19.         }
  20.     })
  21. </script>
复制代码

从插值表达式所展现的情况来看虽然能实现想要的效果但是代码显得特别冗长不利于阅读,这个时候想到可以向methods中添加方法来实现这一效果。

methods

向methods添加fullName方法
  1. <body>
  2.     <div id="app">
  3.         firstName: <input type="text" v-model=firstName> </br>
  4.         </br>
  5.         lastName: <input type="text" v-model=lastName></br>
  6.         </br>
  7.         fullName: <span>{{fullName()}}</span>

  8.     </div>
  9. </body>
  10. <script type="text/javascript">
  11.     var str = ''

  12.     new Vue({
  13.         el: "#app",
  14.         data: {
  15.             firstName: 'joe',
  16.             lastName: 'lili'
  17.         },
  18.         methods: {
  19.             fullName() {
  20.                 let a = '';
  21.                 let b = '';
  22.                 if (this.firstName.length != 0)
  23.                     a = this.firstName.replace(this.firstName[0], this.firstName[0].toUpperCase())
  24.                 if (this.lastName.length != 0)
  25.                     b = this.lastName.replace(this.lastName[0], this.lastName[0].toUpperCase())
  26.                 return a + ' ' + b
  27.             }
  28.         }
  29.     })

  30. </script>
复制代码
我们可以看到通过方法就能很好的解决代码过于冗长的问题。但是又面临了另一个问题,我们在学习vue中的data属性时了解到,只要data中的数据发生变化,页面中用到data数据的地方就会进行更新,所以当data数据firstName与lastName一改变就会重新调用方法fullName,在一定情况下会导致代码效率低,另外,methods中的方法在插值表达式中使用了多少次就会运行多少次。根据以上两种方法的弊端出现了另一种方法,就是使用computed属性。

computed

在computed中可以定义一些属性:计算属性。计算属性的本质其实就是一个方法,只不过在使用的时候可以直接当做属性来使用。具体有以下特点

  • 计算属性在使用时不需要加(),直接写名称即可
  • 如果计算属性用到了data中的数据,当data数据发生变化时,就会立即重新计算这个计算属性的值
  • 计算属性在第一次使用时的结果会被缓存起来,直到属性中所依赖的data数据发生改变计算属性的结果才会重新求值
  1. <body>
  2.     <div id="app">
  3.         firstName: <input type="text" v-model=firstName> </br>
  4.         </br>
  5.         lastName: <input type="text" v-model=lastName></br>
  6.         </br>
  7.         fullName: <span>{{fullName}}</span></br>
  8.         </br>
  9.         fullName: <span>{{fullName}}</span></br>
  10.         </br>
  11.         fullName: <span>{{fullName}}</span>

  12.     </div>
  13. </body>
  14. <script type="text/javascript">
  15.     var str = ''

  16.     new Vue({
  17.         el: "#app",
  18.         data: {
  19.             firstName: 'joe',
  20.             lastName: 'lili'
  21.         },
  22.         computed: {
  23.             //get的作用?当读取fullName时,get就会被调用,且返回值就是fullName的值
  24.             //get什么时候被调用?1.当第一次读取fullName时。2.当所依赖的data数据发生变化时
  25.             fullName: {
  26.                 get() {
  27.                     console.log('hi,我调用了computed')
  28.                   let a = '';
  29.                 let b = '';
  30.                 if (this.firstName.length != 0)
  31.                     a = this.firstName.replace(this.firstName[0], this.firstName[0].toUpperCase())
  32.                 if (this.lastName.length != 0)
  33.                     b = this.lastName.replace(this.lastName[0], this.lastName[0].toUpperCase())
  34.                 return a + ' ' + b
  35.                 }
  36.             }
  37.         }
  38.     })
  39. </script>
  40. </html>
复制代码

在前面我们说过methods中的方法在页面中使用n次便会调用n次,而computed中的属性却不会出现上面的情况。上面代码中我们在页面中使用了同一计算属性3次却只输出了1次结果,同样使用methods中的full方法却输出了3次结果,意味着方法调用了3次。为什么会有这样的结果?这都是因为computed中有缓存机制而methods中并没有。在代码解析到第一个fullName时就会对fullName的结果进行缓存,而到第二个、第三个时会发现缓存中已经有了,那么就不会在对其进行调用。
对computed的使用有了大致的了解后, 我们再来对computed补充一下。
在computed我们可以通过给计算属性添加set方法达到赋值效果
  1. <body>
  2.     <div id="app">
  3.         firstName: <input type="text" v-model=firstName> </br>
  4.         </br>
  5.         lastName: <input type="text" v-model=lastName></br>
  6.         </br>
  7.         fullName: <span>{{fullName}}</span></br>
  8.         </br>
  9.     </div>
  10. </body>
  11. <script type="text/javascript">
  12.     var str = ''

  13.     var app = new Vue({
  14.         el: "#app",
  15.         data: {
  16.             firstName: 'joe',
  17.             lastName: 'lili'
  18.         },
  19.         computed: {
  20.             //get的作用?当读取fullName时,get就会被调用,且返回值就是fullName的值
  21.             //get什么时候被调用?1.当第一次读取fullName时。2.当所依赖的data数据发生变化时
  22.             fullName: {
  23.                 get() {
  24.                     console.log(this)
  25.                     return this.firstName + this.lastName
  26.                 },
  27.                 set(val) {
  28.                     this.firstName = val[0]
  29.                     this.lastName = val[1]
  30.                 }
  31.             }
  32.         }
  33.     })

  34. </script>
复制代码
我们可以看到当在控制台对fullName赋值时firstName以及lastName都会改变
如果计算属性中只有get没有set的话可以直接像下面代码这样写
  1. computed: {
  2.             fullName(){
  3.                 console.log(this)
  4.                 return this.firstName + this.lastName
  5.                 }
  6.             }
复制代码
总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表