vue组件通信的方式

父组件向子组件通信

概念:父组件通过props向子组件传递数据,子组件通过props接收数据;

父组件

javascript 复制代码
<template>
  <div id="app">
    // 传递num/val的值
    <Child :num="num" :val="val" />
  </div>
</template>

<script>
// 引入组件子组件
import Child from './views/child.vue'

export default {
// 注册
  components:{
    Child
  },
  data() {
    return {
      num:0,
      val:'我是从父组件传递过来的东西'
    }
  }
}
</script>

<style lang="scss"></style>

子组件

javascript 复制代码
<template>
    <div>
        <h1>{{ num }}</h1>
        <h2>{{ val }}</h2>
    </div>
</template>

<script>
export default {
    // 接收数据指定它的类型
    props:{
        num:{
            // 类型可以是 Number | String | Boolean | Array | Object | Date | Symbol | Function
            type:Number,
            // 是否为必填项
            // required:true
        },
        val:{
            type:String,
            required:true
        }
    }
}
</script>

<style lang="scss"></style>

子组件向父组件通信

概念:子组件通过$emit触发一个自定义事件,父组件通过v-on监听该自定义事件,并在相应的方法中处理事件传递的数据。

父组件

javascript 复制代码
<template>
  <div id="app">
    <Child @addnum="addnum" />
  </div>
</template>

<script>
import Child from './views/child.vue'
export default {
  components: {
    Child
  },
  data() {
    return {
      num: 0,
    }
  },
  methods: {
    addnum(val) {
      this.num += val
    }
  }
}
</script>

<style lang="scss"></style>

子组件

javascript 复制代码
<template>
    <div>
        <button @click="addnum">点击我</button>
        {{ num }}
    </div>
</template>

<script>
export default {
    props: {
        num: {
            type: Number,
            // required: true
        }
    },
    methods: {
        addnum() {
            this.$emit('addnum', 5)
        }
    }
}
</script>

<style lang="scss"></style>

兄弟组件通信

eventBus事件总线适用于父子组件、非父子组件等之间的通信

概念:使用 eventBus ,其实就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。它的本质是通过创建一个空的 Vue 实例来作为消息传递的对象,通信的组件引入这个实例,通信的组件通过在这个实例上监听和触发事件,来实现消息的传递。

在main.js中配置eventBus

javascript 复制代码
// eventBus
Vue.prototype.eventBus=new Vue()

左组件

javascript 复制代码
<template>
  <div class="home">
    <h1>这里是左组件</h1>
    <button @click="send">点击试试看</button>
  </div>
</template>

<script>
export default {
  methods: {
    send() {
      this.eventBus.$emit('send', '这是来自左组件的数据')
    }
  }
}
</script>

<style lang="scss"></style>

右组件

javascript 复制代码
<template>
  <div>
    <h1>这里是右组件</h1>
    {{ val }}
  </div>
</template>

<script>
export default {
  data() {
    return {
      val: ''
    }
  },
  mounted() {
    this.eventBus.$on('send', val => {
      this.val = val
    })
  }
}

</script>

<style lang="scss"></style>

v-model

概念:通过v-model指令可以实现双向绑定,父组件可以通过v-model传递 数据给子组件,并且子组件可以通过修改v-model绑定的值来通知父组件。

父组件

javascript 复制代码
<template>
  <div id="app">
    <Child v-model="num"/>
  </div>
</template>

<script>
import Child from './views/child.vue'
export default {
  components: {
    Child
  },
  data() {
    return {
      num: 0,
    }
  },
  methods: {
  }
}
</script>

<style lang="scss"></style>

子组件

javascript 复制代码
<template>
    <div>
        <button @click="addnum2">点击我</button>
        {{ value }}
    </div>
</template>

<script>
export default {
    props: {
        // 在 vue2 中如果通过 v-model 进行组件传值,那么在子组件中只能通过 value 属性来进行接收
        value:{
            type:Number
        }
    },
    methods: {
        addnum2(){
            this.$emit('input',5)
        }
    }
}
</script>

<style lang="scss"></style>

.sync

概念:通过.sync修饰符可以简化子组件向父组件传递数据的过程

父组件

javascript 复制代码
<template>
  <div id="app">
    <Child :num.sync="num" @click="addnum3" />
  </div>
</template>

<script>
import Child from './views/child.vue'
export default {
  components: {
    Child
  },
  data() {
    return {
      num: 0,
    }
  },
  methods: {
 
  }
}
</script>

<style lang="scss"></style>

子组件

javascript 复制代码
<template>
    <div>
        <button @click="addnum3">点击我</button>
        {{ num }}
    </div>
</template>

<script>
export default {
    components: {

    },
    props: {
        num: {
            type: Number,
            // required: true
        }
    },
    methods: 
        addnum3(){
            this.$emit('update:num',10)
        }
    }
}
</script>

<style lang="scss"></style>
相关推荐
未来龙皇小蓝1 分钟前
RBAC前端架构-02:集成Vue Router、Vuex和Axios实现基本认证实现
前端·vue.js·架构
空白诗7 分钟前
高级进阶 React Native 鸿蒙跨平台开发:slider 滑块组件 - 进度条与评分系统
javascript·react native·react.js
晓得迷路了15 分钟前
栗子前端技术周刊第 116 期 - 2025 JS 状态调查结果、Babel 7.29.0、Vue Router 5...
前端·javascript·vue.js
How_doyou_do17 分钟前
执行上下文、作用域、闭包 patch
javascript
叫我一声阿雷吧22 分钟前
深入理解JavaScript作用域和闭包,解决变量访问问题
开发语言·javascript·ecmascript
淡忘_cx29 分钟前
使用Jenkins自动化部署vue项目(2.528.2版本)
vue.js·自动化·jenkins
iDao技术魔方42 分钟前
深入Vue 3响应式系统:为什么嵌套对象修改后界面不更新?
javascript·vue.js·ecmascript
历程里程碑1 小时前
普通数组-----除了自身以外数组的乘积
大数据·javascript·python·算法·elasticsearch·搜索引擎·flask
摸鱼的春哥1 小时前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
念念不忘 必有回响1 小时前
viepress:vue组件展示和源码功能
前端·javascript·vue.js