vue组件之间的传值
“down”—>指的是下的意思,即父组件向子组件传值,用props;“up”—>指的是上的意思,即子组件想父组件传值,用emit。
1.子组件向父组件的传值:
Child.vue
<template>
<div class="child">
<h1>子组件</h1>
<button v-on:click="childToParent">想父组件传值</button>
</div>
</template>
<script>
export default{
name: 'child',
data(){
return {}
},
methods: {
childToParent(){
this.$emit("childToParentMsg", "子组件向父组件传值");
}
}
}
</script>
parent.vue
<template>
<div class="parent">
<h1>父组件</h1>
<Child v-on:childToParentMsg="showChildToParentMsg" ></Child>
</div>
</template>
<script>
import Child from './child/Child.vue'
export default{
name:"parent",
data(){
return {
}
},
methods: {
showChildToParentMsg:function(data){
alert("父组件显示信息:"+data)
}
},
components: {Child}
}
</script>
2.父组件向子组件传值
parent.vue
<template>
<div class="parent">
<h1>父组件</h1>
<Child v-bind:parentToChild="parentMsg"></Child>
</div>
</template>
<script>
import Child from './child/Child.vue'
export default{
name:"parent",
data(){
return {
parentMsg:'父组件向子组件传值'
}
},
components: {Child}
}
</script>
child.vue
<template>
<div class="child">
<h1>子组件</h1>
<span>子组件显示信息:{{parentToChild}}</span><br>
</div>
</template>
<script>
export default{
name: 'child',
data(){
return {}
},
props:["parentToChild"]
}
</script>
3.采用eventBus.js传值---兄弟组件间的传值(并不推荐使用,会存在一些问题,且并不规范)
eventBus.js
import Vue from 'Vue'
export default new Vue()
App.vue
<template>
<div id="app">
<secondChild></secondChild>
<firstChild></firstChild>
</div>
</template>
<script>
import FirstChild from './components/FirstChild'
import SecondChild from './components/SecondChild'
export default {
name: 'app',
components: {
FirstChild,
SecondChild,
}
}
</script>
FirstChild.vue
<template>
<div class="firstChild">
<input type="text" placeholder="请输入文字" v-model="message">
<button @click="showMessage">向组件传值</button>
<br>
<span>{{message}}</span>
</div>
</template>
<script>
import bus from '../assets/eventBus';
export default{
name: 'firstChild',
data () {
return {
message: '你好'
}
},
methods: {
showMessage () {
alert(this.message)
bus.$emit('userDefinedEvent', this.message);//传值
}
}
}
</script>
SecondChild.vue
<template>
<div id="SecondChild">
<h1>{{message}}</h1>
</div>
</template>
<script>
import bus from '../assets/eventBus';
export default{
name:'SecondChild',
data(){
return {
message: ''
}
},
mounted(){
var self = this;
bus.$on('userDefinedEvent',function(message){
self.message = message;//接值
});
}
}
【注意】这两个组件度需要在app.vue里面引用,要不,就会不起作用。

参考文章:https://www.cnblogs.com/missxiaojun/p/6882491.html
4.通过vuex来传值(最适合的方法)
1.首先在store里面注册一个变量(需要传递的值)
// vuex 通过状态管理数据 import Vuex from 'vuex' import Vue from 'vue' Vue.use(Vuex) const store = new Vuex.Store({ state: { // 公共 comm: { showSearch:false,//是否显示搜索页 } }, //在mutations中改变state状态 mutations: { /*修改search的信息*/ changeSearch(state,data){ state.comm.showSearch=data; } }, actions: { }, getter: { } }) export default store
2.在接收值的页面(或组件)中,定义一个计算属性,当store里面的值改变的时候,随着变化
computed:{ showSearch:function(){ return this.$store.state.comm.showSearch; }, },
3.在传递值的页面(或组件)中,添加改变值的点击事件
//showSearch:true sendData:function(){ //改变store里面的变量 this.$store.commit('changeSearch',true); },
结论:在不同组件之间传值(非父子)最好使用vuex(全局管理状态)这个方法,如果采用eventBus这个方法,还需要考虑销毁一些东西,且并不是特别适合。

浙公网安备 33010602011771号