子组件传父组件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 子组件绑定自定义事件(send),触发父组件中接收数据的函数(get()),get()里面参数是固定的$event -->
<child @send="get($event)"></child>
</div>
<script>
Vue.component("child", {
data() {
return {
ctext: '你的名字',
name: 'zs'
}
},
// 通过某个事件触发$emit(),$emit()第一个参数是一个自定义事件,第二个参数是哟啊发送的数据,可以是单个也可以是[]也可以是{}
template: `<div>
<button @click="$emit('send',name)">发送</button>
</div>`
})
const vm = new Vue({
el: "#app",
data: {
pmsg: '父组件的内容',
text: null
},
methods: {
// 父组件获取数据的函数
get(data) {
this.text = data
console.log(this.text);
}
}
})
</script>
</body>
</html>
父组件传子组件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 属性优先于属性绑定 -->
<!-- 这里显示的是父组件传过来的属性 -->
<!-- <hello :pmsg="msg" pmsg="父组件传过来的属性"></hello> -->
<hello :pmsg="msg" cmsg="父组件传过来的属性" :test="text"></hello>
</div>
<script>
Vue.component("uname", {
props: ["test"],
template: `<div>{{test}}</div>`
})
Vue.component("hello", {
// 通过props属性接收父组件传来的值
props: ["cmsg", "pmsg", "test"],
// :test="test"里面的值"test"是从hello组件里面拿的而不是父组件拿的
template: `<div>{{pmsg}}---{{cmsg}}<uname :test="test"></uname></div>`
})
const vn = new Vue({
el: "#app",
data: {
msg: "我是父组件的msg",
text: "你的名字"
},
methods: {
},
})
</script>
</body>
</html>
同级组件事件互传:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
<to></to>
<get></get>
</div>
<script>
// 定义一个事件中心hub
const hub = new Vue()
Vue.component("to", {
data() {
return {
toText: '你的名字',
getText: ''
}
},
// 发送的事件text
methods: {
to() {
// 发送方,text是传送的事件
hub.$emit('text', this.toText)
}
},
// 接收的事件为test
mounted() {
// $on是监听
hub.$on('test', (data) => {
this.getText = data
console.log(data);
})
},
// 通过某个事件触发发送数据的函数
template: `<div><button @click="to">发送数据</button><br/>传过来的数据是:{{getText}}</div>`,
})
Vue.component("get", {
data() {
return {
toText: '你叫什么名字',
getText: ''
}
},
// 发送的事件test
methods: {
// 发送方是hub.$emit()
to() {
// 发送方,text是传送的事件
hub.$emit('test', this.toText)
}
},
// 接收的事件text
mounted() {
// 接收方是hub.$on()
hub.$on("text", (data) => {
this.getText = data
})
},
template: `<div><button @click="to">发送数据</button><br/>传过来的数据是:{{getText}}</div>`
})
const vm = new Vue({
el: "#app",
})
</script>
</body>
</html>
综合:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./js/vue.js"></script>
</head>
<body>
<div id="app">
<!-- 在没有插槽的时候可以用单标签 -->
<!-- p-to-c:属性绑定 -->
<!-- <hello :msg="msg"></hello> -->
<!-- c-to-p:自定义事件触发父组件中接收数据的函数,父组件接收函数的参数$event是固定不变的 -->
<!-- c-to-p -->
<!-- <hello @fn="gettext($event)"></hello> -->
<tom></tom>
<jack></jack>
</div>
<script>
// p-to-c
/* Vue.component("hello", {
props: ["msg"],
template: `<div>{{msg}}</div>`,
}) */
// c-to-p
/* Vue.component("hello", {
data() {
return {
text: "我是子组件的文本信息"
}
},
// 子组件通过某个事件触发$emit()事件,$emit(x,y)里面的第一个参数x为子组件的自定义事件,y为要传给父组件的数据
template: `<div><button @click="$emit('fn',text)">发送数据</button></div>`,
}) */
const hub = new Vue()
Vue.component("tom", {
data() {
return {
msg: "早上好"
}
},
methods: {
toHi() {
hub.$emit("sayHi", this.msg)
}
},
template: `<div><button @click="toHi">发送数据</button></div>`
})
Vue.component("jack", {
data() {
return {
msg: ""
}
},
mounted() {
hub.$on("sayHi", (data) => {
this.msg = data
})
},
template: `<div>{{msg}}</div>`
})
const vm = new Vue({
el: "#app ",
data: {
msg: "我是父组件的文本信息 ",
text: ''
},
// c-to-p
/* methods: {
// ,接收子组件传送数据过来的函数,函数里的data就是$event
gettext(data) {
this.text = data
console.log(this.text);
}
} */
})
</script>
</body>
</html>