【Vue组件通信】props、$ref、$emit,组件传值
1、什么是组件通信
组件间如何通信,也就成为了vue中重点知识,组件通信,涉及到组件之间数据的传递、类似NET POST/GET参数传递。
Vue基本的三种传递方式** (props、\(ref、\)emit)** 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用。那么组件间如何通信,也就成为了vue中重点知识了。这篇文章将会通过props、$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信。
2、父子通信 (props、\(ref、\)emit) 区别
prop 着重于数据的传递,它并不能调用子组件里的属性data和方法methods。适合的场景是从父亲给孩子,给了之后就是给了,最适合使用prop,。
$ref 着重于索引,主要用来调用子组件里的属性和方法,其实并不擅长数据传递,但是也是可以传递参数的。
3、Props 父到子
3.1 参考代码
3.1.1 父页面
- 父页面调用子组件 参考(1)
- 引用子组件 参考(2)
- 注册局部组件 参考(3)
<template>
<div>
<h1>我是父组件!</h1>
<one-chart id="myChart" :height="500px" :width="500px" :chart-option="echartOption" />
<!-- (1)这是子组件--->
</div>
</template>
<script>
// (2)引用一下子组件 位置
import OneChart from '@/components/Charts/OneChart'
export default {
components: { OneChart }, // (3)注册一下组件
}
</script>
3.1.2 子页面
- props 写入需要的属性。props 支出类型【String、Number、Boolean、Array、Object、Date、Function、Symbol】,参考官网文档(组件props 介绍)
<template>
<h3>我是子组件!</h3>
</template>
<script>
import echarts from 'echarts'
import resize from './mixins/resize'
export default {
name: 'OneChart',
mixins: [resize],
props: {
className: {
type: String,
default: 'chart'
},
id: {
type: String,
default: 'chart'
},
width: {
type: String,
default: '200px'
},
height: {
type: String,
default: '200px'
},
chartOption: {
type: Object,
default: () => []
}
},
data() {
return {
chart: null
}
},
watch: {
chartOption: function() {
console.log('我是组件chart watch')
console.log(this.chartOption)
if (this.chartOption !== undefined && this.chartOption !== null) {
this.initChart()
}
}
},
mounted() {
console.log('我是组件chart mounted')
console.log(this.chartOption)
},
beforeDestroy() {
if (!this.chart) {
return
}
this.chart.dispose()
this.chart = null
},
methods: {
initChart() {
console.log(this)
}
}
}
</script>
3.2 扩展知识
- 单向数据流(从父到子,先父后子)
- 传递静态或动态 Prop(v-bind)
- 驼峰命名法等价短横线分隔命名
- 子组件继承父组件的属性
- 子组件继承父组件的属性,可以设置替换/合并已有的 Attribute(覆盖重写)、禁用 Attribute 继承
详细介绍文档https://cn.vuejs.org/v2/guide/components-props.html
4、ref 父到子
4.1 参考代码
4.1.1 父页面
<base-input ref="usernameInput"></base-input>
可以在父页面任意的使用,可以调用子页面的 methods
this.$refs.usernameInput.focus()
this.$refs.usernameInput.demo('我是参数,任意的那种')
4.1.2 子页面
methods: {
// 用来从父级组件聚焦输入框
focus: function () {
this.$refs.input.focus()
},
demo(data){
console.log(data)
}
}
4.2 扩展知识
- 尽管存在 prop 和事件,有的时候你仍可能需要在 JavaScript 里直接访问一个子组件。为了达到这个目的,你可以通过 ref 这个 attribute 为子组件赋予一个 ID 引用。例如:
- 当 ref 和 v-for 一起使用的时候,你得到的 ref 将会是一个包含了对应数据源的这些子组件的数组。
- $refs 只会在组件渲染完成之后生效,并且它们不是响应式的。这仅作为一个用于直接操作子组件的“逃生舱”——你应该避免在模板或计算属性中访问 $refs。
- ref 对子组件的方法属性的索引,通过$ref可能获取到在子组件里定义的属性和方法。
- 如果ref在普通的 DOM 元素上使用,引用指向的就是 DOM 元素,通过\(ref可能获取到该DOM 的属性集合,访问DOM元素,作用与JQ的 【\)('#ID')】类似。
5、emit 子到父
5.1 参考代码
5.1.1 父页面
<base-input ref="usernameInput" @inputShowMsg="showMsg" ></base-input>
methods: {
// 用来从父级组件聚焦输入框
focus: function () {
this.$refs.input.focus()
},
showMsg(data){
console.log('showMsg')
console.log(data)
//data 输出: 我是组件的参数,接收一下啊
}
}
### 4.1.2 子页面
methods: {
demo(data){
console.log('demo')
console.log(data)
this.$emit('getMessage', '我是组件的参数,接收一下啊')
}
}
### 5.2 扩展知识
- emit 是程序化的事件侦听器,它可以被 v-on 侦听
- 包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on="$listeners" 传入**内部组件**——在创建更高层次的组件时非常有用。
【Vue组件通信】props、$ref、$emit,组件传值的更多相关文章
- vue组件通信(props,$emit,$attrs,$listeners)
朝颜陌 vue基础----组件通信(props,$emit,$attrs,$listeners) 一.父传子,子传孙 1. props 1>在父组件中通过子组件自定义的标签属性来传递数据. ...
- vue—组件通信,ref
组件通信: 父组件传递子组件: 把需要的数据 传递给 子组件的数据,以数据绑定(v-bind)的形式,传递到子组件内部,供子组件使用,缩写(:) 动态传递: 第一步:在父组件中的子组件标签中进行动态的 ...
- vue基础----组件通信(props,$emit,$attrs,$listeners)
一.父传子,子传孙 1. props 1>在父组件中通过子组件自定义的标签属性来传递数据. 2>在子组件中通过props声明希望用到的数据 <body> <div id= ...
- vue 父子组件通信-props
父组件:引用了ComBack组件 ComBack组件:引用了BasicInfor组件 先使用props获取父组件的headInfo这个对象,这里注意(default)默认返回值要用工厂形式返回 Bas ...
- vue组件通信之非父子组件通信
什么顺序不顺序的.. 先来说说非父子组件通信. 首先,我们先来了解下vue中的 1.$emit 触发当前实例上的事件,附加参数都会传给监听器回调. 2.$on 监听当前实例上的自定义事件.事件可以 ...
- react初探(二)之父子组件通信、封装公共组件
一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么 ...
- Vue组件通信之非父子组件传值
前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是 ...
- vue组件通信之任意级组件之间的通信
<div id="app"> <comp1></comp1> <comp2></comp2> </div> ...
- VUE简单组件通信
[x] 1.prop组件通信 1.简单理解 2.多层嵌套 [x] 2.使用ref进行组件通信 [x] 3.$emit组件通信 1.prop组件通信 1.简单理解 有点类似于应式的感觉,我不管你要不要只 ...
随机推荐
- IOT设备SmartConfig实现
一般情况下,IOT设备(针对wifi设备)在智能化过程中需要连接到家庭路由.但在此之前,需要将wifi信息(通常是ssid和password,即名字和密码)发给设备,这一步骤被称为配网.移动设备如An ...
- 入门大数据---Spark开发环境搭建
一.安装Spark 1.1 下载并解压 官方下载地址:http://spark.apache.org/downloads.html ,选择 Spark 版本和对应的 Hadoop 版本后再下载: 解压 ...
- 平时Chrome中用的一些插件
一.chrome://extensions Adblock Plus Dark Reader 让网站黑色主题 Infinity 新标签页 一个比较流行的新标签页工具 GNOME Shell integ ...
- Spring Boot — 运行应用程序5种方式
1. 从IDE中的Run 按钮运行 你可以从IDE中运行Spring Boot应用, 就像一个简单的Java应用, 但是, 你首先需要导入项目. 导入步骤跟你的IDE和构建系统有关. 大多数IDEs能 ...
- METS介绍
METS介绍 首页 > 关于METS > METS介绍 医护英语水平考试(Medical English Test System, 以下简称:METS)是由教育部考试中心与中国国际 ...
- JavaScript基础Curry化(021)
时候我们希望函数可以分步接受参数,并在所有参数都到位后得到执行结果.为了实现这种机制,我们先了解函数在Javascript中的应用过程: 1. 函数的“应用”(Function Application ...
- MongoDB安装和入门
什么是MongoDB MongoDB是一个文档数据库,提供好的性能,领先的非关系型数据库.采用BSON存储文档数据.2007年10月,MongoDB由10gen团队所发展.2009年2月首度推出.Mo ...
- html5中二进制对象Blob的使用——Blob与ArrayBuffer、TypeArray和String的相互转换
在网页开发中遇到这样一个问题,在使用select的时候,想让里面的文字水平居中.首先想到的是text-align:center;但是发现在Chrome浏览器下不兼容,需要使用到text-align-l ...
- activiti6基础01-如何数据库操作及相关表
官网文档:https://www.activiti.org/userguide/#queryAPI 1. Activit的简单源码解读 activiti的官方文档讲解详细很详细,也很范.按着 ...
- linux系统配置常用命令top
本人测试系统:centos7 命令名称:top Linux top命令用于实时显示 process 的动态. 参数:-b 批处理 -c 显示完整的治命令 -I 忽略失效过程 -s 保密模式 -S 累积 ...