【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.简单理解 有点类似于应式的感觉,我不管你要不要只 ...
随机推荐
- Python 简明教程 --- 9,Python 编码
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 当你选择了一种语言,意味着你还选择了一组技术.一个社区. -- Joshua Bloch 目录 1, ...
- app自动化测试环境配置:adb环境配置、monkey环境配置、appium环境配置大全
1. 安装jdk 2. 安装配置Andriod sdk 安装Andriod sdk前首先需要安装配置好jdk环境. 然后安装Android sdk 安装完成后需要配置环境变量:ANDROID_HOME ...
- JDK8 日期格式化
SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...
- 问题记录--jekyll serve 启动的时候如何指定80端口
jekyll serve --host 0.0.0.0 --port 80 启动失败
- 构建者模式Builder创建对象
构建者(Builder)设计模式(又叫生成器设计模式): 当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如Config.VO.PO.Entity...),要创建的话可能就需要了解这个类的 ...
- python使用数组实现链表的策略分析
python实现链表数据结构:数组/节点与引用 使用数组策略: 使用数组存储指向其他对象的引用 数组存储空间过度分配 数组填满后,分配一个更大的数组,将旧数组的内容复制到新数组中 class Arra ...
- 谈谈你对 TCP 三次握手和四次挥手的理解
TCP三次握手: 1.客户端发送syn包到服务器,等待服务器确认接收. 2.服务器确认接收syn包并确认客户的syn,并发送回来一个syn+ack的包给客户端. 3.客户端确认接收服务器的syn+ac ...
- order by 注入姿势
order by 注入原理 其实orde by 注入也是sql注入的一种,原理都一样就是mysql语法的区别,order by是用来排序的语法. sql-lab讲解 判断方法 1.通过做运算来判断如: ...
- python 输出日志到文件和控制台
import logging # 第一步,创建一个logger logger = logging.getLogger() logger.setLevel(logging.INFO) # Log等级总开 ...
- 如何用HMS Nearby Service给自己的App添加近距离数据传输功能
当你给朋友发送手机资料时,过了很久进度条却动也不动:当你想发送大文件给同事时,仅一个文件就用光了你所有流量:当你跟朋友乘坐飞机时想一起玩游戏时,却因没有网络无奈放弃. 们生活中似乎经常能遇到这 ...