Vue中关于computed计算属性的妙用

 更新时间:2022年11月17日 09:43:28   作者:流转往复  
这篇文章主要介绍了Vue中关于computed计算属性的妙用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

computed

computed:相当于method,返回function内return的值赋值在html的DOM上。

但是多个{{}}使用了computed,computed内的function也只执行一次。

仅当function内涉及到Vue实例绑定的data的值的改变,function才会从新执行,并修改DOM上的内容。

computed和method的对比

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

这个是vue官网一直拿来作为例子的代码。在{{}}可以很方便的放入单个表达式,但是当一个HTML的DOM里面存在太多的表达式,程序会变得很笨重难于维护。

html

<div id="app9">
    9、method与computed的区别

    fullName

    {{fullName}}

    fullName2

    {{fullName}}

    fullNameMethod

    {{getFullName()}}

    fullNameMethod2

    {{getFullName()}}

</div>

js

var app9 = new Vue({
    el: '#app9',
    data: {
        firstName: 'Foo',
        lastName: 'Bar'
    },
    methods:{
        getFullName:function () {
            console.log("执行了methods")
            return this.firstName+" " +this.lastName;
        }
    },
    computed: {
        fullName: function () {
            console.log("执行了computed")
            return this.firstName + ' ' + this.lastName
        }
    }
})
setTimeout('app9.firstName="Foo2"',3000);

控制台输出的结果
执行了computed
执行了methods
执行了methods
执行了computed
执行了methods
执行了methods

由此可见使用computed,function只会执行一次。当Vue实例中绑定的data数据改变的时候,computed也相对应的只改变一次。

相同点:

  • 在以上代码中,两个p标签都会打印出同样被反转的Hello。

不同点:

  • 使用了methods的:HTML中,每一个调用了Vue的methods的方法,都需要执行一遍reversedMessage()这个方法;
  • 而使用computed计算属性的,只执行一遍将结果保存在缓存中。

computed和watch的对比

html

<div id="demo">{{ fullName }}</div>

js

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
    firstName: function (val) {
      this.fullName = val + ' ' + this.lastName
    },
    lastName: function (val) {
      this.fullName = this.firstName + ' ' + val
    }
  }
})
var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

watch可以监听数据的改变(不能监测数据内部的改变),但是如果使用不当就是多此一举了。

比如以上这个例子,使用watch监听firstName和lastName两个数据,其实就相当于computed,function内使用了Vue实例绑定的firstName和lastName。

setter

computed有getter属性也有setter属性,默认只有getter。

这个比较简单,贴个官网的代码就好了。

computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
vm.fullName = 'John Doe';//此时触发set函数

watch

比较适合watch的场景,监听input的输入

<div id="watch-example">
  <p>
    Ask a yes/no question:
    <input v-model="question">
  </p>
  <p>{{ answer }}</p>
</div>
<script src="https://unpkg.com/axios@0.12.0/dist/axios.min.js"></script>
<script src="https://unpkg.com/lodash@4.13.1/lodash.min.js"></script>
<script>
var watchExampleVM = new Vue({
  el: '#watch-example',
  data: {
    question: '',
    answer: 'I cannot give you an answer until you ask a question!'
  },
  watch: {
    // 如果 question 发生改变,这个函数就会运行
    question: function (newQuestion) {
      this.answer = 'Waiting for you to stop typing...'
      this.getAnswer()
    }
  },
  methods: {
    getAnswer: _.debounce(
      function () {
        if (this.question.indexOf('?') === -1) {
          this.answer = 'Questions usually contain a question mark. ;-)'
          return
        }
        this.answer = 'Thinking...'
        var vm = this
        axios.get('https://yesno.wtf/api')
          .then(function (response) {
            vm.answer = _.capitalize(response.data.answer)
          })
          .catch(function (error) {
            vm.answer = 'Error! Could not reach the API. ' + error
          })
      },
      // 这是我们为用户停止输入等待的毫秒数
      //_.debounce 0.5秒内刷新就不执行函数
      500
    )
  }
})
</script>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue 中的keep-alive实例代码

    vue 中的keep-alive实例代码

    这篇文章主要介绍了vue中的keep-alive实例代码,vue实现组件信息缓存的方法,在文中也给大家提到,需要的朋友可以参考下
    2018-07-07
  • vue下拉列表功能实例代码

    vue下拉列表功能实例代码

    这篇文章主要介绍了vue下拉列表功能实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • 解决Vue运行项目报错proxy error: could not proxy request

    解决Vue运行项目报错proxy error: could not proxy request

    这篇文章主要给大家介绍了关于如何解决Vue运行项目报错proxy error:could not proxy request的相关资料,Proxy Error指的是代理服务器无法正确处理请求的错误,需要的朋友可以参考下
    2023-08-08
  • 详解如何提高 webpack 构建 Vue 项目的速度

    详解如何提高 webpack 构建 Vue 项目的速度

    这篇文章主要介绍了详解如何提高 webpack 构建 Vue 项目的速度,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • vue基于Element按钮权限实现方案

    vue基于Element按钮权限实现方案

    这篇文章主要介绍了vue基于Element按钮权限实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • webpack4+Vue搭建自己的Vue-cli项目过程分享

    webpack4+Vue搭建自己的Vue-cli项目过程分享

    这篇文章主要介绍了webpack4+Vue搭建自己的Vue-cli,对于vue-cli的强大,使用过的人都知道,极大的帮助我们降低了vue的入门门槛,感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • vue+jquery+lodash实现滑动时顶部悬浮固定效果

    vue+jquery+lodash实现滑动时顶部悬浮固定效果

    这篇文章主要为大家详细介绍了vue+jquery+lodash实现滑动时顶部悬浮固定效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • Vue+SSM实现图片上传预览效果

    Vue+SSM实现图片上传预览效果

    这篇文章主要为大家详细介绍了Vue+SSM实现图片上传预览效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • vue3-print-nb实现页面打印(含分页打印)示例代码

    vue3-print-nb实现页面打印(含分页打印)示例代码

    大多数后台系统中都存在打印的需求,在有打印需求时,对前端来说当然是直接打印页面更容易,下面这篇文章主要给大家介绍了关于vue3-print-nb实现页面打印(含分页打印)的相关资料,需要的朋友可以参考下
    2024-01-01
  • vue中el表单的简单查询方法

    vue中el表单的简单查询方法

    本文主要介绍了vue中el表单的简单查询方法,主要包括表单页面根据groupid 、type 、errortype进行数据过滤,感兴趣的可以了解一下
    2023-10-10

最新评论