Vue常用传参方法

254 阅读1分钟

Vue常用传参方法

1.自定义事件 $emit 🥗

// 父 
<Son @自定义的事件名="子触发自定义事件的回调(接收子传上来的数据)" />
// 子
 <button @click="goFather"></button>
--- 子先触发一个事件,在调用this.$emit
methods:{
    goFather(){
        this.$emit('自定义的事件名',传值1,传值2,...)
    }
}

2.父传子 props 🥩

// 父在子组件身上传输数据
<Son fatherData="父亲的值" :fatherMethod="goSon(可传属性与方法)" />
// 子接收 props
第一种方式: props:['fatherData','fatherMethod']
第二中方式: props:{
    fatherData:{
        type:String // 传入过来的数据类型限定
        required:true // 是否为必传值
    }
}、

3.父获取子身上的值与方法 ref 🍱

// 子身上设置ref
<Son ref="mySon" />
// 父用this.$refs
 mounted(){
    this.$refs.mySon.(属性、方法....)
}

4.父子间互相获取对方的值($parent,$children)🌍

// 父获取儿子 $children 注意:获取的师数组
this.$children[0].(属性、方法....)
// 儿子获取父 $parent 
this.$parent.(属性、方法....)

5.全局事件总线-兄弟之间互相传值 $bus 🥝

// 首先 全局安装$bus 
new Vue({
	......
	beforeCreate() {
		Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
	},
    ......
}) 
// 本组件的兄弟
method:{
     goBrother() {
      this.$bus.$emit("brother", "我是你兄弟");
    },
}
// 本组件
  mounted() {
    this.$bus.$on("brother", (data) => {
       console.log(data);
    });  // 第二个参数是一个回调
  },
// $off 用$off('xxx')去解绑当前组件所用到的事件,一般使用在beforeDestroy钩子中
    beforeDestroy() {
    this.$bus.$off("brother");
  },

6.vuex 无死角各种花式传值都无问题

--以上为vuex关系逻辑图--

vuex总共有五个属性:Actions, Mutations, State, Getters, modules;

6.1.1 Actions 🥮
vuex中actions一般用来处理异步操作,最主要的就是发起ajax请求数据,此处一般用context接收$store,里面包含了调用vuex的所有方法;

// vuex中的actions写法示例:
  actions: {
    changeName(context($store), data(接收调用者的传参)) {
      context.commit('changeName', data)
    }
  }

6.1.2 Mutations 🥫
vuex中mutations一般是直接修改state数据的地方,用commit调用,里面写的函数方法接收到的第一个参数就是state数据;

  mutations: {
    changeName(state(state储存的数据), data(actions里面传过来的值)) {
      state.name = data
    }
  },

6.1.3 State 🥞
vuex中state里面使用来储存数据;

  state: {
    username: "vuex"
  },

6.1.4 Getters 🍜
vuex中getters主要是简化数据结构,处理一些较复杂的数据加工等;

  getters: {
    sidebar: state => state.app.sidebar,
    device: state => state.app.device,
    token: state => state.user.token,
    name: state => state.user.userInfo.username,
    userId: state => state.user.userInfo.userId,
    avatar: state => state.user.userInfo.staffPhoto
  }

6.1.5 modules 🌵
vuex中方modules,模块,在项目较为复杂时需要独立功能的数据独立存储。这是就需要使用modules;

// 每个modules里面的独立模块都有完整的vuex属性;
  modules: {
    app,
    settings,
    user
  },

辅助函数: mapActions, mapMutations, mapState, mapGetters;

使用辅助函数,首先第一步都是导入辅助函数方法:import { mapActions,... } from "vuex";

6.2.1 mapActions 🍑

mapActions用于生成调用actions的方法,即是调用actions中的函数;

methods:{
    //靠mapActions生成:incrementOdd、incrementWait(对象形式)
    ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

    //靠mapActions生成:incrementOdd、incrementWait(数组形式)
    ...mapActions(['jiaOdd','jiaWait'])
}

6.2.2 mapMutations 🍇

mapMutations用于生成调用mutations的方法,即是调用mutations中的函数;

methods:{
    //靠mapActions生成:increment、decrement(对象形式)
    ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    
    //靠mapMutations生成:JIA、JIAN(对象形式)
    ...mapMutations(['JIA','JIAN']),
}

*6.2.3 mapState 🥜

mapState用于我们映射state中的的数据;

computed: {
    //借助mapState生成计算属性:sum、school、subject(对象写法)
     ...mapState({sum:'sum',school:'school',subject:'subject'}),
         
    //借助mapState生成计算属性:sum、school、subject(数组写法)
    ...mapState(['sum','school','subject']),
},

6.2.4 mapGetters 🍀

mapGetters用于我们映射getters中的数据为计算属性;

computed: {
    //借助mapGetters生成计算属性:bigSum(对象写法) =》对象写法可以重命名,键是重新取名;
    ...mapGetters({bigSum:'bigSum'}), 

    //借助mapGetters生成计算属性:bigSum(数组写法)
    ...mapGetters(['bigSum'])
},

其他常用

6.3.1 namespaced 🍓

namespaced命名空间,是为了保证每个模块的高封闭性;

export default {
  namespaced: true, // 值为Boolean值;
}

开启命名空间后,调用方式的转变;

  1. 开启命名空间后,组件中读取state数据;
//方式一:自己直接读取
this.$store.state.personAbout.list
//方式二:借助mapState读取:
...mapState('countAbout',['sum','school','subject']),
  1. 开启命名空间后,组件中读取getters数据;
//方式一:自己直接读取
this.$store.getters['personAbout/firstPersonName']
//方式二:借助mapGetters读取:
...mapGetters('countAbout',['bigSum'])
  1. 开启命名空间后,组件中调用dispatch;
//方式一:自己直接dispatch
this.$store.dispatch('personAbout/addPersonWang',person)
//方式二:借助mapActions:
...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
  1. 开启命名空间后,组件中调用commit;
//方式一:自己直接commit
this.$store.commit('personAbout/ADD_PERSON',person)
//方式二:借助mapMutations:
...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),

7、结语

以上是我总结的vue中常用的传参方法,如果觉得还不错的话,就点一个👍啦~;有错误不严谨之处,欢迎各位在评论区纠正指出。谢谢;