<>第一种:props和$emit()
parent.vue
<template> <div id="app"> <div>父组件:{{message}}</div> <ChildrenComponet
:message="message" @changeMsgFn="message=$event"/> </div> </template> <script>
import ChildrenComponet from './components/ChildrenComponet.vue' export default
{ name: 'App', data(){ return{ message:'默认数据' } }, components: {
ChildrenComponet }, methods:{ changeMessage(msg){ console.log(msg) this.message
= 'Bye'; } } } </script>
children.vue
<template> <div> 子组件:{{message}} <button @click="handleClick">按钮</button>
</div> </template> <script> export default { props:['message'], methods:{
handleClick(){ this.$emit('changeMsgFn','Bye') } } } </script> <style> </style>
按按钮之前:
按按钮之后:
<>第二种,回调函数callback
parent.vue
<template> <div id="app"> ------父组件------ {{message}} <ChildrenComponet
:message="message" :changeMsgFn="changeMessage"/> </div> </template> <script>
import ChildrenComponet from './components/ChildrenComponet.vue' export default
{ name: 'App', data(){ return{ message: 'hello!' } }, components: {
ChildrenComponet }, methods:{ changeMessage(){ this.message = 'Bye' } } }
</script> <template> <div> ------子组件------ {{message}} <button
@click="changeMsgFn">按钮</button> </div> </template> <script> // import
GrandChild from './GrandChild.vue' export default { props: ['message',
'changeMsgFn'], components:{ // GrandChild }, data(){ return { } }, methods:{ }
} </script>
点击按钮前:
点击按钮后:
<>第三种,$parent和$children
parent.vue
<template> <div id="app"> <div>父组件:{{message}}</div> <ChildrenComponet
:message="message"/> <button @click="changeChildrenNumber">改变子number</button>
</div> </template> <script> import ChildrenComponet from
'./components/ChildrenComponet.vue' export default { name: 'App', data(){
return{ message:'默认数据' } }, components: { ChildrenComponet }, methods:{
changeChildrenNumber(){ this.$children[0].number = 50 } } } </script>
children.vue
<template> <div> 子组件:{{number}} <button @click="handleClick">按钮</button>
</div> </template> <script> export default { data(){ return { number:'初始number'
} }, props:['message'], methods:{ handleClick(){ this.$parent[0].message =
'测试$parent,我是子组件' } } } </script> <style> </style>
点击“改变子number”前:
点击“改变子number”后
children.vue
<template> <div> 子组件:{{number}} <button
@click="handleClick">改变父number,测试$parent</button> </div> </template> <script>
export default { data(){ return { number:'初始number' } }, methods:{
handleClick(){ this.$parent.message = '改变$parent成功' } } } </script> <style>
</style>
parent.vue
<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png">
<div>父组件:{{message}}</div> <ChildrenComponet/> <button
@click="changeChildrenNumber">改变子number</button> </div> </template> <script>
import ChildrenComponet from './components/ChildrenComponet.vue' export default
{ name: 'App', data(){ return{ message:'默认数据' } }, components: {
ChildrenComponet }, methods:{ changeChildrenNumber(){ this.$children[0].number
= 50 } } } </script>
点击前:
点击后:
<>第四种,provide和inject
parent.vue
<template> <div id="app"> <ChildrenComponet/> </div> </template> <script>
import ChildrenComponet from './components/ChildrenComponet.vue' export default
{ name: 'App', data(){ return{ } }, provide:{ message:"hello" }, components: {
ChildrenComponet }, methods:{ } } </script>
children.vue
<template> <div> 子组件:{{message}} </div> </template> <script> export default {
inject:['message'], data(){ return { } }, methods:{ } } </script>
运行结果:
<>第五种,$attrs+$listeners
parent.vue
<template> <div id="app"> ------父组件------ <div>姓名:{{ name }}</div> <div>年龄:{{
age }}</div> <ChildrenComponet :name="name" :age="age"
@changeName="changeName"/> </div> </template> <script> import ChildrenComponet
from './components/ChildrenComponet.vue' export default { name: 'App', data(){
return{ name:'小米', age: 33, } }, components: { ChildrenComponet }, methods:{
changeName(){ this.name = '小夏' } } } </script>
children.vue
<template> <div> ------子组件------ <button
@click="$listeners.changeName">按钮</button> <GrandChild v-bind="$attrs" />
</div> </template> <script> import GrandChild from './GrandChild.vue' export
default { components:{ GrandChild }, data(){ return { } }, methods:{ } }
</script>
GrandChildren.vue
<template> <div> ------孙组件------ 姓名:{{$attrs.name}} 年龄:{{$attrs.age}} </div>
</template> <script> export default { } </script> <style> </style>
运行结果(从父亲传到了孙子):
点击按钮后:
<>第六种,ref
parent.vue
<template> <div id="app"> ------父组件------ <ChildrenComponet ref="childComp"/>
<button @click="changeName">按钮</button> </div> </template> <script> import
ChildrenComponet from './components/ChildrenComponet.vue' export default {
name: 'App', data(){ return{ name:'小米', age: 33, } }, components: {
ChildrenComponet }, methods:{ changeName(){ console.log('点击前',
this.$refs.childComp.age) this.$refs.childComp.changeAge() console.log('点击后',
this.$refs.childComp.age) } } } </script>
children.vue
<template> <div> ------子组件------ </div> </template> <script> // import
GrandChild from './GrandChild.vue' export default { components:{ // GrandChild
}, data(){ return { age:20 } }, methods:{ changeAge(){ this.age = 50 } } }
</script>
点击后: