zoukankan      html  css  js  c++  java
  • Vue组件通信(父传子、子传父、兄弟通信)

    一.父组件传到子组件

    父组件是通过props属性给子组件通信的

    1 . 父组件parent.vue代码如下:

     <template>
       <div class="parent">
         <h2>{{ msg }}</h2>
         <son :fa-msg="msg"></son> <!-- 子组件绑定faMsg变量,注意驼峰-->
     </div>
     </template>
     <script>
     import son from './Son' //引入子组件
     export default {
       name: 'HelloWorld',
       data () {
         return {
           msg: '父组件',
         }
       },
       components:{son},
     }
     </script>
    
    

    2 . 子组件son代码如下:

     <template>
       <div class="son">
         <p>{{ sonMsg }}</p>
         <p>子组件接收到内容:{{ faMsg }}</p>
       </div>
     </template>
     <script>
     export default {
       name: "son",
       data(){
         return {
           sonMsg:'子组件',
         }
       },
       props:['faMsg'],//接收psMsg值
     }
    </script>
    
    

    子组件通过props来接受数据

    第一种方法

    props: ['childCom']
    
    

    第二种方法

    props: {
        childCom: String //这里指定了字符串类型,如果类型不一致会警告的哦
    }
    
    

    第三种方法

    props: {
        childCom: {
            type: String,
            default: 'sichaoyun' 
        }
    }
    
    

    二.子组件向父组件传值

    通过绑定事件然后及$emit传值

    vue2.0只允许单向数据传递,我们通过出发事件来改变组件的数据

    1.父组件parent代码如下:

    父组件通过绑定自定义事件,接受子组件传递过来的参数

     <template>
       <div class="parent">
         <h2>{{ msg }}</h2>
         <p>父组件接手到的内容:{{ username }}</p>
         <son psMsg="我是你爸爸" @transfer="getUser"></son> 
          <!-- 监听子组件触发的transfer事件,然后调用getUser方法 -->
       </div>
     </template>
     <script>
     import son from './Son'
     export default {
       name: 'HelloWorld',
       data () {
         return {
           msg: '父组件',
           username:'',
         }
       },
       components:{son},
       methods:{
         getUser(msg){
           this.username= msg
         }
       }
     }
     </script>
    

    2.子组件son代码如下:

    子组件通过$emit触发父组件上的自定义事件,发送参数

     <template>
       <div class="son">
         <p>{{ sonMsg }}</p>
         <p>子组件接收到内容:{{ psMsg }}</p>
         <!--<input type="text" v-model="user" @change="setUser">-->
         <button @click="setUser">传值</button>
       </div>
     </template>
     <script>
     export default {
       name: "son",
       data(){
         return {
           sonMsg:'子组件',
           user:'子传父的内容'
         }
       },
       props:['psMsg'],
       methods:{
         setUser:function(){
           this.$emit('transfer',this.user)//触发transfer方法,this.user 为向父组件传递的数据
         }
       }
     }
     </script>
    
    

    3. 非父子传参 (事件总线)

    假设你有两个Vue组件需要通信: A 和 B ,A组件按钮上面绑定了点击事件,发送一则消息,B组件接收。

    1. 初始化,全局创建$bus
      直接在项目中的 main.js 初始化 $bus :
    // main.js
    window.$bus=new Vue();
    
    

    注意,这种方式初始化一个 全局的事件总线 。
    2. 发送事件
    $bus.$emit("aMsg", '来自A页面的消息');

    <!-- A.vue -->
    <template>
       <button @click="sendMsg()">-</button>
    </template>
    
    <script> 
    //import $bus from "../bus.js";
    export default {
     methods: {
       sendMsg() {
         $bus.$emit("aMsg", '来自A页面的消息');
       }
     }
    }; 
    </script>
    
    

    接下来,我们需要在 B页面 中接收这则消息。
    4. 接收事件
    $bus.$on("事件名",callback)

    <!-- IncrementCount.vue -->
    <template>
     <p>{{msg}}</p>
    </template>
    
    <script> 
    //import $bus  from "../bus.js";
    export default {
     data(){
       return {
         msg: ''
       }
     },
     mounted() {
       $bus.$on("aMsg", (msg) => {
         // A发送来的消息
         this.msg = msg;
       });
     }
    };
    </script>
    
    

    <<<<<<<<<<<<<<下方是拓展,面试不必说>>>>>>>>>>>

    事件总线推荐下面写法:

    集中式的事件中间件就是 Bus。我习惯将bus定义到全局:
    app.js

    
    var eventBus = {
        install(Vue,options) {
            Vue.prototype.$bus = vue
        }
    };
    Vue.use(eventBus);
    
    

    然后在组件中,可以使用$emit, $on, $off 分别来分发、监听、取消监听事件:
    分发事件的组件

    // ...
    methods: {
      todo: function () {
        this.$bus.$emit('todoSth', params);  //params是传递的参数
        //...
      }
    }
    
    

    监听的组件

    // ...
    created() {
      this.$bus.$on('todoSth', (params) => {  //获取传递的参数并进行操作
          //todo something
      })
    },
    // 最好在组件销毁前
    // 清除事件监听
    beforeDestroy () {
      this.$bus.$off('todoSth');
    }
    
    

    如果需要监听多个组件,只需要更改 bus 的 eventName:

    // ...
    created() {
      this.$bus.$on('firstTodo', this.firstTodo);
      this.$bus.$on('secondTodo', this.secondTodo);
    },
    // 清除事件监听
    beforeDestroy () {
      this.$bus.$off('firstTodo', this.firstTodo);
      this.$bus.$off('secondTodo', this.secondTodo);
    }
    
    
  • 相关阅读:
    在页面中控制媒体流的起播点和播放长度
    缓冲区数据转换为字符串输出
    编程中注意的一个问题
    一个整合SQL语句的类
    注意服务器系统日期对防病毒软件的影响
    网络病毒源的排查(2005年3月22日维护记录)
    升级到 Microsoft .NET >Visual Basic 6.0 控件和 .NET 控件的区别
    修改您的站点设计以改善下载体验
    下一版本Windows&reg; CE 开发工具Smart Device Extensions for Microsoft Visual Studio&reg; .NET
    WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
  • 原文地址:https://www.cnblogs.com/luckyjiu9/p/13812812.html
Copyright © 2011-2022 走看看