【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.简单理解 有点类似于应式的感觉,我不管你要不要只 ...
随机推荐
- linux 在指定文件夹下查找指定字符
grep -r '119090610015743205' /data/html/www/gap_bz_middleware/storage/apiLogs/
- [转]理解神经网络:从神经元到RNN、CNN、深度学习
神经网络是目前最流行的机器学习算法之一.随着时间的推移,证明了神经网络在精度和速度方面,比其他的算法性能更好.并且形成了很多种类,像CNN(卷积神经网络),RNN,自编码,深度学习等等.神经网络对于数 ...
- 【kubeadm初始化报错】failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"
复现场景 环境 系统:Centos7 kubernetes:1.18.5 docker:19.03.9 复现步骤 1.通过 yum 或 rpm 安装 kubelet kubectl kubeadm,并 ...
- SqueezeNet/SqueezeNext简述 | 轻量级网络
SqueezeNet系列是比较早期且经典的轻量级网络,SqueezeNet使用Fire模块进行参数压缩,而SqueezeNext则在此基础上加入分离卷积进行改进.虽然SqueezeNet系列不如Mob ...
- opencv3.4.9 + armv7 + arm-linux-gnueabihf交叉编译
使用CMake指定交叉编译链会有很多报错,原因可能是其找交叉编译的库或这头文件会自动链接到本地的库或者头文件. 可以使用Qt设置好交叉编译环境后,将CMakeLists.txt文件放入,直接编译通过即 ...
- day06总结
字符串常用操作# ======================================基本使用======================================# 1.用途:记录描述 ...
- 实现 (5).add(3).minus(2) 功能
Number.prototype.add = function (number) { if (typeof number !== 'number') { throw new Error('请输入数字- ...
- Oracle基础介绍及常用相关sql*plus命令
以管理员身份运行Database Configuration Assistant,新建数据库实例. 要使用Oracle首先要启动Oracle服务,在任务管理器中找到服务,打开有关OracleServi ...
- 08 jwt源码剖析
08 jwt源码剖析 目录 08 jwt源码剖析 1. jwt认证流程 2.jwt创建token 2.1 原理 2.2 jwt校验token 3. jwt使用 4. 源码剖析 总结: JSON Web ...
- 空间金字塔池化 ssp-net
<Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition>,这篇paper提出了空间金字 ...