Vue2.0 实战项目(五) 组件间通信的方法

Vue组件之间通信分为三种情况:父组件向子组件通信、子组件向父组件通信、兄弟组件间通信。

一.父组件向子组件通信

通过props可以将值传递给子组件

<!-- 父组件 --><template>
  <div id="app">
    <!-- 父子组件间通信 -->
    <child :message="toChildMsg"></child>
  </div>
</template>

<script type="text/ecmascript-6">
  import childfrom ‘./components/child/child.vue‘;

  export default {
    data() {
      return {
        toChildMsg: ‘将我传给子组件‘,
      };
    },
    components: {
      child
    }
  };
</script>
<!-- 子组件 -->
<template>
  <div id="child">
    <h1>子组件</h1>
    <p>{{message}}</p>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    props: [‘message‘]
  };
</script>

二.子组件向父组件通信

通过某种事件,自定义$emit通信给父组件

 1 <!-- 父组件 -->
 2 <template>
 3   <div id="app">
 4     <!-- 父子组件间通信 -->
 5     <child @listenToChildMsg="takeMsg"></child>
 6   </div>
 7 </template>
 8
 9 <script type="text/ecmascript-6">
10   import child from ‘./components/child/child.vue‘;
11
12   export default {
13     components: {
14       child
15     },
16     methods: {
17       takeMsg: function (data) {
18         this.msgData = data;
19       }
20     }
21   };
22 </script>
<!-- 子组件 -->
<template>
  <div id="child">
    <h1>子组件</h1>
    <div @click="sendMsgToParent">点击传值给父组件</div>
  </div>
</template>

<script type="text/ecmascript-6">
  export default {
    methods: {
      sendMsgToParent: function () {
        this.$emit(‘listenToChildMsg‘, ‘将我传给父组件‘);
      }
    }
  };
</script>

三.兄弟组件间通信

兄弟组件间通信有两种方式。如果通信不复杂的话可以使用event-bus方法,如果比较复杂可以使用vuex。

event-bus方法是新建一个空白组件,通过此组件达到通信的目的。

<!-- bus组件 -->
<template>

</template>

<script type="text/ecmascript-6">
  import Vue from ‘vue‘;
  export default new Vue();
</script>

<style lang="stylus" rel="stylesheet/stylus">

</style>
<!-- foo组件 -->
<template>
  <div>
    <h1>the count of foo is {{fooCount}}</h1>
    <button @click="addBar()">点击</button>
  </div>
</template>

<script type="text/ecmascript-6">
  import eventBus from ‘../bus/bus.vue‘;

  export default{
    methods: {
      addBar: function () {
        eventBus.$emit(‘addBar‘);
      }
    },
    data() {
      return {
        fooCount: 0
      };
    },
    mounted: function () {
      eventBus.$on(‘addFoo‘, function (num) {
        this.fooCount += num;
      }.bind(this));
    }
  };
</script>

<style lang="stylus" rel="stylesheet/stylus">

</style>
<!-- bar组件 -->
<template>
  <div>
    <h1>the count of bar is {{barCount}}</h1>
    <button @click="addFoo()">点击</button>
  </div>
</template>

<script type="text/ecmascript-6">
  import eventBus from ‘../bus/bus.vue‘;

  export default{
    methods: {
      addFoo: function () {
        eventBus.$emit(‘addFoo‘, 2);
      }
    },
    data() {
      return {
        barCount: 0
      };
    },
    mounted: function () {
      eventBus.$on(‘addBar‘, function () {
        this.barCount++;
      }.bind(this));
    }
  };
</script>

<style lang="stylus" rel="stylesheet/stylus">

</style>
<!-- App.vue -->
<template>
  <div id="app">
    <!-- 非父子组件间传值 -->
    <bar></bar>
    <br />
    <foo></foo>
  </div>
</template>

<script type="text/ecmascript-6">
  import foo from ‘./components/foo/foo.vue‘;
  import bar from ‘./components/bar/bar.vue‘;

  export default {
    components: {
      foo,
      bar
    }
  };
</script>

<style lang="stylus" rel="stylesheet/stylus">

</style>

通过vuex管理各组件间通信

<template>
 <div id="app">
    <p>{{count}}
        <button @click="inc">+</button>
        <button @click="dec">-</button>
    </p>
 </div>
</template>

<script type="text/ecmascript-6">
const store = new Vuex.Store({
        state: {
            count: 0
        },
        mutations: {
            inc: state => state.count++,
            dec: state => state.count--
       }
});

 export default {
    el: ‘#app‘,
    computed: {
        count() {
            return store.state.count;
        }
    },
    methods: {
        inc() {
            store.commit(‘inc‘);
        },
        dec() {
            store.commit(‘dec‘);
        }
    }
 }
</script>
时间: 2024-10-05 21:53:59

Vue2.0 实战项目(五) 组件间通信的方法的相关文章

Vue2.0入门系列——父子组件间通信

1.子组件更新,父组件不变 点击"按钮"按钮,子组件数据被修改,父组件数据不变  =========>>>>>>  项目源代码, <head> <meta charset="UTF-8"> <title>v2.0父子组件通信</title> <script src="./vue.js"></script> <script> wi

Vue2.0 实战项目(四) Vue-router

Vue-router 本次实战项目所使用的Vue-router版本是2.3.1 首先在main.js中引入Vue-router, import Vue from 'vue'; import Router from 'vue-router'; //如果在一个模块化工程中使用它,必须要通过 Vue.use() 明确地安装路由功能: //如果使用全局的 script 标签,则无须如此(手动安装). Vue.use(Router); //定义路由 const routes = [ {path: '/go

Vue2.0 实战项目(二) 分析Vue如何运行

项目创建成功后在浏览器中打开项目. 进入页面首先加载index.html和main.js文件.. main.js文件中给id="app"的div创建一个Vue的实例,该实例中有一个名叫"APP"的组件,该组件通过vue-router将Hello.vue中的模板注入到App.vue的模板中. index.html main.js App.vue router文件夹下的index.js 最后就是Hello.vue

Vue2.0 实战项目(一) ——安装vue.cli

1.打开Vue脚手架的github地址:https://github.com/vuejs/vue-cli,在README查看如何安装 2.通过npm安装vue $ npm install -g vue-cli 3.通过webpack安装 $ vue init webpack myProjectName 4.切换到创建的项目目录,然后安装依赖文件 npm install

React独立组件间通信联动

React是现在主流的高效的前端框架,其官方文档 http://reactjs.cn/react/docs/getting-started.html 在介绍组件间通信时只给出了父子组件间通信的方法,而没有给出独立组件间通信的解决方案.这里我介绍一种不错的实现方式——signals. 第一步,我们要建立两个简单的react组件——一个进度条和一个输入框. 组件——进度条: var ProcessBar=React.createClass({ getInitialState:function(){

vue组件间通信六种方式(完整版)

vue组件间通信六种方式(完整版) 前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系: 如上图所示,A 和 B.B 和 C.B 和 D 都是父子关系,C 和 D 是兄弟关系,A 和 C 是隔代关系(可能隔多代). 针对不同的使用场景,如何选择行之有效的通信方式?这是我们所要探讨的主题.本文总结了vue组件间通信的几种方式,如props.$emit/$on.vuex.$parent / $chil

Android组件间通信——EventBus

在Android开发中,组件间通信一直是一个不可忽视的部分.当然,组件之间的通信有很多种方式可以选择,本文就利用EventBus通信的方式进行论述. EventBus是一个第三方框架,它的简单使用分为如下几步: 1. 下载框架源码,并导入工程中. 下载地址:https://github.com/greenrobot/EventBus 如果需要看如何导入并依赖工程,请转到另一篇博文:<Eclipse导入所依赖的Android项目> 2. 定义事件类,并广播事件 例如下面这个自定义事件类Messa

Android组件间通信框架EventBus

事件总线EventBus模式概述 在不使用事件总线的情况下: 在应用中的多个地方,控件经常需要根据某个状态来更新他们显示的内容.这种场景常见的解决方式就是定义一个接口,需要关注该事件的控件来实现这个接口.然后事件触发的地方来注册/取消注册这些对该事件感兴趣的控件.例如,陌陌依赖手机位置信息来获取附近的用户,所以在位置更新管理器(MmLocationManager)中定义了一个接口来监听位置更新的事件(MmLocationListener): interface MmLocationListene

Android 组件间通信--事件驱动

在android中,组件间通信常用的方式: 1.使用广播机制:在主页面中监听特定的广播事件,进行业务逻辑的操作,其他页面只需要根据需求发送广播即可 例如:常用app结构中,左边通常为菜单栏,点击菜单栏,中间页面变化.当点击菜单时发送广播通知容器变化显示的Fragment 2.使用接口方式:activity实现特定的接口,在子类或者Fragment中获取到Activity对象,转换成特定的接口对象,调用接口方法 3.事件驱动方式:EventManager 最近在网上看到EventBus这个开源的工