Vue计算属性和侦听器

本文详细介绍了Vue.js中计算属性和侦听器的概念及其使用。计算属性用于根据响应式依赖自动缓存计算结果,减少不必要的计算;而侦听器则在数据变化时执行自定义操作,尤其适用于异步任务。文中通过示例展示了如何创建计算属性,包括带有setter的情况,并对比了计算属性与方法的区别。同时,提到了在何时使用计算属性和侦听器的判断标准。
摘要由CSDN通过智能技术生成

计算属性

一个嵌套数组对象

Vue.createApp({
   data(){
      retrun {
         author:{
            name: 'John Doe',
            books:[
              'dddddd',
              'ssssss',
              'gggggg'
            ]
         }
      }
   }
})

根据author来显示不同的消息

<div id = 'computed-basics'>
   <p>已出版的书籍</p>
   <span>{{  author.books.length >0 ? 'Yes': 'No'}}</span>
</div>

此时执行的计算取决于author.books

但如果多次包含此计算,则问题会变得更糟

所以,对于复杂逻辑,你都应该使用计算属性

基本例子

<div id = "computed-basics">
    <p>已出版的书籍</p>
    <span>
        {{publishedBooksMessage}}
    </span>
</div>
Vue.createApp({
  data() {
    return {
      author: {
        name: 'John Doe',
        books: [
          'Vue 2 - Advanced Guide',
          'Vue 3 - Basic Guide',
          'Vue 4 - The Mystery'
        ]
      }
    }
  },
  computed: {
    // 计算属性的 getter
    publishedBooksMessage() {
      // `this` 指向 vm 实例
      return this.author.books.length > 0 ? 'Yes' : 'No'
    }
  }
}).mount('#computed-basics')

这里声明了一个计算属性publishedBooksMessage

计算属性缓存vs方法

上例,通过在表达式中调用方法也可以达到同样的效果

<p> {{calculateBooksMessage}}</p>
//在组件中
methods:{
    calculateBooksMessage(){
          retrun this.author.books.length>0 ? 'Yes':'NO'
    }
}

同样的函数定义为方法,而不是一个计算属性

从最终结果来看,实现方法是完全相同的

不同的是计算属性将基于它们的响应依赖关系缓存

计算属性只会在相关响应式依赖发生改变时,才会重新计算

意味着author。books没有发生改变,多次访问publishedBooksMessage时计算属性会立即返回之前的计算结果

不必再次执行函数

这也同样意味着下面的计算属性永远不会更新,因为Date.now()不是响应式依赖

computed:{
    now(){
       return Date.now()
    }
}

为什么需要缓存呢?

假设一个性能开销比较大的计算属性list,遍历数组需要大量计算

其他的计算属性依赖于list

如果没有缓存的话,需要大量的开销

计算属性的Setter

计算属性默认只有一个getter,不过在需要时也可以提供一个setter

<div id="computed-basics">
    <!--    直接写入计算属性中的对象,将会显示get()方法返回的值。-->
    <h1>{{ fullName }}</h1>
</div>
 
<script>
    Vue.createApp({
        data() {
            return {
                firstName: "约翰",
                lastName: "史密斯"
            }
        },
        computed: {
            fullName: {
                // getter
                get() {
                    return this.firstName + ' ' + this.lastName
                },
                // setter
                set(newValue) {
                    const names = newValue.split(' ')
                    this.firstName = names[0]
                    this.lastName = names[names.length - 1]
                }
            }
        }
    }).mount('#computed-basics')
</script>

现在再运行 vm.fullName = 'John Doe'

setter 会被调用,vm.firstNamevm.lastName 也会相应地被更新。

侦听器

虽然计算属性在大多数情况下更合适

但有时也需要一个自定义的侦听器

Vue通过watch选项提供了一个更通用的方法,来响应数据的变化

当需要在数据变化时执行异步或开销较大的操作时,这个方法是最有用的

<div id ="wathc-example">
    <p>
        询问一个yes/no问题:
      <input v-model="question"/>
    </p>
    <p>{{answer}}</p>
</div>
<!-- 因为 AJAX 库和通用工具的生态已经相当丰富,Vue 核心代码没有重复 -->
<!-- 提供这些功能以保持精简。这也可以让你自由选择自己更熟悉的工具。 -->

<script>
    //创建Vue,返回应用实例
    const watchExampleVm = Vue.createApp({
        data(){
            retrun {
                question:'', //问题
                answer:'问题通常包含一个问号' //问题
            }
        },
        watch:{//侦听器
            //只要问题发生变化,这个函数就会发生变化
            question(newQuestion,oldQuestion){
                //判断问题是否包含?,如果有则调用getAnswer()函数
                if(newQuestion.indexOf('?')>-1){
                    this.getAnswer()
                }
            }
        },
        methods:{//获取问题相应答案的函数
         getAnswer() {
                this.answer = 'Thinking...' // 没获取到答案之前先显示 思考中...
                axios   // 异步请求,去题库中寻找答案
                    .get('https://yesno.wtf/api')
                    .then(response => {
                        this.answer = response.data.answer
                    })
                    .catch(error => {
                        this.answer = 'Error! Could not reach the API. ' + error
                    })
            }
        }
    })
</script>.mount('#watch-example')

使用watch选项允许执行异步操作(访问一个API

并设置一个执行该操作的条件

还可以使用命令式vm.$watch API

计算属性vs侦听器

观察和响应当前活动的实例上的数据变动:侦听属性

当有一些数据需要随着其它数据变动而变动时

通常更好的做法是使用计算属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值