Vue3中的计算属性的详细讲解

1.相关介绍

  computedwatch都是vue框架中的用于监听数据变化的属性,都能在数据改变时,针对改变的相关数据做成相应的变化。有点像敌人行动我也行动

2.computed的介绍

<div class="NameBox">
  <span>姓</span><input type="text" v-model="allName.userName1">
  <span>名</span><input type="text" v-model="allName.userName2">
</div>
<div>我的名字是:{{userName}},我的年龄是:{{allName.age}}</div>

const allName = reactive({
  userName1:'张',   //姓
  userName2:'三',   //名
  age:0,            //年龄
})

const userName = computed(()=>{
 //allName.age++
 //addCount()
  return allName.userName1 + allName.userName2
})

上诉代码其实就是很简单的相关例子,通过用户输入的姓和名,来计算出用户的完整的姓名,但是其实完成上面的这一功能其实也并不是只能计算属性才能完成,我们也可以通过定义一个方法也可以实现,如下

<template>
  <div class="NameBox">
    <span>姓</span><input type="text" v-model="allName.userName1">
    <span>名</span><input type="text" v-model="allName.userName2">
  </div>
  <!-- <div>我的名字是:{{userName}},我的年龄是:{{allName.age}}</div> -->
    <!-- const userAllName = function(){ -->
  <div>{{userAllName()}}</div>
</template>   

const userAllName = function(){
  return allName.userName1 + allName.userName2
}

但是为什么我们更偏向于使用计算属性来解决,而不是使用方法来解决呢?原因是计算属性是基于缓存来实现的,无论你后端调用十次还是几百次,只要计算属性依赖的相关值没有发生变化,那计算属性就可以通过缓存读取。我们可以通过下面这个简单的例子来标明,计算属性的优越性。我们可以通过多次调用这两种方法,然后进行查看比较

<!--下面是通过方法得出的名字-->
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>
  <div>{{userAllName()}}</div>

<!--下面是通过计算属性得出的名字-->
  <div>{{userName}}</div>
  <div>{{userName}}</div>
  <div>{{userName}}</div>
  <div>{{userName}}</div>
  <div>{{userName}}</div>
  <div>{{userName}}</div>
  <div>{{userName}}</div>
  <div>{{userName}}</div>

const allName = reactive({
  userName1:'张',  //姓
  userName2:'三',   //名
  age:0,
})


const userName = computed(()=>{
  console.log("我是计算属性调用的");
  return allName.userName1 + allName.userName2
})

const userAllName = function(){
  console.log("我是方法调用的");
  return allName.userName1 + allName.userName2
}

从上面对应的浏览器中打印的我们可以看出,方法和计算属性调用了八次,但是与方法不一样的是,计算属性就打印了一次,就好像就第一次调用了这个函数一样,后面就没调用了。这就是计算属性的缓存,只要其依赖的值不发生相关的变化,那么无论你计算属性调用了好多次,但最终就只是执行一次。 

   const userName = computed(()=>{
      console.log("我是计算属性调用的");
      allName.age++
      addCount()
      return allName.userName1 + allName.userName2
   })

然后就是计算属性里不建议进行相关的赋值操作,虽然这样项目不会无法运行,但仍然不建议这么使用。因为计算属性的存在就是方便我们在根据某一个值变化时,进行相关的操作。如果执意想在计算属性中进行赋值等相关操作,我们可以在计算属性中调用相关的方法,如上图所示,但根据之前所说的,即使你调用了方法,但方法也只是执行一次。下次读取的时候也是进入相关缓存。 

const userName = computed({
  get(){
    return allName.userName1 + allName.userName2
  },
  set(value){
    var firstName = value.substring(0,2)
    var secondName = value.substring(2,8)
    allName.userName1 = firstName
    allName.userName2 =secondName
  }
})

其实平常我们所用的计算属性都是简写,都是默认的使用computed中的get函数,但是在有些时候我们也难免会在计算属性中修改值,这时候我们的计算属性就不能简写了,需要详细写明set和get方法,其中get函数有一个返回值,该返回值就是计算属性的值,set函数会有一个参数值,该值就是一个(计算属性被修改之后的值)。但是在通常情况下,我们用的更多的还是简写形式,即只采用其中的get返回的这个计算属性的值。且在计算属性中无法处理异步请求。

上述就是大致对计算属性的相关阐述和了解,后续会有监视等相关的知识点发布

Vue计算属性(computed)是一种能够基于现有的响应式数据进行计算属性。它们本质上是一个函数,但是可以像普通属性一样在模板中使用。计算属性的值会根据它的依赖(响应式数据)自动进行更新,只要依赖数据发生变化,计算属性就会重新计算计算属性的定义方式如下: ```javascript computed: { propertyName: function() { // 计算逻辑 return value; } } ``` 其中,propertyName 是计算属性的名称,function 是计算属性的定义。在这个函数中,你可以编写任何逻辑来计算属性的值,并在最后使用 return 语句返回计算结果。 在模板中使用计算属性的方式与使用普通属性类似。例如,如果有一个计算属性 fullName,我们可以在模板中像这样使用它: ```html <p>{{ fullName }}</p> ``` 当 fullName 的依赖数据发生变化时,Vue 会自动更新模板中的 fullName 值。 计算属性还有一些特殊的特性: 1. 缓存:计算属性默认是带有缓存的,也就是说,只要依赖数据没有发生变化,多次访问计算属性会立即返回之前的计算结果,而不会重新计算。这是因为 Vue 内部会追踪依赖,并在依赖发生变化时才重新计算计算属性的值。 2. Setter:除了 getter 函数,计算属性还可以定义一个 setter 函数,用于处理对计算属性的赋值操作。setter 函数接收新的值作为参数,并可以根据需要对其他相关的响应式数据进行更新。 下面是一个使用计算属性的示例: ```html <template> <div> <input v-model="firstName"> <input v-model="lastName"> <p>{{ fullName }}</p> </div> </template> <script> export default { data() { return { firstName: &#39;&#39;, lastName: &#39;&#39; }; }, computed: { fullName: { get() { return this.firstName + &#39; &#39; + this.lastName; }, set(value) { const [firstName, lastName] = value.split(&#39; &#39;); this.firstName = firstName; this.lastName = lastName; } } } }; </script> ``` 在上面的示例中,我们定义了两个输入框用于输入 firstName 和 lastName。计算属性 fullName 通过 get 函数返回 firstName 和 lastName 的拼接结果。同时,我们也定义了一个 set 函数,用于根据传入的新值更新 firstName 和 lastName 的值。 通过这样的方式,我们可以在模板中双向绑定计算属性 fullName,并且在输入框中输入 fullName 的值时,会自动更新 firstName 和 lastName 的值。 希望这个详细讲解对你有帮助!如果还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值