Vue 计算属性的问题

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

</head>

<body>

<div id="app"></div>

<template id="a">

<table>

<thead>

<th>序号</th>

<th>书籍名称</th>

<th>出版日期</th>

<th>价格</th>

<th>购买数量</th>

<th>操作</th>

</thead>

<tbody>

<tr v-for="(book,index) in fliterBooks">

<td>{{index+1}}</td>

<td>{{book.bookName}}</td>

<td>{{book.date}}</td>

<td>{{book.price}}</td>

<td>

<button :disabled="book.count<=1" @click="decrement(index)">-1</button>

<span>{{book.count}}</span>

<button @click="increment(index)">+1</button>

</td>

<td>

<button @click="removeBook(index)">删除</button>

</td>

</tr>

</tbody>

</table>

<h2>总价格:{{totalPrice}}</h2>

</template>

<script src="../vue3.js"></script>

<script>

Vue.createApp({

template:"#a",

data()

{

return {

books:[

{

bookName:"算法导论",

date:"2006-9",

price:85,

count:1

},

{

bookName:"编程艺术",

date:"2006-2",

price:59,

count:1

},

{

bookName:"编程珠玑",

date:"2008-10",

price:39,

count:1

},

{

bookName:"代码大全",

date:"2006-3",

price:128,

count:1

}

]

}

},

methods:{

decrement(index)

{

this.books[index].count--;

},

increment(index)

{

this.books[index].count++;

},

removeBook(index)

{

this.books.splice(index,1);

}

},

computed:{

totalPrice()

{

return this.books.reduce((pre,cur)=>

{

return pre+cur.price*cur.count;

},0);

},

fliterBooks()

{

return this.books.map(item=>{

const newItem=Object.assign({},item);

newItem.price="$"+item.price;

console.log(item);

return newItem;

});

}

}

}).mount("#app");

</script>

</body>

</html>

fliterBooks()

{

return this.books.map(item=>{

const newItem=Object.assign({},item);

newItem.price="$"+item.price;

console.log(item);

return newItem;

});

}

我就很奇怪,为什么<tr v-for="(book,index) in fliterBooks">
为什么这个计算属性,在button点击(+1 -1)的时候,数据也会发生改变,明明没有进入响应式。
totalPrice()引用的是books这个数组,可是点击的时候使用的是fliterBooks这个计算属性自己产生的对象,可是他也会发生改变,为什么啊?


回答:

官网的说明:Vue 计算属性的问题

你深度监听下books,会发现button点击(+1 -1)的时候都会被监听到的,你的computed设置了totalPrice和fliterBooks,Vue知道它们都依赖于books,所以会触发computed。


回答:

fliterBooks()和totalPrice()都是计算属性,他们也都依赖于this.books,当this.books发生变化时,计算属性也会跟着发生改变。

你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。

以上是 Vue 计算属性的问题 的全部内容, 来源链接: utcz.com/p/936376.html

回到顶部