Vue组件通信应用实践总结

【1】 组件通信的5种方式

props
vue的自定义事件
pubsub第三方库
slot
vuex

① props

父子组件间通信的基本方式
属性值的2大类型: 一般: 父组件-->子组件函数: 子组件-->父组件
隔层组件间传递: 必须逐层传递(麻烦)
兄弟组件间: 必须借助父组件(麻烦)

② vue自定义事件

子组件与父组件的通信方式
用来取代function props
不适合隔层组件和兄弟组件间的通信

③ pubsub第三方库(消息订阅与发布)

适合于任何关系的组件间通信

④ slot

通信是带数据的标签,注意: 标签是在父组件中解析。

⑤ vuex

多组件共享状态(数据的管理),组件间的关系也没有限制。功能比pubsub强大, 更适用于vue项目。

【2】组件引入与组件传值

① 父页面

<template><div class="todo-container"><div class="todo-wrap"><!-- 给子组件绑定方法 --><TodoList :todos="todos"/><!-- 给子组件绑定方法并传值 -->      <TodoFooter :todos="todos" :deleteCompleteTodos="deleteCompleteTodos" :selectAll="selectAll"/></div></div>
</template>

② 脚本

父页面需要引入并声明组件:

<script>
//import引入组件import TodoHeader from './components/TodoHeader.vue'import TodoList from './components/TodoList.vue'import TodoFooter from './components/TodoFooter.vue'import storageUtils from './utils/storageUtils'export default {//声明组件components: {TodoHeader,TodoList,TodoFooter}//数据data () {return {todos: storageUtils.readTodos()}},methods: {addTodo (todo) {this.todos.unshift(todo)},deleteTodo (index) {this.todos.splice(index, 1)},// 删除所有已完成的deleteCompleteTodos () {this.todos = this.todos.filter(todo => !todo.complete)},// 全选/全不选selectAll (isSelectAll) {this.todos.forEach(todo => {todo.complete = isSelectAll})}}}
</script>

export 用来导出模块,Vue 的单文件组件通常需要导出一个对象,这个对象是 Vue 实例的选项对象,以便于在其它地方可以使用 import 引入。而 new Vue() 相当于一个构造函数,在入口文件 main.js 构造根组件的同时,如果根组件还包含其它子组件,那么 Vue 会通过引入的选项对象构造其对应的 Vue 实例,最终形成一棵组件树。

使用export default命令,为模块指定默认输出,这样就不需要知道所要加载模块的变量名。

default只能有一个值,所以一个文件内不能有多个export defaul。

export default输出一个叫做default的变量,然后系统允许你为它取任意名字。所以可以为import的模块起任何变量名,且不需要用大括号包含

export default写法顺序

name
components
props
data
created
methods
mounted
computed
watch

③ 子页面

子页面通过props接受父组件的传值:

<template><div class="todo-footer"><label><input type="checkbox" v-model="checkAll"/></label><span><span>已完成{{completeSize}}</span> / 全部{{todos.length}}</span><button class="btn btn-danger" v-show="completeSize" @click="deleteAllCompleted">清除已完成任务</button></div>
</template><script>export default {//接收父组件的值传递与方法传递props: {todos: Array,deleteCompleteTodos: Function,selectAll: Function},computed: {completeSize () {return this.todos.reduce((preTotal, todo) => preTotal + (todo.complete?1:0) ,0)},checkAll: {get () { // 决定是否勾选return this.completeSize===this.todos.length && this.completeSize>0},set (value) {// 点击了全选checkbox  value是当前checkbox的选中状态(true/false)this.selectAll(value)}},},methods: {deleteAllCompleted () {if(window.confirm('确定清除已完成的吗?')) {this.deleteCompleteTodos()}}}}
</script>

【3】 props的三种写法

① 第一种简写

 export default {// 声明接收标签属性props: ['todos'], // 会成为当前组件对象的属性, 可以在模板中直接访问, 也可以通过this来访问components: {TodoItem}}

② 第二种写法

 export default {props: {// 指定属性名和属性值的类型todo: Object,index: Number}
}

第三种复杂写法

 export default {props: {todo: {type:Function,required:true,default: function () {return { message: 'hello' }},validator: function (value) {// 这个值必须匹配下列字符串中的一个return ['success', 'warning', 'danger'].indexOf(value) !== -1}},index: Number}
}

type:可以是下列原生构造函数中的一种:String、Number、Boolean、Array、Object、Date、Function、Symbol、任何自定义构造函数、或上述内容组成的数组

会检查一个 prop 是否是给定的类型,否则抛出警告。Prop 类型的更多信息如下所示:

props: {title: String,likes: Number,isPublished: Boolean,commentIds: Array,author: Object,callback: Function,contactsPromise: Promise // or any other constructor
}

default:any

为该 prop 指定一个默认值。如果该 prop 没有被传入,则换做用这个值。对象或数组的默认值必须从一个工厂函数返回。

required:Boolean

定义该 prop 是否是必填项。在非生产环境中,如果这个值为 truthy 且该 prop 没有被传入的,则一个控制台警告将会被抛出。

validator:Function

自定义验证函数会将该 prop 的值作为唯一的参数代入。在非生产环境下,如果该函数返回一个 falsy 的值 (也就是验证失败),一个控制台警告将会被抛出。你可以在这里查阅更多 prop 验证的相关信息。

props更多文档参考:https://cn.vuejs.org/v2/guide/components-props.html


【4】组件通信之消息发布订阅

消息订阅与发布(PubSubJS 库),此方式可实现任意关系组件间通信(数据)。

需要先安装PubSubJS 库,npm install --save pubsub-js

然后引入:

 import PubSub from 'pubsub-js'

① 发布消息

PubSub.publish('msg', data)

触发事件(发布消息)

DOM 事件: 用户在浏览器上对应的界面上做对应的操作
自定义: 编码手动触发

实例如下:

 deleteItem () {// this.deleteTodo(this.index)// 发布消息(deleteTodo)PubSub.publish('deleteTodo', this.index)}

② 订阅消息

PubSub.subscribe('msg', function(msg, data){})

绑定事件监听(订阅消息)

目标: 标签元素<button>
事件名(类型): click/focus
回调函数: function(event){}

实例如下:

    mounted () {// 绑定自定义事件(addTodo)监听this.$refs.header.$on('addTodo',  this.addTodo)// 订阅消息(deleteTodo)PubSub.subscribe('deleteTodo', (msg, index) => {this.deleteTodo(index)})},

【5】组件间通信之slot

slot主要用于父组件向子组件传递标签数据。
父组件实例

<TodoFooter><input slot="checkAll" type="checkbox" v-model="checkAll" /><span slot="size">已完成{{completeSize}} / 全部{{todos.length}}</span><button slot="delete" class="btn btn-danger" v-show="completeSize" @click="deleteAllCompleted" >清除已完成任务</button>
</TodoFooter>

子组件实例

<template><div class="todo-footer"><label><!--<input type="checkbox" v-model="checkAll"/>--><slot name="checkAll"></slot></label><span><slot name="size"></slot><!-- <span>已完成{{completeSize}} / 全部{{todos.length}}</span>--></span><slot name="delete"></slot><!-- <button class="btn btn-danger" v-show="completeSize" @click="deleteAllCompleted">清除已完成任务</button>--></div>
</template>

【6】自定义事件

① v-on指令监听事件

可以用 v-on 指令监听 DOM 事件,并在触发时运行一些 JavaScript 代码。v-on:事件名, 可以缩写为: @事件名

事件修饰符

在事件处理程序中调用 event.preventDefault()event.stopPropagation() 是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。

为了解决这个问题,Vue.js 为 v-on 提供了事件修饰符。之前提过,修饰符是由点开头的指令后缀来表示的。

.stop
.prevent
.capture
.self
.once
.passive

代码示例如下

<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a><!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form><!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a><!-- 只有修饰符 -->
<form v-on:submit.prevent></form><!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即内部元素触发的事件先在此处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div><!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

② 自定义事件监听

第一种方式

#给TodoHeader 标签对象绑定addTodo事件监听
<TodoHeader @addTodo="addTodo"/>

那么子组件如何触发事件呢?

//this.addTodo(todo)---原先使用props通信/*触发自定义事件: addTodo*/
this.$emit('addTodo', todo)

第二种方式

<TodoHeader ref="header"/>mounted () {// 绑定自定义事件(addTodo)监听this.$refs.header.$on('addTodo',  this.addTodo)
}

需要注意的是上面函数传递方式只适用于父-子,也就是A-B;A-B-C则不适用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/149752.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

苹果签名的MDM(Mobile Device Management)?是怎么做的?优势是什么?什么场合需要应用到?

苹果签名有多少种类之TF签名(TestFlight签名&#xff09;是什么&#xff1f;优势是什么&#xff1f;什么场合需要应用到&#xff1f; 苹果签名有多少种类之TF签名(TestFlight签名&#xff09;是什么&#xff1f;优势是什么&#xff1f;什么场合需要应用到&#xff1f; MDM&am…

基于Matlab求解高教社杯数学建模竞赛(cumcm2010A题)-储油罐的变位识别与罐容表标定(附上源码+数据+题目)

文章目录 题目解题源码数据下载 题目 通常加油站都有若干个储存燃油的地下储油罐&#xff0c;并且一般都有与之配套的“油位计量管理系统”&#xff0c;采用流量计和油位计来测量进/出油量与罐内油位高度等数据&#xff0c;通过预先标定的罐容表&#xff08;即罐内油位高度与储…

lv7 嵌入式开发-网络编程开发 11 TCP管理与UDP协议

目录 1 TCP管理 1.1 三次握手 1.2 四次挥手 1.3 保活计时器 2 wireshark安装及实验 3.1 icmp协议抓包演示 3.2 tcp协议抓包演示 3 UDP协议 3.1 UDP 的主要特点&#xff1a; 4 练习 1 TCP管理 1.1 三次握手 TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1…

机器学习笔记 - 深入研究spaCy库及其使用技巧

一、简述 spaCy 是一个用于 Python 中高级自然语言处理的开源库。它专为生产用途而设计,这意味着它不仅功能强大,而且快速高效。spaCy 在学术界和工业界广泛用于各种 NLP 任务,例如标记化、词性标注、命名实体识别等。 安装,这里使用阿里的源。 pip install spacy…

2023版 STM32实战6 输出比较(PWM)包含F407/F103方式

输出比较简介和特性 -1-只有通用/高级定时器才能输出PWM -2-占空比就是高电平所占的比例 -3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1- PWM工作模式 -1-2- 有效/无效电平 有效电平可以设置为高或低电平&#xff0c;是自己配置的 周期选择与计算 周期重…

华为云云耀云服务器L实例评测|安装搭建学生成绩管理系统

1.前言概述 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格&#xff0c;满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像&#xff0c;实现应用一键部署&#xff0c;助力客户便捷高效的在…

SRT服务器SLS

目前互联网上的视频直播有两种&#xff0c;一种是基于RTMP协议的直播&#xff0c;这种直播方式上行推流使用RTMP协议&#xff0c;下行播放使用RTMP&#xff0c;HTTPFLV或者HLS&#xff0c;直播延时一般大于3秒&#xff0c;广泛应用秀场、游戏、赛事和事件直播&#xff0c;满足了…

mybatis项目启动报错:reader entry: ���� = v

问题再现 解决方案一 由于指定的VFS没有找&#xff0c;mybatis启用了默认的DefaultVFS&#xff0c;然后由于DefaultVFS的内部逻辑&#xff0c;从而导致了reader entry乱码。 去掉mybatis配置文件中关于别名的配置&#xff0c;然后在mapper.xml文件中使用完整的类名。 待删除的…

JMETER自适应高分辨率的显示器

系列文章目录 历史文章 每天15分钟JMeter入门篇&#xff08;一&#xff09;&#xff1a;Hello JMeter 每天15分钟JMeter入门篇&#xff08;二&#xff09;&#xff1a;使用JMeter实现并发测试 每天15分钟JMeter入门篇&#xff08;三&#xff09;&#xff1a;认识JMeter的逻辑控…

【Pandas】数据分组groupby

本文目标&#xff1a; 应用groupby 进行分组对分组数据进行聚合,转换和过滤应用自定义函数处理分组之后的数据 文章目录 1. 数据聚合1.1 单变量分组聚合1.2 Pandas内置聚合方法1.3 聚合方法使用Numpy的聚合方法自定义方法同时计算多种特征向agg/aggregate传入字典 2. 数据转换…

DHCPsnooping 配置实验(2)

DHCP报文泛洪攻击 限制接收到报文的速率 vlan 视图或者接口视图 dhcp request/ dhcp-rate dhcp snooping check dhcp-request enable dhcp snooping alarm dhcp-request enable dhcp snooping alarm dhcp-request threshold 1 超过则丢弃报文 查看[Huawei]dis dhcp statistic…

​苹果应用高版本出现:“无法安装此app,因为无法验证其完整性”是怎么回事?竟然是错误的?

最近经常有同学私聊我问苹果应用签名后用落地页下载出现高版本是什么意思&#xff1f;我一脸懵&#xff01;还有这个操作&#xff1f;高版本是个啥玩意&#xff01;所以我就上了一下科技去搜索引擎搜索了下&#xff0c;哈哈哈&#xff0c;然后了解下来发现是这样的首先我们确定…

Qt扩展-Advanced-Docking 简介及配置

Advanced-Docking 简介及配置 一、概述二、项目结构三、安装配置四、代码测试 一、概述 Advanced-Docking 是类似QDockWidget 功能的多窗口停靠功能的库。很像visual stdio 的 停靠功能&#xff0c;这个库对于停靠使用的比较完善。很多的软件都使用了这个框架。 项目源地址&a…

transformer不同的包加载模型的结构不一样

AutoModel AutoModelForTokenClassification 结论&#xff1a; AutoModel加载的模型与AutoModelForTokenClassification最后一层是不一样的&#xff0c;从这个模型来看&#xff0c;AutoModelForTokenClassification加载的结果是对的 问题&#xff1a; 为什么AutoModel和Aut…

【C++】一文带你走入vector

文章目录 一、vector的介绍二、vector的常用接口说明2.1 vector的使用2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector 增删查改 三、总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一、vector的介绍 vector…

【uniapp+vue3+ts】请求函数封装,请求和上传文件拦截器

1、uniapp 拦截器 uni.addInterceptor(STRING,OBJECT) 拦截器中包括基础地址、超时时间、添加请求头标识、添加token utils文件夹下新建http.ts 拦截uploadFile文件上传&#xff0c;rquest请求接口 cosnt baseUrl xxxx// 添加拦截器 const httpInterceptor {//拦截前触发i…

Django 模型层的操作(Django-05 )

一 模型层的解读 Django中内嵌了ORM框架&#xff0c;不需要直接编写SQL语句进行数据库操作&#xff0c;而是通过定义模型类&#xff0c;操作模型类来完成对数据库中表的增删改查和创建等操作。 O 是object&#xff0c;也就类对象的意思。R 是relation&#xff0c;翻译成中文是…

卷积神经网络-池化层和激活层

2.池化层 根据特征图上的局部统计信息进行下采样&#xff0c;在保留有用信息的同时减少特征图的大小。和卷积层不同的是&#xff0c;池化层不包含需要学习的参数。最大池化(max-pooling)在一个局部区域选最大值作为输出&#xff0c;而平均池化(average pooling)计算一个局部区…

阿里云服务器镜像系统Anolis OS龙蜥详细介绍

阿里云服务器Anolis OS镜像系统由龙蜥OpenAnolis社区推出&#xff0c;Anolis OS是CentOS 8 100%兼容替代版本&#xff0c;Anolis OS是完全开源、中立、开放的Linux发行版&#xff0c;具备企业级的稳定性、高性能、安全性和可靠性。目前阿里云服务器ECS可选的Anolis OS镜像系统版…

【linux进程(二)】如何创建子进程?--fork函数深度剖析

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; 进程状态管理 1. 前言2. 查看…