前言:网上大部分文章写的有点乱,很少有讲得易懂的文章。

   所以,我写了篇在我能看得懂的基础上又照顾到大家的文章 =。=

    • 作者:X1aoYE
    • 备注:此文原创,转载请注明~  内容里的<br>请无视。。

关键字:Vue、非父子组件、兄弟组件、传值、共享状态

  • 应用例子:
  1. 主题颜色更换
  2. 购物车传值
  3. 就像名字所说的兄弟组件传值,自己理解其他例子了哈~
  • 小型项目:

    推荐使用 global event bus (事件总线)  ,不然小项目里用 Vuex 相对来说会挺繁琐

    步骤:

    1. 新建一个 bus.vue  (只是个 .vue ,不用想太多)

  import Vue from 'vue' //import一个vue类
  export const bus = new Vue() //实例化并将它export

    2. 使用

在我们的一个组件(这里指的是发送方)里:

import { bus } from 'bus.js'
// 其他代码~
bus.$emit('myEvent', 'this.mydata')
// 其他代码~
// 解释:bus.$emit('自定义事件名',要传送的数据);

     3. 接着使用 bus.vue

      紧接着在我们另一个组件(这里指的是接收方)里:

      备注:bus.$on('事件名',callback) ---------- callback即指回调$emit要传送的数据;

import { bus } from 'bus.js'
created () { //监听传值
bus.$on('myEvent', (mydata) => {
this.mydata = mydata;
})
}

     备注:若只想监听一次事件 ,则使用bus.$once

    注销:bus.$off('myEvent', ~~~自己写~~~);

     步骤大致就这样~

  • 中大型项目:

   推荐使用 Vuex ,

         解释一波:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式;

         vuex解决了组件之间同一状态的共享问题  (解决了不同组件之间的数据共享) ,使组件里面的数据持久化。    

          1. 安装vuex :cnpm install vuex --save  (什么是cnpm就不解释了,能学到Vuex的应该都了解cnpm了)

   2. 创建一个 vuex 文件夹,并在里面新建一个 store.js 写入以下代码:

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)

      接着往下写:

      state 定义数据:state在vuex中用于存储数据

//1.state在vuex中用于存储数据
var state={ //存放数据,数据中心
count:1,
// 其他数据格式:orderList: [],
// 其他数据格式:params: {}
}

         getters 类似计算属性:

//2.
var getters= {
computedCount: (state) => {
return state.count*2
}
}

         mutations 定义方法:mutations里面放的是方法,方法主要用于改变state里面的数据

               同步操作,状态更改 ,只允许mutations里进行state更改
//3.mutations里面放的是方法,方法主要用于改变state里面的数据
var mutations={
incCount(){
++state.count;
}
}

    action 义方法:异步操作,Action 提交的是 mutation,而不是直接变更状态。

//4.
var actions= {
  incMutationsCount(context) { /*因此你可以调用 context.commit 提交一个 mutation*/
    context.commit('incCount'); /*执行 mutations 里面的incCount方法 改变state里面的数据*/
    //此处按照实际情况扩展~
  }
}

    暴露!:暴露上面那四个~

const store = new Vuex.Store({
  state,
  mutations,
  getters,
  actions
})

export default store;

    3. 组件里去使用 Vuex:

(1).  获取state里面的数据

     this.$store.state.数据

(2).  获取 getters里面方法返回的的数据 (一般vue 和 store 进行交互 用 $store.getters, getters的值放在计算属性里,动态绑定在计算属性computed里)

     this.$store.getters.computedCount

(3).  触发 mutations 改变 state里面的数据 (别记混了)

     this.$store.commit('incCount');

(4). 触发 actions里面的方法 (别记混了)

    this.$store.dispatch('incMutationsCount');   ps:这个 incMutationsCount 会再去 执行 mutations 里面的incCount方法

    4. 在src下新建一个文件夹store,接着新建一个文件index.js来放store对象。记得在 main.js 里添加store

        main.js:

import store from './store/index'
new Vue({
el: '#app',
router,
store,
template: '<按你的写/>',
//第一层
components: { 按你的写 }
})

            index.js: 

import Vuex from 'vuex'
import Vue from 'vue'
import storefrom './modules/store' //这个是我的store.js
Vue.use(Vuex) export default new Vuex.Store({
modules:{ //模型
store
}
})

  

 

大概就这样~

这只是基础步骤,详细的要自己按照自己的详细情况加~

    

  

Vue兄弟组件(非父子组件)状态共享与传值的更多相关文章

  1. 【vue】父组件主动调用子组件 /// 非父子组件传值

    一  父组件主动调用子组件: 注意:在父组件使用子组件的标签上注入ref属性,例如: <div id="home"> <v-header ref="he ...

  2. Vue 组件 非父子组件通信

    有时候两个组件也需要通信(非父子关系),在简单的场景下,可以使用一个空的vue实例作为中央事件总线: var bus = new Vue(); //触发组件a中的事件 bus.$emit('id-se ...

  3. Vue bus的使用(兄弟|非父子组件传值)-->可以使用一个空的Vue实例作为中央事件总线new Vue()

    1.在main.js中注册全局的bus  Vue.prototype.bus=new Vue(); 2.在组建中使用 子组建使用:this.bus.$emit('自定义事件名',data) metho ...

  4. vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例

    vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...

  5. 简述在Vue脚手架中,组件以及父子组件(非父子组件)之间的传值

    1.组件的定义 组成: template:包裹HTML模板片段(反映了数据与最终呈现给用户视图之间的映射关系) 只支持单个template标签: 支持lang配置多种模板语法: script:配置Vu ...

  6. Vue 非父子组件通信方案

    Vue 非父子组件通信方案 概述 在 Vue 中模块间的通信很普遍 如果是单纯的父子组件间传递信息,父组件可以使用 props 将数据向下传递到子组件,而在子组件中可以使用 events (父组件需要 ...

  7. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

  8. vue父子组件及非父子组件通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: <parent> <child :child-msg="msg" ...

  9. Vue父子组件及非父子组件如何通信

    1.父组件传递数据给子组件 父组件数据如何传递给子组件呢?可以通过props属性来实现 父组件: 子组件通过props来接收数据: 方式1: 方式2 : 方式3: 这样呢,就实现了父组件向子组件传递数 ...

随机推荐

  1. 利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件

    虽说渐渐地Mac笔记本基本告别内置光驱时代了,随着网络的普及,使用到光驱的机会也渐少,但有时又难免需要光驱,比如二货出版社的随书光盘等…我们可以通过USB外置光驱将光盘内容提取为ISO文件保存到电脑里 ...

  2. NYOJ 298 相变点(矩阵高速功率)

    点的变换 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描写叙述 平面上有不超过10000个点.坐标都是已知的.如今可能对全部的点做下面几种操作: 平移一定距离(M),相对X ...

  3. java_Mac安装多个JDK版本并设置环境变量

    JDK6.JDK7.JDK8三个版本的汇总地址:https://pan.baidu.com/s/1pKSYv8Z 安装 JDK6安装 JDK6下载地址 见网盘 安装完毕后确认版本 JavaForOSX ...

  4. 在微信浏览器里使用js或jquery实现页面重新刷新

    function refresh() { var random = Math.floor((Math.random() * 10000) + 1); var url = decodeURI(windo ...

  5. H3C交换机配置ACL禁止vlan间互访

    1.先把基础工作做好,就是配置VLAN,配置Trunk,确定10个VLAN和相应的端口都正确.假设10个VLAN的地址分别是192.168.10.X,192.168.20.X......192.168 ...

  6. 在WPF中实现图片一边下载一边显示

    原文 在WPF中实现图片一边下载一边显示 当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在WPF程序中,当我们通过如下方式显示一幅图片时: img.Source ...

  7. Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测

    原文:Win8 Metro(C#)数字图像处理--2.38Hough变换直线检测  [函数名称] Hough 变换直线检测         HoughLineDetect(WriteableBit ...

  8. python chrome selenium

    #coding=utf-8 from selenium import webdriver options = webdriver.ChromeOptions() options.add_argumen ...

  9. C# 如何使用 Sql Server Compact 数据库

    Sql Server Compact Edition(简称SqlCE)是一个轻量级的数据库,对于放在客户机上的程序而有需要存储数据这样的环境,使用SqlCE再合适不过了.SqlCE可以通过在VS(Vi ...

  10. IntelliJ IDEA Maven工程保证JDK版本不变

    创建maven项目后修改pom文件idea会默认将jdk版本调回到1.5,这是因为没有在pom里面设置项目的jdk版本 解决方法: 在pom文件中设定jdk版本即可,以下这种写法会自动更新idea中的 ...