一文就够了-vue2.0组件间的传参方式

1.父子组件

通常父子组件间我们使用props传值,方式如下

1.1父传子

父组件

<template>
  <HelloWorld :msg="msg">
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){
    return({
      msg:"父组件的值"
    })
  },
  components: {
    HelloWorld
  }
}

子组件

<template>
  <div class="hello">
    {{ msg }}
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
  props: {
    msg: {
      //以下数据皆为选填数据
      type: 'String',    // 验证传来值的数据类型 
      default: '' ,    //父组件如果没有传值,就取这个默认值;如果说是一个数组或者对象,需要写成函数形式
      required: true/false ,   // true--必须传的
      validator:function(val){         // v是父组件的数据可以对传入的值进行自定义的校验通过添加一个validator函数进行数据的校验,如果函数返回false,则校验失败,进而报错
        return false                  // 验证失败
        return true                  // 验证成功
      }
    }
    },
  data:()=>{
    return{
    
    }
  },
  methods:{

  }
}
</script>

1.2子传父

子组件

<template>
  <div class="hello" @click="toFar">
    点击
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
 
  data:()=>{
    return{
    
    }
  },
  methods:{
    toFar(){
      this.$emit('fromChild','msg')
    }
  }
}
</script>

父组件

<template>
  <HelloWorld @formChild="getMsg">
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){
    return({
      msg:"父组件的值"
    })
  },
  methods:{
    getMsg(val){
      console.log(val)
    } 
  },
  components: {
    HelloWorld
  }
}
</script>

2.兄弟组件

2.1公共的事件总线eventBus

我们可以创建一个eventbus.js文件来作为中转文件

import Vue from 'vue'
export default new Vue()

A组件派发事件

//pageName:a组件
<template>
  <div @click="toB">

  </div>
</template>

<script>
import eventBus from '../tools/eventbus.js'
export default {
  data () {
    return {
    }
  },
  methods: {
    toB(){
      eventBus.#emit('formA','Aval')
    }
  }, 
}
</script>

B组件点阅事件

//pageName:b组件
<template>
  <div></div>
</template>

<script>
import eventBus from '../tools/eventbus.js'
export default {
  data () {
    return {
    }
  },
  mounted(){
    eventBus.$on('formA',setData(val))
  },
  methods: {
    setData(val){
     console.log(val)
    }
  }, 
}
</script>

3.路由传参

3.1query传参

this.$router.push({
      path: '/detail',
      query: {
         id: id
       }
 })
 
 // 对应路由配置:
 {
     path: '/detail',
     name: 'Detail',
     component: Detail
 }
 
 // 子组件获取参数:
 this.$route.query.id

3.2params传参

this.$router.push({
    name: 'Detail',
    params: {
       id: id
    }
 })
 
 // 对应路由配置:
 {
     path: '/detail',
     name: 'Detail',
     component: Detail
  }
  
 // 子组件获取参数:
 this.$route.params.id

3.3params传参且提前约定好参数

// 直接在路由地址后面拼接参数
this.$router.push({
      path: `/detail/${id}`,
 })
 
// 路由配置
{
     path: '/detail/:id',
     name: 'Detail',
     component: Detail
 }
 
//获取参数
this.$route.params.id

关于query传参和params传参的特点
query传参
1.标定路由时name和path都行
2.query传参类似于get请求参数会处于url上
3.页面刷新时参数不会消失
params传参
1.标定路由时使用name
2.请求参数不会处于URL上
3.页面刷新参数会失效(除非约定好参数)

4.$refs,$parent,$children

4.1$refs

获取的是设置ref的子组件的实例,
在子组件中

<template>
  <div class="hello" @click="toFar">
    子组件
  </div>
</template>

<script>
export default {
  name: 'HelloWorld',
 
  data:()=>{
    return{
     num:1
    }
  },
  methods:{
    toFar(){
      this.$emit('fromChild','msg')
    }
  }
}
</script>

在父组件中

<template>
  <HelloWorld ref="hw" @formChild="getMsg" />
</template>

<script>
import HelloWorld from './components/HelloWorld.vue'

export default {
  name: 'App',
  data(){
    return({
      msg:"父组件的值"
    })
  },
  mounted(){
    
    console.log(this.$refs)
  },
  methods:{
    getMsg(){
      console.log(this.$children)
    } 
  },
  components: {
    HelloWorld
  }
}
</script>

打印得到的结果是

ref对象.png

可以看到我们的子组件定义的状态和方法都会被获取到,但是该方法获取数据时并不是响应式的。$parent,$children方法也类似,但是可以直接在子元素或者父元素中获取,无需挂载在ref类似的标识上

5.vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它的状态存储是响应式的。采用集中式存储管理应用的所有组件的状态,也就是说,对数据的所有操作都要在vuex中进行。但是我们该如何去使用呢,话不多说
先来看看vuex的基本雏形

const store = new Vuex.Store({
    state: {
        //相当于自定义组件中的data
      count: 1,
    },
    getters:{
        //相当于自定义组件中的computed
        dataList:(state)=>{
           //计算分页后的数据
            
            return (state.count + 1);
        },
    },
    mutations: {
        //相当于自定义组件中的methods,只能做同步的操作
        //对state中的数据进行修改
        increment(state) {
          state.count++
      },
    },
    actions: {
        //异步操作,例如ajax请求
        //使用commit 触发 mutations
    }
})

store代表仓库的意思,在vuex中也依旧是,它存储了state(状态),getters(自定义的依赖变量),mutations(同步操作函数集),actions(异步操作函数集)

5.1state(状态)

state中存放定义的状态,获取的在页面中获取的方法有
this.$store.state
如果需要获取的数据过多时我们可以使用语法糖

...mapState({
      count: 'count'
    })

5.2getters(依赖状态自定义变量)

getter 相当于自定义组件中的computed,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
getter 接受 state 作为其第一个参数,也可以接受其他 getter 作为第二个参数。
可以使用this.$store.getters 访问这些值。

5.3mutations

vuex的机制中只有mutation可以更改 Vuex 的 State 中数据。
通过 store.commit(type,data)调用 mutation,第一个参数为事件类型,需要和mutation中函数名称一致;第二个参数为要传递的参数。
mutation中的函数接受 state 作为其第一个参数,第二个参数是commit一个mutations中的函数时所传递的函数。
语法糖有

...mapMutations(['cartAdd']),

5.4actions

action 主要用来操作所有的异步请求。
action 不能直接对State 中的数据进行操作,只能通过commit(type,data) 方法调用 mutation。
action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。
通过 store.dispatch(type)方法触发action,参数为事件类型,需要和action中函数名称一致。

以上就是vue2.0组件间参数传递的常用内容,仅供参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容