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>
相关推荐
ohMyGod_1231 小时前
React16,17,18,19新特性更新对比
前端·javascript·react.js
前端小趴菜051 小时前
React-forwardRef-useImperativeHandle
前端·vue.js·react.js
@大迁世界1 小时前
第1章 React组件开发基础
前端·javascript·react.js·前端框架·ecmascript
Hilaku1 小时前
从一个实战项目,看懂 `new DataTransfer()` 的三大妙用
前端·javascript·jquery
爱分享的程序员1 小时前
前端面试专栏-算法篇:20. 贪心算法与动态规划入门
前端·javascript·node.js
我想说一句1 小时前
事件委托与合成事件:前端性能优化的"偷懒"艺术
前端·javascript
爱泡脚的鸡腿1 小时前
Web第二次笔记
前端·javascript
Dream耀1 小时前
React合成事件揭秘:高效事件处理的幕后机制
前端·javascript
P7Dreamer1 小时前
Vue 3 + Element Plus 实现可定制的动态表格列配置组件
前端·vue.js
洋流1 小时前
0基础进大厂,第12天:ES6语法基础篇
javascript