vue父子组件通信方式哪几种
第一种: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>
点击后:
vue父子组件通信方式哪几种相关推荐
- Vue父子组件通信的三种方式 props、@eventName、$on
前言 vue 开发中,免不了会用到父子组件的通信,比如调用父类组件的方法或者变量:再比如父组件调用子组件的方法:父子组件相互传递数据等,本文主要通过讲解 三种方式(props.evnetName.ev ...
- vue父子组件通信方式
1.props+$emit ①父组件引用子组件,并在子组件上v-bind,绑定要传的数据,同时注册引入子组件, 子组件通过props接收父组件传过来的数据,然后通过this.$props.值来用 举例 ...
- vue父子组件的三种传值方式
vue父子组件的三种传值方式 函数类型的props传值 //父组件 <template><Children :getChildName="getChildName" ...
- vue父子组件通信以及非父子组件通信的方法
组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...
- vue父子组件传值之 $emit和props
vue父子组件传值之 $emit和props 前言 子组件向父组件传值 父组件向子组件传值 前言 在进行vue的项目中,我们难免会需要父子组件之间进行传值,父子组件传值可以通过 $emit和props ...
- vue父子组件传值的一些坑(深浅拷贝)
本文章转载:https://www.yht7.com/news/116487 1.问题描述 父组件传值给子组件,子组件改变传过来的值后,父组件的值也会跟着改变. 这个问题比较冷门,平时如果对组件通信使 ...
- vue 父子组件通信详解
这是一篇详细讲解vue父子组件之间通信的文章,初始学习vue的时候,总是搞不清楚几个情况 通过props在父子组件传值时,v-bind:data="data",props接收的到底 ...
- vue父子组件生命周期顺序_vue父子组件生命周期执行顺序
Parent -- Child1 -- Child2 装载 parent beforeCreate parent created parent beforeMount child1 beforeCre ...
- [vue] vue父子组件双向绑定的方法有哪些?
[vue] vue父子组件双向绑定的方法有哪些? 1.利用对象的引用关系来实现 2.父子组件之间的数据传递 3.使用.sync修饰符 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但 ...
最新文章
- 如何维持整洁的 Git 提交记录?送你三个锦囊!
- azure多功能成像好用吗_Azure持久功能简介:模式和最佳实践
- android标题栏上增加按钮,Android:向自定义标题栏添加按钮
- vuecli3修改项目启动端口
- flask项目源码_源码解读:Flask上下文与代理模式
- SpringMVC Hello World
- Mac下最好用的离线词典-欧陆词典破解版
- 货币代码php,PHP货币换算程序代码_PHP教程
- 2020-02-24
- iOS 5.1实现旋转屏幕
- LaTeX入门学习(2)(安装)
- Oracle表空间已满解决方案
- Axure导入元件库的两种方式-附完整元件库
- 基于51单片机GPS定位公交车自动报站系统(程序+原理图+PCB+论文+全套资料)
- XMD DTD约束 实体学习X1 普通实体 参数实体 内部实体 外部实体 内置实体 解析实体 不解析实体 实体声明 实体引用 字符引用...
- [乐意黎原创] 地铁和轻轨的区别, 中国目前有几个城市有地铁
- VS2017、opencv安装
- ERROR in Entry module not found: Error: Can‘t resolve ‘./src‘ in ‘D:\contract\ipfs\go-ipfs\react_app
- Excel 写入复制模板,写入数据并下载
- ResizeObserver loop limit exceeded
热门文章
- COLORCAST free :进入苹果、谷歌、Amazon推荐的Cocos2d-x游戏
- [Arm]使用modprobe时 “modprobe: can‘t change directory to ...”
- java基础学习-6
- 最短路——Dijkstra算法 HDU2066
- 基于离散三点计算曲率圆的方法
- ICMP redirect
- 微信小程序 打开小程序设置页(wx.openSetting)接口调整官方
- 震源机制(Focal Mechanism)之沙滩球(Beach Ball)
- 静默删除oracle,静默安装卸载 ORACLE
- defer和async