本章内容:
组件之间的数据传递 (传值)
子组件不能修改父组件传递的数据, 需要勒令父组件更改数据。
<div id="app">
<child :msg="message">child>
div>
Vue.component("child", {
props: ["msg"], // 在【子组件】中,通过【props属性】来接收【自定义属性】,之后即可使用。
template: `
{{msg}}
`
})
new Vue({
el: "#app",
data: {
message: "Heelo Vuejs"
}
})
<div id="app">
<child @send-data="getSendData">child>
<h3>子组件发送的数据为: {{message}}h3>
div>
Vue.component("child", {
data() {
return {
message: "向父组件通信"
}
},
methods: {
send() {
// 由事件驱动,向自身派发一个事件,并传递一些数据。
this.$emit("send-data", this.message, true, 7788);
}
},
template: `
`
})
new Vue({
el: "#app",
data: {
message: ''
},
methods: {
getSendData(data, flag, num) { // 在父组件中监听子组件派发的事件。
this.message = data;
console.log(data, flag, num);
}
}
})
<div id="app">
<child :n="num" @send="plus()">child>
div>
const Child = {
props: {
n: {
type: Number, // 指明我所期盼的数据类型
required: true // 是否必传
}
},
methods: {
add() {
this.$emit('send'); // 派发一个事件。
}
},
template: `
{{n}}
`
}
new Vue({
el: "#app",
data: {
num: 1
},
methods: {
plus() { // 与子组件派发的事件进行绑定
this.num ++;
}
},
components: {
Child
}
})
<div id="app">
<sibling1>sibling1>
<sibling2>sibling2>
div>
let vm = new Vue(); // 兄弟之间通信需要借助一个全局Vue实例,用这个变量来派发自定义事件及数据。
const Sibling2 = {
data() { // 组件`data`必须时一个函数,并且`return`一个对象。
return {
message: ''
}
},
template: `
我是兄弟二,兄弟一发送来的数据为: {{message}}
`,
mounted() {
vm.$on("send", (val) => { // 使用$on来监听vm实例上的自定义事件。
this.message = val; // val为我们传递的数据。
})
}
}
const Sibling1 = {
data() {
return {
message: "Hello Vuejs"
}
},
methods: {
send() {
// 通过事件触发,向vm实例派发一个自定义事件并携带参数。
vm.$emit("send", this.message);
}
},
template: `
我是兄弟一,我要向兄弟二传递数据
`
}
new Vue({
el: "#app",
components: {
Sibling1,
Sibling2
}
})
new Vue({
el: "#app",
data: {
message: "Hello Vuejs",
iphone: 0 || [1, 2, 3]
},
components: {
child: {
props: ["msg"], // 不推荐这种写法,推荐下面的写法。
props: {
msg:{
type: String, // 指明我所期盼的数据类型,如果不是指定的类型,会报错。
default: "没有传进来数据" // 如果父组件没有传递数据,会给到一个default的默认值。
},
num: {
type: [Number, Array], // 指明多种期盼的数据类型 。
required: true // 是否必传, required和default不能共存, 只能选
}
},
template: `
msg --- {{msg}}
num --- {{num}}
`
}
},
// Vue实例内声明的`template`会覆盖掉Vue接管的范围,所以需要重新声明一下`div#app`。
template: `
`
})