vue七种实现组建通信的方法
组件通信
1、props 父组件--->子组件通信
- 父组件---属性的方式传值给子组件
- 子组件---props方式接收数据
<Son :datas="fData"></Son>
<script>
import Son from '@/components/son'
export default{
name:'Father',
components:{Son},
data(){
return{
fData:'我是父组件向子组件传递的值-props方式'
}
}
}
</script>
子组件props接受的参数名称,要与父组件传递时定义的属性名一致
<template>
<div>我是父组件的数据:{{fData}}</div>
<div @click=changeData>我是父组件传递修改后的数据:{{mydata}}</div>
</template>
<script>
export default{
name:'Son',
props:{
fData:{
type:String,
default:''
}
}
data(){
mydata:this.fatherData
},
methods:{
changeData(){
this.mydata += '改变数据'
}
},
}
</script>
- 注意:
- 子组件不能够直接去修改父组件传递的值修改的:因为Vue的单向数据流机制,如果直接修改那父组件的值就被“污染”了。(props是单向绑定的(只读属性):当父组件的属性变化时,将传导给子组件,但是反过来不会)
报错信息大概是:vue使用prop通信出错:Avoid mutating a prop directly since the value will be overwritten whenever the parent
- 解决方案:可以在子组件内定义一个变量mydata去接收fData数据
- 参数传递类型不确定是可以这么写:
props:{
fData:{
type:[String,Number],
default:''
}
}
- 子组件不能够直接去修改父组件传递的值修改的:因为Vue的单向数据流机制,如果直接修改那父组件的值就被“污染”了。(props是单向绑定的(只读属性):当父组件的属性变化时,将传导给子组件,但是反过来不会)
2、$emit 子组件--->父组件传递
- 子组件绑定自定义事件
- $emit()第一个参数为:自定义的事件名称,第二个参数为:需要传递的数据
- 使用 $emit() 触发更改数据
子组件
<el-button @click="handleEmit">改变父组件</el-button>
<script>
export default{
name:'Son',
methods:{
handleEmit(){
this.$emit('triggerEmit','子组件的数据')
}
}
}
</script>
父组件(子组件发送的事件名称,要和父组件接受的事件名称一致)
<Son @triggerEmit="changeData"></Son>
<script>
import Son from '@/components/son'
export default{
name:'Father',
components:{Son},
methods:{
changeData(name){
console.log(name) // => 我是来自子组件的数据
}
}
}
</script>
$emit与props结合 兄弟组件传值
- 父组件引入两个子组件
- 父组件充当一个桥梁作用
父组件
<childA :myName="name"></ChildA>
<ChildB :myName="name" @changeName="editName"></ChildB>
export default{
data() {
return {
name: '数据你好'
}
},
methods: {
editName(name){
this.name = name
}
}
}
子组件B改变,接收数据
<p>姓名:{{ myName }}</p>
<button @click="changeName">修改姓名</button>
<script>
export default{
props: {
myName:String
},
methods: {
changeName() {
this.$emit('changeName', '新数据名称')
}
}
}
</script>
子组件A接收数据
<p>姓名:{{ newName }}</p>
<script>
export default{
props: {
myName:String
}
}
</script>
3、bus(事件总线) 兄弟组件通信
非父子组件或更多层级间组件间传值,在Vue中通过单独的事件中心来管理组件间的传值
创建一个公共的bus.js文件
暴露出Vue实例
传递数据方,通过一个事件触发bus.$emit(方法名,传递的数据)
接收数据方,在生命周期函数中,通过bus.$on(方法名,[params])来监听
销毁事件,在接受数据方,通过bus.$off(方法名)销毁之后无法监听数据
import Vue from "vue"
const bus=new Vue()
export default bus
需要改变数据的组件中定义调用
<template>
<div>
<div>我是通信组件A</div>
<button @click="changeName">修改姓名</button>
</div>
</template>
<script>
import bus from "@/utils/Bus.js";
export default {
components: {},
data() {
return {};
},
mounted() {
console.log(bus);
},
methods: {
changeName() {
bus.$emit("editName", "数据集!");
},
},
};
</script>
<style lang='scss' scoped>
</style>
另外一个组件中同样引入bus.js文件,通过$on监听事件回调
<template>
<div>
<span>名称:{{name}}</span>
<div>我是通信组件B</div>
</div>
</template>
<script>
import bus from "@/utils/Bus.js";
export default {
components: {},
data() {
return {name};
},
mounted() {
bus.$on("editName", (name) => {
this.name=name
console.log(name); //
});
},
methods: {},
};
</script>
<style lang='scss' scoped>
</style>
4、$parent、$children 直接访问组件实例
- 子组件通过---> $parent 获得父组件实例
- 父组件通过---> $children 获得子组件实例数组
子组件---this.$parent可以获取到父组件的方法、data的数据等,并可以直接使用和执行
<template>
<div>我是子组件</div>
</template>
<script>
export default{
name:"Son",
data(){
return{
sonTitle: '我是子组件的数据'
}
},
methods:{
sonHandle(){
console.log('我是子组件的方法')
}
},
created(){
console.log(this.$parent)
console.log(this.$parent.fatherTitle) // => 我是父组件的数据
this.$parent.fantherHandle() // => 我是父组件的方法
}
}
</script>
父组件 --- 获取子组件实例的,并且获取的实例是一个数组形式,this.$children[0]才可以获取某个组件实例,并调用组件方法和数据
<template>
<div>
<Son>我是父组件</Son>
</div>
</template>
<script>
import Son from './son.vue'
export default{
name: 'father',
components:{
Son
},
data(){
return{
fatherTitle: '我是父组件的数据'
}
},
methods:{
fantherHandle(){
console.log('我是父组件的方法')
}
},
mounted(){
console.log(this.$children)
console.log(this.$children[0].sonTitle) // => 我是子组件的数据
this.$children[0].sonHandle() // => 我是子组件的方法
}
}
</script>
5、$refs
ref被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的 $refs 对象上。
父组件使用 $refs 获得组件实例
<template>
<div>
<Son ref="son"></Son>
</div>
</template>
<script>
import Son from './son.vue'
export default{
name: 'father',
components:{
Son
},
mounted(){
console.log(this.$refs.son) /*组件实例*/
}
}
</script>
6、provide/inject(提供/注入) 多组件或深层次组件通信
- 父组件使用 provide 注入数据
- 子组件使用 inject 使用数据
/*父组件*/
export default{
provide: {
return{
provideName: '贩卖前端仔'
}
}
}
至此provideName这个变量可以提供给它其下的所有子组件,包括曾孙、孙子组件等,只需要使用 inject 就能获取数据
/*子组件*/
export default{
inject: ['provideName'],
created () {
console.log(this.provideName) // => "贩卖前端仔"
}
}
- 父组件不需要知道哪个组件使用它提供出去的数据
- 子附件不需要知道这个数据从哪里来
7、vuex状态管理
- 相当于一个公共数据的仓库
- 提供一些方法管理仓库数据
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
},
modules: {
}
})
vue七种实现组建通信的方法的更多相关文章
- Select Top在七种数据库中的使用方法(包含mysql)
1. Oracle数据库 SELECT * FROM TABLE1 WHERE ROWNUM<=N 2. Infomix数据库 SELECT FIRST N * FROM TABLE1 3. D ...
- JavaScript 用七种方式教你判断一个变量是否为数组类型
JavaScript 如何判断一个变量是否为数组类型 引言 正文 方法一 方法二 方法三 方法四 方法五 方法六 方法七 结束语 引言 我们如何判断一个变量是否为数组类型呢? 今天来给大家介绍七种方式 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
- Vue 定义组件模板的七种方式(一般用单文件组件更好)
在 Vue 中定义一个组件模板,至少有七种不同的方式(或许还有其它我不知道的方式): 字符串 模板字面量 x-template 内联模板 render 函数 JSF 单文件组件 在这篇文章中,我将通过 ...
- js刷新框架子页面的七种方法代码
面以三个页面分别命名为framedemo.html,top.html,button.html为例来具体说明如何做.其中framedemo.html由上下两个页面组成,代码如下: <!DOCTYP ...
- AOP在 .NET中的七种实现方法
7Approaches for AOP in .Net AOP在 .NET中的七种实现方法 Here are all the ways that I can think of to add AOPto ...
- asp.net(c#)网页跳转七种方法小结
在asp.net下,经常需要页面的跳转,下面是具体的几种方法.跳转页面是大部编辑语言中都会有的,正面我们来分别介绍一下关于.net中response.redirect sever.execute se ...
- 用JavaScript刷新框架子页面的七种方法
下面以三个页面分别命名为framedemo.html,top.html,button.html为例来具体说明如何做. 其中framedemo.html由上下两个页面组成,代码如下: < !DOC ...
- JS七种加密解密方法
http://www.cnblogs.com/mq0036/p/4983858.html HTML或JS加密解密 本文一共介绍了七种方法: 一:最简单的加密解密 二:转义字符"\&q ...
随机推荐
- 【LeetCode】297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 知识点:二叉树:递归 题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一 ...
- Verilog定点数计算
https://blog.csdn.net/maxwell2ic/article/details/80620991 https://blog.csdn.net/mdpsdhr/article/deta ...
- 文件上传靶机DVWA和upload-labs
DVWA靶机 LOW <?php phpinfo() ?> 上传文件 Medium级别 修改Content-Type: application/octet-stream的值为jpg的格式为 ...
- GhostScript 沙箱绕过(命令执行)漏洞(CVE-2018-19475)
影响范围 Ghostscript 9.24之前版本 将POC作为图片上传,执行命令,抓包 POST /index.php HTTP/1.1 Host: target Accept-Encoding: ...
- JSP的执行原理、JSP的内置对象、四大作用域解析、MVC模式理解>从零开始学JAVA系列
目录 JSP的执行原理.JSP的内置对象.四大作用域解析.MVC模式理解 JSP的执行原理 这里拿一个小例子来解析JSP是如何被访问到的 首先将该项目部署到tomcat,并且通过tomcat启动 通过 ...
- Markdown插入LaTex数学公式
本文转载自Nautilus_sailing的试试LaTeX插入数学公式,内容有所改动 今天写了一篇随笔,其中需要写几个数学式子,但是我又不想直接将公式做成图片后插入,我觉得很不美观还麻烦.但是我也不会 ...
- 【网络编程】TCPIP_1_快速入门
目录 前言 1. 快速入门 1.1 服务端编程简要步骤 1.2 客户端编程简要步骤 1.3 参考 前言 说明: demo 基于 Linux. 1. 快速入门 以下步骤简略了很多细节,但是通过下面的几个 ...
- DrJava试用笔记
安装方便:只要配好JAVA_HOME,用java -jar drjava-stable-20120818-r5686.jar即可启动,算是绿色软件: 特色功能:交互式命令行,可以在调试程序时改变变量值 ...
- CVE-2020-2555漏洞复现&&流量分析
CVE-2020-2555漏洞复现&&流量分析 一.准备环境 windows7: weblogic 12.2.1.4.0 JDK版本为jdk-8u261 关于weblogic搭建可以看 ...
- STM32—位带操作
STM32中的位带操作: 名字为位带操作,实际上是对位的操作,位操作就是可以单独的对一个比特位读和写,这个在 51 单片机中非常常见. 51 单片机中通过关键字 sbit 来实现位定义, STM32 ...