【Vue】学习笔记-组件传值的数据累加器

【Vue】学习笔记-组件传值的数据累加器

前言

组件传值的数据累加器可以分为三个部分
App.vue为父级组件

Carts.vue表示购物车

Counter.vue表示计数器

父级组件

实现页面的组件传值主要思路为:父组件引入可视化的购物车组件(Carts.vue),而购物车组件数量的变化又依赖于计数器组件的值。因此,在编写累加器(Counter.vue)时,应该父组件(App.vue)中导入购物车组件然后购物车组件在编写的时候导入累加器(Counter.vue)组件。因此父组件引入购物车组件的代码如下:

<template>
  <div>
    <carts></carts>
  </div>
</template>

<script>

import Carts from './components/Carts.vue';
export default {
  components:{Carts},
  data(){
    return{
      
    }
  }
};
</script>

购物车组件

购物车组件以无序列表(ul)和列表元素(li)构成,在显示列表时运用 v-for绑定fruits集合中的各个元素。因为购物车组件在使用时需要累加器组件的配合,因此需要导入(Counter.vue)引入数量的加法和减法。购物车的代码如下

<template>
  <div>
      <h1>购物车</h1>
      <ul>
          <li v-for="(v,i) of fruits" :key="i" >
              {{v.name}}
              单价:{{v.price}}
              <counter  :qu="v.qu" :index="i" @add="add" @sub="sub" ></counter>
          </li>
      </ul>
  </div>
</template>

<script>
import Counter from "./Counter.vue"
export default {
    components:{Counter},
    data() {
        return {
        fruits:[
        {name:"苹果",price:3.14,qu:0},
        {name:"鸭梨",price:2.14,qu:0},
        {name:"香蕉",price:3.20,qu:0},
      ]
        }
    },
    methods: {
        add(index){
            this.fruits[index].qu++
        },
        sub(index){
            if(this.fruits[index].qu>0){
                this.fruits[index].qu--
            }
            
        }
    },
}
</script>

计数器组件

累加器组件获取购物车组件的qu水果数量和index水果的索引,当点击sub的减法按钮和add的加法按钮时,触发sub()和add()方法通过$emit中(传送的事件,传送的数据)将信息传送给购物车组件,购物车组件通过调用sub,add和index来改变每一次按钮点击以后组件显示的值
累加器的代码如下:

<template>
    <span>
        <button @click="sub">-</button>
        <span>{{qu}}</span>
        <button @click="add">+</button>
    </span>
</template>

<script>

export default {
    props:["qu","index"],
    methods: {
        sub(){
            this.$emit("sub",this.index)
        },
        add(){
            this.$emit("add",this.index)
        }
    },
}
</script>

常见错误总结

当点击按钮时,按钮中间的数值没有发生变化,检查语法但是没有报错

在这里插入图片描述

主要原因:v-bind(:)用来绑定事件,而v-on(@)用来绑定事件,add和sub均为绑定事件应该用(@)而不是(:)来绑定
在这里插入图片描述

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue组件中,v-model可以用于实现子组件与父组件之间的双向数据绑定。具体的传值过程如下: 1. 在子组件中,使用props来定义需要接收的value参数。例如props: { value: [String, Object] }。 2. 在子组件中,使用watch来深度监听value的变化。可以设置immediate为true,以便在初始化时立即改变监听的值。例如watch: { value: { handler: function(val, oldVal) { this.videoForm.showVideoPath = val; }, deep: true, immediate: true } }。 3. 子组件中的某个事件(例如上传成功的回调函数)需要通过$emit("input", 值)来将值传递给父组件的v-model。例如this.$emit("input", res.url)。 在父组件中,使用v-model来绑定子组件的值。例如<video-upload v-model="form.videoDz" />。 总结起来,v-model传值的过程包括在子组件中定义props来接收value参数,在watch中监听value的变化,并通过$emit("input", 值)来将值传递给父组件的v-model。在父组件中使用v-model来绑定子组件的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue——父子组件通过v-model传值和显示](https://blog.csdn.net/weixin_42247720/article/details/127650801)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue父子组件v-model传值](https://blog.csdn.net/libinemail/article/details/123826501)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值