vue学习笔记(七)——购物车案例及开发中的一些心得体会

一、props属性定义以及一些细节应用

1.1 props的2种定义方式

        props: [] - 只声明变量, 不能类型校验

        props: {} - 声明变量和校验类型规则 - 不对则报错

父组件定义属性

<MyHeader backgroundColor="red" title="购物车案例" textColor="#FFF"></MyHeader>

子组件接收父组件传的值

props: {
    backgroundColor: String, // 外部传入此变量的值必须为字符串类型,否则报错
    title: {
      type: String,
      required: true // 必须传入此变量的值,否则会报错
    },
    textColor: {
      default: '#fff', // 约束 textColor 的默认值,如果不传递值,则为默认值
      type: String // textColor 的值的类型必须是字符串类型
    }
  }

1.2 父组件向子组件传递一个对象的注意问题

当父组件向子组件传递了一个商品对象时

<MyGoods v-for="item in list" :key="item.id" :good="item"></MyGoods>
[
    {
        "goods_id": 1,
        "goods_name": "低帮城市休闲户外鞋天然牛皮COOLMAX纤维",
        "goods_price": 128,
        "goods_count": 2,
        "goods_img": "https://yanxuan-item.nosdn.127.net/3a56a913e687dc2279473e325ea770a9.jpg",
        "goods_state": true
    },
    {
        "goods_id": 2,
        "goods_name": "网易味央黑猪猪肘330g*1袋",
        "goods_price": 39,
        "goods_count": 10,
        "goods_img": "https://yanxuan-item.nosdn.127.net/d0a56474a8443cf6abd5afc539aa2476.jpg",
        "goods_state": true
    },
    {
        "goods_id": 3,
        "goods_name": "KENROLL男女简洁多彩一片式室外拖",
        "goods_price": 128,
        "goods_count": 2,
        "goods_img": "https://yanxuan-item.nosdn.127.net/eb1556fcc59e2fd98d9b0bc201dd4409.jpg",
        "goods_state": false
    },
    {
        "goods_id": 4,
        "goods_name": "21春季新品,儿童时尚圆领卫衣1-8岁",
        "goods_price": 85,
        "goods_count": 4,
        "goods_img": "https://yanxuan-item.nosdn.127.net/fa21cced568eb41f9b0be3a098bd3f31.jpg",
        "goods_state": false
    },
    {
        "goods_id": 5,
        "goods_name": "去皮去刺,辅食好选择,比目鱼纯肉250g",
        "goods_price": 43,
        "goods_count": 1,
        "goods_img": "https://yanxuan-item.nosdn.127.net/011f3c5062a6318187be711ca4214cb1.jpg",
        "goods_state": false
    }
]

        此时,子组件中需要使用 v-model 对父组件传递过来的数组中的每一个商品信息的goods_state 与子组件复选框进行双向绑定,但是属性值 props 是只读属性,不可修改,会报错。

解决方案:

        在子组件中本地 data 中定义一个变量用于接收父组件传递过来的属性值,之后使用 data 中定义的变量进行 v-model 双向绑定。因为传递过来的是一个对象,good 和 localGood 指向同一片内存空间,所以在 data 中 localGood 里的 goods_state 改变也会导致传递过来的 good 中的 goods_state 进行改变。

1.3 侦听器深度侦听

侦听器,侦听新值和旧值的变化,所以 handler 函数中的形参为 newVal 和 oldVal

watch: {
    goodItem: {
      deep: true,
      immediate: true,
      handler (newVal, oldVal) {
        this.good.goods_count = newVal.goods_count
      }
    }
  }

1.4 计算属性(全选与反选的理解)

computed: {
    isAll: {
      // 设置一个值, 需要接受一个值,接收的值为 v-model 双向绑定的值
      set (isChecked) {
        console.log(isChecked)
        this.goodsList.forEach(item => {
          item.goods_state = isChecked
        })
      },
      // 获取值,需要返回一个值,返回的值为 是否选中 的值
      // every() 方法测试一个数组内的所有元素是否都能通过指定函数的测试。它返回一个布尔值。
      get () {
        return this.goodsList.every(item => {
          return item.goods_state === true
        })
      }
 }

1.5 数组的reduce方法累加应用

computed: {
    num () {
      return this.goodsList.reduce((prev, item) => {
        // prev 累计值
        if (item.goods_state) {
          prev += item.goods_count
        }
        return prev
      }, 0)
    },
    allPrice () {
      return this.goodsList.reduce((prev, item) => {
        if (item.goods_state) {
          prev += item.goods_count * item.goods_price
        }
        return prev
      }, 0)
    }
}

1.6 props 自定义校验规则

props对某个变量配置validator选项函数,返回true通过,返回false失败
父组件传入商品列表 tabList
子组件校验 arr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是一个AI语言模型,无法提供代码示例。但是,我可以简要介绍如何使用Vue3和Vuex实现购物车功能。 首先,需要在Vue3项目安装Vuex。可以使用以下命令: ```bash npm install vuex ``` 然后,在src目录下创建一个store.js文件来存储Vuex store实例。在store.js文件,需要导入Vue3和Vuex,并创建一个新的store实例。 ```javascript import { createStore } from 'vuex' const store = createStore({ state: { cart: [] }, mutations: { addToCart(state, item) { state.cart.push(item) }, removeFromCart(state, index) { state.cart.splice(index, 1) } }, getters: { cartTotal(state) { return state.cart.reduce((total, item) => total + item.price, 0) } } }) export default store ``` 在上面的代码,我们定义了一个状态对象state,其包含一个名为cart的数组。我们还定义了两个mutation,一个用于将商品添加到购物车,另一个用于从购物车删除商品。最后,我们定义了一个getter,用于计算购物车商品的总价值。 在Vue3项目,可以通过以下方式将store实例传递给根组件: ```javascript import { createApp } from 'vue' import App from './App.vue' import store from './store' createApp(App).use(store).mount('#app') ``` 现在,我们已经将store实例传递给了根组件,可以在组件使用Vuex的状态管理功能。例如,在组件添加商品到购物车的代码可以如下所示: ```javascript <button @click="addToCart(item)">Add to Cart</button> ... methods: { addToCart(item) { this.$store.commit('addToCart', item) } } ``` 在上面的代码,我们将addToCart方法映射到一个按钮的点击事件上。当用户点击按钮时,我们将商品对象作为参数传递给addToCart方法,并使用commit方法将该操作提交给store。Vuex会在store执行addToCart mutation,并将商品对象添加到cart数组。 同样,我们可以使用Vuex的getter来计算购物车商品的总价值: ```javascript <template> <div> <p>Cart Total: {{ cartTotal }}</p> </div> </template> <script> export default { computed: { cartTotal() { return this.$store.getters.cartTotal } } } </script> ``` 在上面的代码,我们使用computed属性将cartTotal getter映射到组件的模板。当cart数组的商品数量发生变化时,cartTotal getter会重新计算购物车商品的总价值,并将其更新到模板。 以上是使用Vue3和Vuex实现购物车功能的基本流程,具体实现方式可能因项目而异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值