vue计算属性 初步使用案例

html 复制代码
<template>
  <div>
    <h1>购物车</h1>
    <div v-for="item in filteredItems" :key="item.id">
      <p>{{ item.name }} - {{ item.price }} 元</p>
      <input type="number" v-model.number="item.quantity" min="1" />
      <button @click="removeItem(item.id)">移除</button>
    </div>

    <div>
      <label>
        筛选价格(仅仅筛选单价):
        <select v-model="priceFilter">
          <option value="all">全部</option>
          <option value="under50">小于 50 元</option>
          <option value="50to100">50 - 100 元</option>
          <option value="above100">大于 100 元</option>
        </select>
      </label>
    </div>

    <h2>总价:{{ totalPrice }} 元</h2>
    <button @click="clearCart">清空购物车</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      cartItems: [
        { id: 1, name: "商品 A", price: 30, quantity: 1 },
        { id: 2, name: "商品 B", price: 60, quantity: 1 },
        { id: 3, name: "商品 C", price: 120, quantity: 1 },
      ],
      priceFilter: "all", // 筛选条件
    };
  },
  computed: {
    // 计算总价
    totalPrice() {
      return this.cartItems.reduce(
        (total, item) => total + item.price * item.quantity,
        0
      );
    },
    // 根据筛选条件过滤商品
    filteredItems() {
      if (this.priceFilter === "under50") {
        return this.cartItems.filter((item) => item.price < 50);
      } else if (this.priceFilter === "50to100") {
        return this.cartItems.filter(
          (item) => item.price >= 50 && item.price <= 100
        );
      } else if (this.priceFilter === "above100") {
        return this.cartItems.filter((item) => item.price > 100);
      } else {
        return this.cartItems;
      }
    },
  },
  methods: {
    // 移除商品
    removeItem(id) {
      this.cartItems = this.cartItems.filter((item) => item.id !== id);
    },
    // 清空购物车
    clearCart() {
      this.cartItems = [];
    },
  },
};
</script>

<style scoped>
h1,
h2 {
  color: #333;
}
button {
  margin-top: 10px;
}
</style>

效果展示

(本章节仅仅面向初步学习,页面简陋)

页面由下面代码决定

html 复制代码
<template>
  <div>
    <h1>购物车</h1>
    <div v-for="item in filteredItems" :key="item.id">
      <p>{{ item.name }} - {{ item.price }} 元</p>
      <input type="number" v-model.number="item.quantity" min="1" />
      <button @click="removeItem(item.id)">移除</button>
    </div>

    <div>
      <label>
        筛选价格(仅仅筛选单价):
        <select v-model="priceFilter">
          <option value="all">全部</option>
          <option value="under50">小于 50 元</option>
          <option value="50to100">50 - 100 元</option>
          <option value="above100">大于 100 元</option>
        </select>
      </label>
    </div>

    <h2>总价:{{ totalPrice }} 元</h2>
    <button @click="clearCart">清空购物车</button>
  </div>
</template>

其中 用v-for循环进行页面打印表单。

computed是计算属性,它与data同级代码块。

这个页面,由计算属性来操控。

我们的筛选板块,

用v-model对priceFilter进行了双向数据帮当,单选每一项的时候,会改变其值。

在我们的计算属性当中

会根据我们单项筛选,进行相应的页面展示,计算属性类似于函数,也有其返回值,返回值可以是个数组。

计算属性可以写多个 如同函数类似,

totalPrice()用于计算总价格

计算属性可用于插值表达式

相关推荐
爱上python的猴子6 分钟前
chrome中的copy xpath 与copy full xpath的区别
前端·chrome
Lysun0011 小时前
dispaly: inline-flex 和 display: flex 的区别
前端·javascript·css
山禾女鬼0011 小时前
Vue 3 自定义指令
前端·javascript·vue.js
麦麦大数据1 小时前
知识图谱中医知识问答系统|养生医案综合可视化系|推荐算法|vue+flask+neo4j+mysql
vue.js·知识图谱·推荐算法
啊卡无敌1 小时前
Vue 3 reactive 和 ref 区别及 失去响应性问题
前端·javascript·vue.js
北桥苏1 小时前
Spine动画教程:皮肤制作
前端
涵信1 小时前
第九节:React HooksReact 18+新特性-React 19的use钩子如何简化异步操作?
前端·javascript·react.js
Aaaaaaaaaaayou2 小时前
浅玩一下 Mobile Use
前端·llm
这个昵称也不能用吗?2 小时前
react-native搭建开发环境过程记录
前端·react native·cocoapods
hy_花花2 小时前
Vue3.4之defineModel的用法
前端·vue.js