首先建立关系:父组件中做以下操作:

1、父组件中引入子组件

import Child from "@/components/Child.vue";

2、注册组件

<script>
import Child from "@/components/Child.vue";// 1、引入组件

export default {
    components:{
        Child// 2、注册组件
    },
    data(){
        return {}
    },
    created(){},
    methods:{}
}
</script>

3、将组件放到页面中

<template>
  <div>
    <Child></Child>// 子组件
  </div>
</template>

一、父子传参:

Parent.vue 向 Child.vue 传递参数(自定义属性)

1、在父组件中的子组件标签上自定义属性

<template>
  <div>
    <Child :nameStr="name_str"></Child>// 子组件
  </div>
</template>

<script>
export default {
    data(){
        return {
            name_str:'hhh'
        }
    }
}
</script>

2、然后子组件中用props接受 父组件的属性名

<template>
  <div>
     <div>{{nameStr}}</div>
  </div>
</template>

<script>
export default {
  props:['nameStr'],
  data(){
    return {
      
    }
  },
  created(){
    console.log(this.$props.nameStr);//hhh
  },
  methods:{

  }
}
</script>

<style>

</style>

补充内容:props如果是对象的话,格式如下:

props:{
    nameStr:{
      type:String,// 类型String、Number、Boolean、Array、Object、Date、Function、Symbol,
      //type:[String, Number],多个可能的类型可写为数组格式
      default:'zzz' // 默认值
      // 对象或数组默认值必须从一个工厂函数获取
      //default: function () {
      //  return { message: 'hello' }
      //},
      required: true, // 必填
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  },

注:父组件中-子组件标签不写属性,子组件显示默认值;

二、子父传参:

Child.vue 向 Parent.vue  传递参数(自定义事件,然后用$emit('自定义触发事件',传递参数)来进行参数的传递)

1、在父组件中的子组件标签上自定义事件

<template>
  <div>
    <Child @getColor="color_str"></Child> // 子组件
  </div>
</template>

2、在父组件中定义,事件的方法

<script>
import Child from "@/components/Child.vue";

export default {
    components:{
        Child
    },
    data(){
        return {}
    },
    created(){},
    methods:{
        //自定义事件
        color_str(data){
            console.log(data);// 接受子组件传递的参数
        }
    }

}
</script>

3、在子组件中写要传递的内容。(放在方法中,让它由某个按钮触发,从而向父组件传递数据)

<script>
export default {
  props:[],
  data(){
    return {}
  },
  created(){
    this.$emit('getColor','#ff1234') //参数:【事件触发器的名称(需要用引号包起来)】【要传递的参数】
  },
  methods:{}
}
</script>

4、此时子组件已成功向父组件发送了参数;

//父组件
methods:{
        //自定义事件
        color_str(data){
            // data是形参,用来接受子组件的参数
            console.log(data);// #ff1234
        }
}

 三、非父子传参:

借助eventBus($emit和$on的事件必须在一个公共的实例上,才能够触发。)

1、main.js里新加bus作为一个公共的实例,也可以在原型上挂载,也可以创建一个EventBus.vue,除了在原型挂载,都要在组件中引入公共的实例;

import Vue from 'vue'

Vue.prototype.$EventBus = new Vue();// 挂载到原型上

export var bus = new Vue();// 或者是导出变量

new Vue({
  render: h => h(App)
}).$mount('#app')

2、发送方组件(由事件触发,去执行发送操作)

<template>
  <div>
    <el-button size="mini" @click="toC1">向c1发送内容</el-button>
  </div>
</template>

<script>
import { bus } from "@/main.js"; // 引入公共的实例
export default {
    methods:{
        // 触发事件
        toC1(){
            let vv = 'sun'
            //this.$EventBus.$emit('hhhh',vv)
            bus.$emit('hhhh',vv)
        }
    }
    
}
</script>

3、接受方 接受参数

<script>
import { bus } from "@/main.js"; // 引入公共的实例
export default {
  data(){
    return {
      aa:''
    }
  },
  created(){
    //this.$EventBus.$on('hhhh',(bb)=>{
    //    this.aa=bb;
    //})
    bus.$on('hhhh',(bb)=>{
        //回调函数获取值
        this.aa=bb;
    })
  },
  methods:{}
}
</script>