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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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