vue实现子组件向父组件传递消息

首先在子组件中定义传递消息的button和一个属性data_send,然后定义传递函数

(核心就是    $emit('自定义事件')    函数)

methods:{
      //传递数据函数
      sendMsg(){
        this.data_send = "learn 传递的数据"
        //第一个参数表示父组件响应传递事件的函数,第二个参数是传递的数据
        this.$emit('getSon',this.data_send);
      }
    }

接下来在父组件中定义接收事件getSon

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <p>{{datafromson}}</p>
    <hr >
    <!-- 父传子 需要自定义事件getSon然后赋给实现getSonData-->
    <Learn @getSon='getSonData' :title='title' />
  </div>
</template>

接下来是getSonData的实现

  methods:{
    //一个参数用于传递子组件过来的数据
    getSonData(data){
      this.datafromson = data;
    }
  }

完整代码如下,两个组件Learn传递数据给App

Learn:

<template>
  <div id="0-1-0">
    <p>{{msg}}-{{title}}</p>
    <button @click='sendMsg' type="button">子传父</button>
  </div>

</template>

<script>
  export default {
    //name是名称,可写可不写
    name:'learn',
    //data是组件的所有字段定义和初始化,类似于构造函数
    data(){
      return {
        msg:'welcomen to my learn component',
        data_send:"",
      }
    },
    props:['title'],
    methods:{
      //传递数据函数
      sendMsg(){
        this.data_send = "learn 传递的数据"
        //第一个参数表示父组件响应传递事件的函数,第二个参数是传递的数据
        this.$emit('getSon',this.data_send);
      }
    }
  }
</script>

<!-- 使用scoped进行css隔离 -->
<style lang="css" scoped>
</style>
View Code

App:

<template>
  <div id="app">
    <img src="./assets/logo.png">
    <p>{{datafromson}}</p>
    <hr >
    <!-- 父传子 需要自定义事件getSon然后赋给实现getSonData-->
    <Learn @getSon='getSonData' :title='title' />
  </div>
</template>

<script>
//组件的使用分三步 1.import .vue扩展名可以省略 2.components 注册 3.标签化引用
import HelloWorld from './components/HelloWorld'
import VueDemo from './components/VueDemo'
import Learn from './components/Learn'

export default {
  name: 'App',
  components: {
    HelloWorld,
    VueDemo,
    Learn,
  },
  data(){
    return {
      title:'title from App.vue',
      datafromson:"",
    }
  },
  methods:{
    //一个参数用于传递子组件过来的数据
    getSonData(data){
      this.datafromson = data;
    }
  }
}
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
View Code