vue组件传值总结

文章有点长,耐心看完,希望你有所收获!!!

1. 父子组件传值

###  props、$ref、$emit

// 总结:prop和$ref都是父组件向子组件通信、$emit是子组件向父组件通信
// props着重于数据的传递,它并不能调用子组件里的属性和方法
// $ref着重于索引,主要用来调用子组件里的属性和方法,不擅长于数据传递

// 父组件
<template>
    <son :fathersName="kattes" @sonClick="sonClickEvent">我是爸爸</son>
</template>
<script>
export default {
  methods: {
      // 点击子组件的事件
      sonClickEvent( name ){
          console.log(name) // 特特朗普
      }
  }
}
</script>


// 父组件 ($ref)
<template>
    <son ref="msg">我是爸爸</son>
</template>
<script>
export default {
  mounted: function () {
     // 直接调用子组件的方法,可通过事件将值传给子组件 message
     this.$refs.msg.getMessage('所传的值')
  }
}
</script>


// 子组件
<script>
export default {
  props: {
    fathersName: {
      type: String,//传值类型
      default: 'hello world',//默认传值
    }
  },
  data(){
    return {
        message: ""
    }
  },
  methods: {
      // div点击事件
      divClick(){
          let sonName = "特特朗普"
          this.$emit("sonClick", sonName)
      },
      // getMessage事件
      getMessage(msg){
        this.message = msg;
      }
  }
}
</script>
// 应用,显示传过来的值(点击div,将子组件的值传给父组件)
<div @click="divClick"> {{ fathersName }} </div>

2. 兄弟组件传值(法一)

vuex主要用于管理vue中的数据,但是网上说最好大型项目用,其他的一些中小型或者小型的项目能别用尽量别用(现在还不太理解),vuex中主要包含四类:state、getter、mutations、actions,之间的关系如下图:


image.png

可以从上图很清晰的看到每个状态之间的触发的方法,其中,state主要用于管理项目的数据(进行数据初始化);getters就要读取state中的数据,相当于computed当数据进行更新时读取数据;mutations主要用于操作state中的数据,说白了就是对state数据进行更改;action 提交的是 mutation,而不是直接变更状态,(dispatch)触发,(参数需要context)。

// 例子说明:下面例子(headertop,headerContent在同级目录下的组件),打开页面时,两个组件都会获取到state值,在headertop组件中,可通过input输入框输入设置city名(同时改变两个组件的显示),相当于headertop中改变信息,headerContent接收信息,并发生改变。

// store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
  state: {
    city: "四川成都"
  },
  getters: {
    getCity(state) {
      return state.city;//返回当前city值
    }
  },
  mutations: {
    changeCity(state, name) {
      state.city = name;//为city设置新的值
    }
  },
  actions: {//使用结构赋值, 参数列表{commit ,state}
    setCityName({ commit, state }, name) {
      // commit调用mutations的方法
      commit('changeCity', name)//用于提交mutations方法,传递城市名
    }
  }
})


// components/headertop.vue组件
<template>
    <p>headertop组件的city值: {{ city }} </p>
    <input type="text" :value="city" @change="changeCity"/>
</template>
<script>
export default{
  name: "headerTop", 
  data(){
      return{
      
      }
  },
  methods:{
    // 通过input框设置城市名字
    changeCity(e){
        this.$store.dispatch('setCityName', e.target.value) 
    }
  }
}
</script>


// components/headerContent.vue组件
<template>
    <p>headerContent组件的city值: {{ city }} </p>
</template>
<script>
  name: "headerContent", 
  data(){
      return {
      
      }
  },
  computed:{
    city: function(){
        return this.$store.state.city
    }
  }
</script>

3. 多个传值或处理 mapState,mapAction,mapMutations

(1) mapState
// 简单的vue项目使用vuex就直接用:   this.$store.state.变量名
import  { mapState }  from  vuex
// 法一:
computed:{
    ...mapState({
        add : state => state.add,
        count : state => state.count
    })
}
// 法二:
computed:{
    ...mapState(['add','count'])
}
// 总结: 调用this.add、this.count 映射为 this.$store.state.add、this.$store.state.count
(2) mapAction
// 简单的vue项目使用vuex就直接用:   this.$store.dispatch('setCityName',name)
import  { mapAction }  from  vuex
// 法一:
methods:{
    ...mapActions(['commonActionGet', 'commonActionPost'])
}
// 法二:
methods:{
    ...mapActions({
        'commonActionGet': 'commonActionGet',
        'commonActionPost': 'commonActionPost',
    })
}
// 总结:  调用this.commonActionGet() 映射为 this.$store.dispatch('commonActionGet')、调用this.commonActionPost() 映射为 this.$store.dispatch('commonActionPost')
(3) mapMutations
// 简单项目中直接使用   this.$store.commit('changeCity', "四川成都")
// import { mapMutations } from vuex
// 法一:
methods:{   
    ...mapMutations({
        'add': 'add'
    })
}
// 法二:
methods:{   
    ...mapMutations(['add'])
}
// 总结:调用this.add  映射为 this.$store.commit('add')

4. 兄弟组件传值(法二) this.$bus.$emit this.$bus.$on this.$bus.$off

// main.js
Vue.prototype.$bus = new Vue();

// a组件
this.$bus.$emit("updata","参数")

// b组件
this.$bus.$on("updata",(data)=>{
      console.log(data)
})

// 此时,你就可以正常使用兄弟之间得组件通信,但是还有一个问题,就是当你多次使用兄弟组件之间的通信时,会发现,每执行一次,会触发多次,每次执行完我们还需要销毁

//生命周期销毁
destroyed(){
    this.$bus.$off('updata')
}

5. 缓存传值 ( localStorage、sessionStorage )

// localStorage
localStorage.setItem("lastname", "Smith");// 存储
localStorage.getItem("lastname");// 取值

// sessionStorage
sessionStorage.setItem("lastname", "Smith");// 存储
sessionStorage.getItem("lastname");// 取值
总结: 以上五种方法都是传值的方法,方法各有千秋,相信总有一种方法适合你,最终是以完成项目需求为导向,如你有更好的的方式方法,请留言告知,相互学习才能更快进步.

优秀文章推荐:https://my.oschina.net/u/3982182/blog/3019264

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

推荐阅读更多精彩内容

  • 由于简书没有目录的功能,为了更加清晰的学习,我制作了一个目录地址如下:学习Vue目录 链接地址: https:/...
    读书的鱼阅读 10,066评论 13 249
  • 创建一个Vue实例: new Vue({ el:"#app", //el是控制元素 data:{ msg:...
    Kenny_Yu阅读 915评论 0 0
  • Vue Vue是一个前端js框架,由尤雨溪开发,是个人项目 Vue近几年来特别的受关注,三年前的时候angular...
    hcySam阅读 281评论 0 0
  • 一、相对于其他框架相比 1、相对于Angular 1.1、相对于angular的api,vue的api更简单,...
    我寄你的信总要送往邮局阅读 845评论 0 4
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,562评论 0 11