VUE项目中的父子,兄弟组件之间的传值。
首先说一下父子组件就是在一个vue文件中引入另一个vue文件,被引入vue文件就是子组件,引入vue文件的vue文件就是父组件。而在父组件中是不能直接调用子组件中的变量值的。下面详细说一下,父子组件之间怎么传值。
·
·
·
情况一:父组件给子组件传值方法,使用props
1 组件中的 所有props 中的数据,都是通过父组件传递给子组件的
2 props 中的数据都是只读的,无法重新赋值
这是关于props具体使用:
https://www.cnblogs.com/planetwithpig/p/11653732.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>父传字</title>
<script src="../js/vue.js"></script>
</head>
<div id="app">
<my-com :parent-msg="msg"></my-com>
</div>
<body>
<script>
var vm = new Vue({
el: "#app",
data: {
msg: "123 啊 父组件中的数据"
},
methods: {},
components: {
MyCom: {
data() {
return {
title: "123",
content: "qqq",
comsVal:''
};
},
template: '<h1 @click="change">这是子组件----{{parentMsg}}</h1>',
props: ["parentMsg"],
methods:{
change(){
comsVal =this.parentMsg
console.log(comsVal)
}
},
}
}
});
</script>
</body>
</html>
·
·
·
情况二:子组件要给父组件传值方法,使用$emit
第一步:父组件向子组件传递方法,使用事件绑定机制 v-on,自定义一个事件属性,传递给子组件
第二步:在子组件中定义一个方法,在方法中,利用 $emit 触发 父组件传递过来的,挂载在当前实例上的事件,还可以传递参数
第三步:在子组件中调用定义的那个方法,就可以触发父组件传递过来的方法了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>子组件要给父组件传值方法,使用$emit</title>
<script src="../js/vue.js"></script>
</head>
<div id="app">
<!-- 事件绑定机制,传递给子 -->
<my-com @func="funshow"></my-com>
</div>
<template id="tmpl">
<div>
这是子组件
<input type="button" value="这是子组件的按钮,触发了父传来的" @click="myclick" />
</div>
</template>
<body>
<script>
var MyCom = {
template: "#tmpl",
data() {
return {
sonmsg: {
name: "小头儿子",
age: 3
}
};
},
methods: {
myclick() {
// console.log("ok")
this.$emit("func", this.sonmsg);
}
}
};
var vm = new Vue({
el: "#app",
data: {
datamsgFromson: null
},
methods: {
funshow(data) {
// console.log("调用了父组件身上的show方法====" + data1 + data2);
console.log("调用了父组件身上的show方法====" + data);
this.datamsgFromson = data;
console.log(data);
}
},
components: {
MyCom
}
});
</script>
</body>
</html>
·
·
·
情况三:父子组件之间相互传值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>父子组件之间相互传值</title>
<script src="../js/vue.js"></script>
</head>
<div id="app">
<!-- 父组件 -->
<Button type="primary" @click="getData">获取数据</Button>
<my-com :fdata="data1" :fmessage="data2" @show="showFather"></my-com>
<!-- fdata :fmessage 注意驼峰法改为横杆-->
</div>
<template id="tmpl">
<div>
<h1>子组件</h1>
<p>下面是父组件传过来的数据</p>
<p>第一个数据:{{fdata}}</p>
<p>第二个数据:{{fmessage}}</p>
<Button type="primary" @click="sonClick">触发父组件方法</Button>
</div>
</template>
<body>
<script>
var MyCom = {
template: "#tmpl",
props: ['fdata', 'fmessage'],
data() {
return {
sonMessage: '子组件数据sonMessage',
sonData: '子组件数据sonData'
};
},
methods: {
sonClick() {
console.log("子组件点击 调用@show==>",this.sonMessage, this.sonData)
this.$emit('show', this.sonMessage, this.sonData);
}
}
};
var vm = new Vue({
el: "#app",
data: {
data1: '父组件数据data1',
data2: '父组件数据data2',
fromson1: '',
fromson2: ''
},
methods: {
showFather (a, b) {
this.fromson1 = a;
this.fromson2 = b;
console.log('触发了父组件的方法' + '======' + a + '======' + b);
},
getData () {
console.log("调用方法-getData()")
console.log(this.fromson1);
console.log(this.fromson2);
}
},
components: {
MyCom
}
});
</script>
</body>
</html>
·
·
·
情况四:兄弟组件之间相互传值——>通过 e m i t / emit/ emit/on
通过$emit/$on
这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,巧妙而轻量地实现了任何组件间的通信,包括父子、兄弟、跨级
具体实现方式:
var Event=new Vue();
Event.$emit(事件名,数据);
Event.$on(事件名,data => {});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>兄弟组件之间相互传值</title>
<script src="../js/vue.js"></script>
</head>
<div id="app">
<my-a></my-a>
<my-b></my-b>
<my-c></my-c>
</div>
<template id="a">
<div>
<h3>A组件:{{nameA}}</h3>
<button @click="send">将数据发送给C组件</button>
</div>
</template>
<template id="b">
<div>
<h3>B组件:{{nameB}}</h3>
<button @click="send">将数组发送给C组件</button>
</div>
</template>
<template id="c">
<div>
<h3>C组件:{{nameA}},{{nameB}}</h3>
</div>
</template>
<body>
<script>
var Event = new Vue(); //定义一个空的Vue实例
var A = {
template: '#a',
data() {
return {
nameA: '组件A的数据'
}
},
methods: {
send() {
Event.$emit('data-a', this.nameA);
}
}
}
var B = {
template: '#b',
data() {
return {
nameB: '组件B的数据'
}
},
methods: {
send() {
Event.$emit('data-b', this.nameB);
}
}
}
var C = {
template: '#c',
data() {
return {
nameA: '',
nameB: ""
}
},
mounted() { //在模板编译完成后执行
Event.$on('data-a', nameA => {
this.nameA = nameA;
//箭头函数内部不会产生新的this,这边如果不用=>,this指代Event
})
Event.$on('data-b', nameB => {
this.nameB = nameB;
})
}
}
var vm = new Vue({
el: '#app',
components: {
'my-a': A,
'my-b': B,
'my-c': C
}
});
</script>
</body>
</html>
·
·
版本二:
在utils文件夹下面定义一个bus.js,这样一个中央事件总线就定好了,里面内容就这两行:
import Vue from 'vue'
export const Event = new Vue() // 定义一个事件总线
传递方:
import { Event } from '../../utils/bus' // 引入这个事件总线
export default {
data() {
userId: ''
}
watch: {
userId() { // 监听userId改变时触发事件,当然你可以在所有其他事件去触发$emit
Event.$emit('changeUser', userId) // $emit接收参数,一个是触发的事件名,一个是携带的参数
}
}
接收方:
import { Event } from '../../utils/bus' // 依然是把bus总线引进来
export default {
created() {
Event.$on('changeSonRoute',showIndex => { // $on接收发送方传给我们的数据
console.log(showIndex)
})
}
}
·
·
·
·
·
·
·
··
外部参考链接:
https://www.imooc.com/article/257885