Vue.js 组件数据交互
1.前言
- 本节讲述组件之间如何进行数据交互
2.props属性与非 prop 的属性
父组件通过属性绑定的形式传值给子组件,这种传值分2种
| 类别 | 含义 | 说明 |
|---|---|---|
| props | 子组件本身已经通过props定义过,有明确的用途 | 传递的数据如何渲染取决于代码编写 |
| 非 prop | 未经过props定义,无法预知其用途 | 直接渲染到根标签中 |
3.props传递与接收
- 在父组件中把要传递的数据通过属性的形式绑定到子组件标签上,属性名不却分大小写,支持驼峰法命名
<child-component :title="title" :list="list"></child-component>
- 子组件通过props字段进行定义接收(数据类型和默认值)
var childComponent = {
data(){
return {}
},
props:{
title:{
//数据类型包括: String,Number,Array,Object,Boolean等
type:String,
default:""
},
list:{
type:Array,
//默认值是数字或者对象,需要定义function进行返回
default:function(){
return []
}
}
}
}
- 对于布尔值,传递属性却没有值的情况,相当于传入了true
<!-- 包含该 prop 没有值的情况在内,都意味着 `true`。-->
<blog-post is-published></blog-post>
- 单项数据流:父组件数据发生改变,会触发子组件视图更新,而反过来就不会(引用数据类型除外)
4.自定义事件
- 子组件可以在适当的时机调用$emit()方法抛出一个事件给父组件
- 自定义事件的名称必须一致,区分大小写,不支持驼峰法命名
this.$emit('eventName',参数)
- 父组件在子组件标签中定义相关的事件回调,依次来响应子组件抛出的事件,还可以通过$on()方法来监听子组件事件
//标签语法
<child @eventName="showMsg"></Child>
//js语法
<child ref="child"></Child>
//通过ref标识找到子组件,并为其添加子定义事件
this.$refs.child.$on('eventName',this.showMsg)
5.sync 修饰符
- props属性是单向数据流,如果需要做双向数据绑定,除了可以使用v-model指令,还可以使用sync修饰符
- sync修饰符和v-model修饰符本质上都是通过自定义事件同步修改了父组件的值,相当于省略了父组件定义自定义事件回调的部分
- v-model通过model字段来定义事件名称,而sync 修饰符的事件名称的格式是固定的,即:update:prop属性名
- 实例:定义一个支持sync 修饰符的组件(关键在于合适的时机触发update:xxx事件)
var textDocument = {
template:"<input type='text' :value='value' @input='onInput'></input>",
data(){
return {
}
},
props:{
value:{
type:String,
default:""
}
},
methods:{
onInput(e){
//当前输入框的值
console.log(e.target.value)
//触发自定义事件
this.$emit('update:value',e.target.value)
}
}
}
6.直接访问父/子组件
- 父组件通过this.$refs.xxx来访问子组件,前提是在子组件标签中使用ref属性进行声明
//子组件标签中使用ref属性进行声明
<Child ref="child" />
//访问子组件的数据
this.$refs.child.title
- 子组件通过this.$parent来访问父组件
this.$parent.sayHello()
7.传递HTML内容
- props只能传递数据给子组件,如果要传递html内容,要使用插槽,具体见Vue.js slot插槽
8.非 prop 的属性
- 父组件挂载非 prop 的属性到子组件标签中,且子组件只有一个根标签时,这个属性值会被合并到子组件根标签中(2.x/3.x都适用)
//子组件HTML模版
<template>
<div class="box">子组件</div>
</template>
//父组件传递 非 prop 的属性
<child class="text-center" data-index="1"></child>
//渲染结果
<div class="box text-center" data-index="1">子组件</div>
- 如果子组件有多个根标签(vue2.x不支持多个根标签),默认这些非 prop 的属性不会挂载到子组件的标签中,他们被封装到$sttrs这个对象中,可以通过他将非 prop 的属性绑定到目标标签中
//子组件HTML模版
<template>
<div class="box" :class="$attrs.class">子组件根标签1</div>
<div class="box" :data-index="$attrs['data-index']">子组件根标签2</div>
</template>
//渲染结果
<div class="box text-center">子组件根标签1</div>
<div class="box" data-index="1">子组件根标签2</div>
9.依赖注入
- 可以把依赖注入看作一部分“大范围有效的 prop”,通过他可以让所有后代组件访问父组件的属性或者方案
//父组件进行声明
provide: function () {
return {
title: "感冒"
}
}
//后代组件进行接收
inject: ['title']
- 依赖注入所提供的 property 是非响应式的
Vue.js 组件数据交互的更多相关文章
- vue.js组件化开发实践
前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...
- VUE.JS组件化
VUE.JS组件化 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎 ...
- Vue.js 组件的三个 API:prop、event、slot
组件的构成 一个再复杂的组件,都是由三部分组成的:prop.event.slot,它们构成了 Vue.js 组件的 API.如果你开发的是一个通用组件,那一定要事先设计好这三部分,因为组件一旦发布,后 ...
- 如何理解vue.js组件的作用域是独立的
vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...
- 浅尝Vue.js组件(一)
本篇目录: 组件名 组件注册 全局注册 基础组件的自动化全局注册 局部注册 在模块系统中局部注册 Prop 单向数据流 Prop验证 类型检查 非Prop特性 替换/合并已有的特性 禁用特性继承 自定 ...
- Vue.js 组件编码规范
本规范提供了一种统一的编码规范来编写 Vue.js 代码.这使得代码具有如下的特性: 其它开发者或是团队成员更容易阅读和理解. IDEs 更容易理解代码,从而提供高亮.格式化等辅助功能 更容易使用现有 ...
- Vue.js组件的重要选项
Vue.js组件的重要选项 实例化Vue对象一些很重要的选项,Vue的所有数据都是放在data里面的,Vue的参数是个对象,对象里面的字段叫做data,data里面也是对象,data也可以写作是thi ...
- Vue框架(二)——Vue指令(v-once指令、v-cloak指令、条件指令、v-pre指令、循环指令)、todolist案例、Vue实例(计算、监听)、组件、组件数据交互
Vue指令 1.v-once指令 单独使用,限制的标签内容一旦赋值,便不可被动更改(如果是输入框,可以主动修改) <!DOCTYPE html> <html lang=" ...
- vue.js 组件之间传递数据
前言 组件是 vue.js 最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.如何传递数据也成了组件的重要知识点之一. 组件 组件与组件之间,还存在着不同的关 ...
- vue.js组件之j间的通讯一 子组件接受父祖件数据
Vue2.0的三种常用传值方式.父传子.子传父.非父子组件传值 在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来.这时必然会产生一些疑问和需求?比如一个组件 ...
随机推荐
- MySQL及navicat安装破解
一.Navicat Premium15 下载安装包和破解工具 1.Navicat官网下载地址:http://www.navicat.com.cn/download/navicat-premium 2. ...
- 深入理解Java对象结构
一.Java对象结构 实例化一个Java对象之后,该对象在内存中的结构是怎么样的?Java对象(Object实例)结构包括三部分:对象头.对象体和对齐字节,具体下图所示 1.Java对象的三部分 (1 ...
- 痞子衡嵌入式:为下一代AI边缘处理设备而生 - i.MXRT700
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的新品i.MXRT700. 四年前恩智浦官宣了面向下一代智能穿戴设备的 i.MXRT500 系列,这 ...
- 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞 - Shortcut
https://www.kancloud.cn/manual/thinkphp5_1/354000 ThinkPHP-Vuln-master
- 深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式
来源 卷积: 输入尺寸 ,卷积核的大小为 * ,输出的尺寸大小为 参数量 (1)不考虑bias:(2)考虑bias: FLOPs (1)不考虑bias 解释:先计算输出的中一个元素需要的计算量, ...
- 【首场重磅亮相】KaiwuDB 1.0 时序数据库线上发布会明日开启!邀您共同见证
首场重磅亮相 KaiwuDB 是浪潮集团控股的数据库企业,以多模数据库为核心,面向工业物联网.数字能源.交通车联网.智慧城市.数字政务等多种场景,提供领先创新的数据服务软件. 新生代数据库,扬帆起航正 ...
- 推荐一款支持Vue3的管理系统模版:Vue-Vben-Admin
近年来,随着前端技术的飞速发展,各类后台管理系统框架层出不穷.Vue 作为热门的前端框架,也有许多优秀的后台模板涌现.而 Vue-Vben-Admin,凭借其高效.灵活的架构设计和完善的功能体系,成为 ...
- Centos7下非lvm的分区扩容
Centos7下非lvm的分区扩容(重要) 前言:一般在生产环境中,如果需要使用一个分区保存大量的文件,建议的做法是在虚拟化环境中增加一块单独的硬盘,挂载一个单独的分区,比如 /data 上图我们可以 ...
- 云原生周刊:Knative 1.15 版本发布|2024.8.5
开源项目推荐 helm-secrets helm-secrets 是一个 Helm 插件,用于动态解密加密的 Helm 值文件. Tofu Controller Tofu Controller(以前称 ...
- 立即报名 | 云原生 + AI Meetup 成都站 11.4 正式开启
2023 年,KubeSphere 社区已经在深圳.杭州.上海三个城市各组织了一场线下 Meetup.第四站,我们将走进天府成都. 11 月 4 日,云原生 + AI Meetup 成都站将正式开启! ...