Vue父子组件传值与非父子传值

vue-cli创建项目,直接上码————

1-4父传字,5-8子传父

子组件

<template>
  <div id="app">
    <p>子组件</p>
    <p>子组件:{{msg2}}</p>
    <p>接收父组件传值{{gozi}}</p>
    <!-- ⑤.子组件定义事件触发(@ 是 v-on简写) -->
    <button @click="gofu">传给父组件</button>
  </div>
</template>

<script>
export default {
  name: 'Child',
  data () {
    return {
      msg2: 50,
      msg3: '子组件传给父组件--30'
    }
  },
  // ④.子组件通过props属性接收父组件传过来的值,Number为判断传值的类型
  // 注:并且这是单向数据流,即当父组件的值改变时,传到子组件的值也会改变,反过来不行
  props: {
    gozi: Number
  },
  methods: {
    gofu () {
      // ⑥.通过$emit方法传数据给父组件
      // gofus是组件名,父组件要用gefus方法接收传值,this.msg3是传给父组件的数据
      this.$emit('gofus', this.msg3)
    }
  }
}
</script>

父组件

<template>
  <div id="app">
    <p>父组件</p>
    <p>父组件:{{msg}}</p>
    <!-- ③.引用Child组件 用v-bind(简写 :)绑定子组件并将下面data内msg的值传到子组件-->
    <!-- ⑦. gofus是子组件提交的事件,getzi是父组件定义方法 -->
    <Child :gozi="msg" @gofus="getzi"></Child>
  </div>
</template>

<script>
// ①.引入子组件
import Child from './zi'
export default {
  name: 'App',
  data () {
    return {
      msg: 6
    }
  },
  // ②.注册组件
  components: {
    Child
  },
  methods: {
    // ⑧.得到子组件传过来的值
    getzi (event) {
      console.log(event)
    }
  }
}
</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>

非父子传值

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./vue.js"></script>
</head>
<body>
    <!-- 先看官方介绍:
    $on( event, callback )
    监听当前实例上的自定义事件。事件可以由vm.$emit触发。回调函数会接收所有传入事件触发函数的额外参数。
    $emit
    它是一个触发当前实例上的事件。附加参数都会传给监听器回调。 
    PS: 共用同一个Vue的实例( new Vue() ),通过此实例进行事件传递参数,在其他组件中监听此事件并且接收参数实现通信。-->

    <div id="app">
        <sister></sister>
        <brother></brother>
    </div>

    <script>
        var bus = new Vue()  //空的实例,中央事件总线

        Vue.component("sister", {
            template:`<div>
                qq邮箱订阅<input type="text" ref="mytext">
                <button @click="lssued">发了</button>
            </div>`,
            methods: {
                // 定义lssued方法,将数据传递出去(前者是传递出去的事件,后者是数据)
                lssued () {
                    bus.$emit("message", this.$refs.mytext.value)
                }
            }
        })

        Vue.component("brother", {
            template:`<div>
                订阅者
            </div>`,
            mounted() {
                // 监听事件并接受数据
                bus.$on("message", (data) => {
                    console.log("收到订阅的内容",data)
                })
                console.log("当前组件的dom创建完之后就自动执行该方法")
            }
        })

        var vm = new Vue({
            el:"#app"
        })
    </script>
</body>
</html>

最后,拜拜~~记得推荐

原文地址:https://www.cnblogs.com/wangxiaomo/p/12587293.html