vue组件(父子,兄弟,爷孙,)之间传值

6,707 阅读2分钟

在使用vue框架进行开发的时候,组件化的开发模式,问题比较多的就是组件中如何进行传递参数,下面我们就来看一下。
一般有三种传值方式:1.父传子、2.子传父、3.兄弟组件之间通信4.爷孙跨级传值

1.父组件向子组件传值

一般会在子组件里面定义props来做接收,这是比较常见的情况
(1)这是父组件

<template>
	  <div>
	    <div>我是父组件</div>
	    <div>我发送给第一个组件的信息是:{{message}}</div>
	    <div>
	      <div id="son">
	        <Son1 :message="message" />
	      </div>
	    </div>
	  </div>
	</template>

	<script>
	import Son1 from "../components/son1";
	import Son2 from "../components/son2";
	export default {
	  components: {
	    Son1 ,
	    Son2
	  },
	  data() {
	    return {
	      message: "我是父组件,我给你发消息",
	    };
	  }
	};
	</script>
12345678910111213141516171819202122232425262728

可以看到,我们在第一个子组件中传递了一个message,那么我们就需要在子组件上使用props来接受message
(2)这是子组件

<template>
  <div>
    <div id="title">我是第一个子组件</div>
    <div>我接受到的父组件的消息是:{{message}}</div>
  </div>
</template>

<script>
export default {
  props: {
    message: {
      type: String
    }
  }
};
123456789101112131415

2.子组件向父组件传值

这时候就需要利用vue中的$emit将想要传递的值通过函数的形式传出,在父组件接收

//在子组件中的方法中
this.$emit(arg1,arg2) arg1:父组件中的方法名字,arg2:要传出的值
12

//这是之前设置好的第二个子组件Son2
<template>
  <div>
    <div id="title">我是第二个子组件</div>
    <div>我要发送给父组件的值:{{msg}}</div>
    <button @click="toParent">向父组件发送信息</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      msg: "我是第二组件,我要给父组件传值",
    };
  },
  methods: {
    toParent() {
    //toParent就是父组件中的方法, this.msg就是要从子组件传递到父组件中的值
      this.$emit("toParent", this.msg);
    }
  }
};
</script>
123456789101112131415161718192021222324

我在button上绑定了一个点击事件,函数里面传出了一个方法名为toParent的方法,这时候我们就要去父组件接收这个函数,它会带一个返回值,这个返回值就是我们需要从子组件传的值。

// 这是父组件
<template>
  <div>
    <div>我是父组件</div>

    <div>我即将接收第二组件传值是:{{child2Msg}}</div>
    <div>
      <div id="child2">
        <Son2 @toParent="getMag" />
      </div>
    </div>
  </div>
</template>

<script>
import Son1 from "../components/son1";
import Son2 from "../components/son2";
export default {
  components: {
   Son1,
   Son2
  },
  data() {
    return {
      child2Msg: ""
    };
  },
  methods: {
    getMag(msg) {
    //直接获取当前子组件传递过来的值,进行赋值
      this.child2Msg = msg;
    }
  }
};
</script>
1234567891011121314151617181920212223242526272829303132333435

此时我在父组件里面定义了一个@toParent方法这个名称要和子组件里面this.$emit(arg1)的命名一样,用来接收。在getMag里面接收一个参数就是当前传回的值。

3.兄弟之间组件传值

兄弟组件之间就需要一个中间值,我在这里称为bus。在vue文件main.js中,我们利用 Vue.prototype.bus=new Vue() 来定义,此时我们就有了一个中间量。

//这是其中第一个兄弟组件--用来传递
<template>
  <div>
    <div id="title">我是第一个子组件</div>
      我要给第二个兄弟发信息,内容是:
      <input type="text" v-model="to" />
    </div>
    <button @click="toBrother">点我给兄弟传值</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      to: "哈喽老二"
    };
  },
  methods: {
    toBrother() {
    // 点击按钮,将数据绑定到bus中的emit里面的toBrother
      this.bus.$emit("toBrother", this.to);
    }
  }
};
</script>
1234567891011121314151617181920212223242526

//这是第二个兄弟组件--用来接收
<template>
  <div>
    <div id="title">我是第二个子组件</div> 
    <div>我得到的兄弟组件信息是:{{get}}</div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      get: ""
    };
  }
  beforeCreate() {
  	//创建之前获取到bus中的toBrother里面的值
    this.bus.$on("toBrother", msg => {
      this.get = msg;
    });
  }
};
</script>
1234567891011121314151617181920212223

4.爷孙组件跨级传值

// parent组件
<template>
  <div>
    <div>{{msg}}</div>
    <button @click="changeMsg">修改msg的值</button>
    <son></son>
  </div>
</template>

<script>
import Son from "./Son";
export default {
  name: "parent",
  components: { Son },
  provide() {
    return {
      injectData: this.msg
    };
  },
  data() {
    return {
      msg: "传值前",
    };
  },
  methods: {
    changeTest() {
      this.msg= "传值后";
    }
  }
};
</script>
12345678910111213141516171819202122232425262728293031

//son组件
<template>
  <div>{{injectData}}</div>
</template>

<script>
export default {
  name: "son",
  inject: ["injectData"],
  mounted() {
     console.log(this.injectData)
  },
};
</script>
123456789101112131415

parent组件使用provide提供一个injectData,son组件通过inject获取到parent注入的数据,以上就是它的最简用法。
provide/inject这对选项需要一起使用,以允许一个祖先组件向其所有子孙后代注入一个依赖,不论组件层次有多深,并在起上下游关系成立的时间里始终生效。
provide 选项应该是:一个对象或返回一个对象的函数
inject 选项应该是:一个字符串数组,或 一个对象,对象的 key 是本地的绑定名

5.使用vuex实现组件间传值

(1).state中的数据获取时使用 this.s t o r e . s t a t e . x x x ; ( 2 ) 修 改 s t a t e 中 的 数 据 必 须 通 过 m u t a t i o n s 中 提 供 的 方 法 , 调 用 方 法 使 用 t h i s . store.state.xxx; (2)修改state中的数据必须通过 mutations 中提供的方法,调用方法使用 this.store.state.xxx;(2)修改state中的数据必须通过mutations中提供的方法,调用方法使用this.store.commit(‘方法名称’, 唯一参数),要传递多个参数可使用对象;
(3)如果对外提供 state 中的数据时需要对数据进行包装,可使用 getters,方法为:this.$store.getters.xxx

let store = new Vuex.Store({
    state: {
        theUrl: {},
        count: 0,
    },
    mutations: {
        increment(state, obj) {
        state.count += (obj.a + obj.d)
         }   
     },
    getters: {
        optCount: function (state) {
        return '当前最新的count值是:' + state.count
        }
  },
}