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这个方法,还需要考虑销毁一些东西,且并不是特别适合。

posted @ 2017-12-14 18:19  rachelch  阅读(209)  评论(0)    收藏  举报