一、计算属性的基本使用
- 计算属性:一个特殊属性,值依赖于另外一些数据动态计算出来。
- 🚩🚩🚩计算属性特点:函数内使用的变量改变,重新计算结果返回。
- 💣💣💣注意:
①、计算属性必须定义在computed节点中。
②、计算属性必须是一个function,计算属性必须有返回值。
③、计算属性不能被当当作方法调用,要作为属性来使用。
computed:{
"计算属性名"(){
return "值"
}
}
<template>
<div>
<p>和为:{{ num }}</p>
</div>
</template>
- 计算属性也是属性, 所以不要和data里重名, 用起来也和data类似
(一)全选反选案例
<template>
<div>
<span>全选:</span>
<input type="checkbox" v-model="ck" />
<ul>
<li>
<input type="checkbox" />
<span>名字</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
arr: [
{
name: "猪八戒",
c: false,
},
{
name: "孙悟空",
c: false,
},
{
name: "唐僧",
c: false,
},
{
name: "白龙马",
c: false,
},
],
};
},
};
</script>
<style>
</style>
<template>
<div>
<span>全选:</span>
<input type="checkbox" v-model="ck" />
<ul>
<li v-for="(item,i) in arr" :key="i">
<input type="checkbox" v-model="item.c"/>
<span>{{item.name}}</span>
</li>
</ul>
</div>
</template>
📢📢📢(1)小选决定大选,大选被小选算计出来
方法一 —— forEach循环
<template>
<div>
<span>全选:</span>
<input type="checkbox" :checked="bigCk" />
<ul>
<li v-for="(item, i) in arr" :key="i">
<input type="checkbox" v-model="item.c" />
<span>{{ item.name }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
arr: [
{
name: "猪八戒",
c: true,
},
{
name: "孙悟空",
c: false,
},
{
name: "唐僧",
c: false,
},
{
name: "白龙马",
c: false,
},
],
};
},
computed:{
bigCk(){
let key;
let num=0;
this.arr.forEach(item =>{
if(item.c==true){
num++;
}
});
if(num==this.arr.length){
key = true;
}else{
key = false;
}
return key;
}
},
};
</script>
方法二 —— every方法
①、【计算属性的简单写法】
- 🤔🤔🤔every()方法是数组对象的一个方法,它用于检测数组中的所有元素是否都满足某个条件,如果所有元素都满足条件,则返回true,否则返回false。
ck(){
return this.arr.every(item => item.c==true)
}
②、【完整写法】
ck:{
get(){
return this.arr.every(item => item.c==true);
}
}
📢📢📢(2)全选算计小选
<template>
<div>
<span>全选:</span>
<input type="checkbox" v-model="ck" />
<ul>
<li v-for="(item, i) in arr" :key="i">
<input type="checkbox" v-model="item.c" />
<span>{{ item.name }}</span>
</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
arr: [
{
name: "猪八戒",
c: true,
},
{
name: "孙悟空",
c: false,
},
{
name: "唐僧",
c: false,
},
{
name: "白龙马",
c: false,
},
],
};
},
computed:{
ck:{
get(){
return this.arr.every(item => item.c==true);
},
set(val){
this.arr.forEach(item =>item.c=val);
}
}
},
};
</script>
- 🔔🔔🔔注意:
什么时候用计算属性:
①、简单写法:发现某个值,被算计出来!!
②、完整写法:除了被算计,还要算计别人!!
(二)计算属性的设置问题—完整写法
- ✅✅✅计算属性默认情况下只能获取,不能修改。
- ✅✅✅要给计算属性赋值,就必须写计算属性的完整写法!!
computed:{
full:{
get(){
...
},
set(value){
...
}
}
}
- 💭💭💭什么时候用计算属性完整写法? 给计算属性变量赋值时。
(三)不用计算属性,用函数调用能实现吗?计算属性优势在哪里?
📢📢📢(1)计算属性的缓存说明
- 🍂🍂🍂计算属性,基于依赖项的值进行缓存,依赖的变量不变,都直接从缓存取结果。
- 计算属性如果被多次使用,性能极高。
<template>
<div>
<ul>
<li v-for="(item,i) in list" :key="i"> {{ item }}</li>
</ul>
<h1>总分由方法调用:{{ zf() }}</h1>
<h1>总分由方法调用:{{ zf() }}</h1>
<h1>总分由方法调用:{{ zf() }}</h1>
<h1>总分由计算属性:{{ jszf }}</h1>
<h1>总分由计算属性:{{ jszf }}</h1>
<h1>总分由计算属性:{{ jszf }}</h1>
</div>
</template>
<script>
export default {
data(){
return{
list:[88,99,100]
}
},
methods:{
zf(){
console.log("方法调用")
return this.list.reduce((sum,item) => sum+=item,0);
}
},
computed:{
jszf(){
console.log("计算属性")
return this.list.reduce((sum,item) => sum+=item,0);
}
}
}
</script>
📢📢📢(2)优势
- 🍗🍗🍗计算属性特点?
①、计算后会立刻缓存,下次直接读缓存
②、依赖项改变, 函数会重新执行 并 重新缓存 - 多次使用计算属性,性能会极高