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.mzph.cn/news/95599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ORM】浅聊C#和Java的ORM底层框架

给自己一个目标&#xff0c;然后坚持一段时间&#xff0c;总会有收获和感悟&#xff01; 国庆假期马上结束&#xff0c;闲暇时间&#xff0c;突然对Ado.Net这个词的由来感兴趣&#xff0c;然后就一顿复习了一遍&#xff0c;顺便也了解了下java关于ORM框架的底层是什么&#xff…

Gmail 将停止支持基本 HTML 视图

根据 Google 支持文档的更新内容&#xff0c;Gmail 将从明年 1 月起停止支持基本 HTML 视图。 ▲ Gmai 基本 HTML 视图界面 目前网页版 Gmail 提供两个界面&#xff1a;基本 HTML 视图和标准视图。停止支持基本 HTML 视图后&#xff0c;当前打开经典模式的基本 HTML 视图模式 …

一文解释mapState的来龙去脉

mapState Vuex 提供的辅助函数之一&#xff0c;将 store 中的状态映射到组件的计算属性中&#xff0c;使得在组件中可以轻松地访问 Vuex store 中的状态值 MapState(映射状态) 在我们的 Count.vue 组件中&#xff0c;可以使用 mapState 来更简洁地获取 count 的状态值 首先&…

python读取vivo手机截图,将满屏图片文件移动别的路径

问题之初 python读取vivo手机截图&#xff0c; 将满屏图片文件移动别的路径好多这样的图片&#xff0c;占用手机大量的内存&#xff0c;食之无味弃之可惜&#xff01;那么会复制粘贴&#x1f440;代码的我们我们今天就把这些图片筛选清理掉。 这段代码 原有逻辑的基础上&…

基于知识蒸馏的两阶段去雨去雪去雾模型学习记录(二)之知识收集阶段

前面学习了模型的构建与训练过程&#xff0c;然而在实验过程中&#xff0c;博主依旧对数据集与模型之间的关系有些疑惑&#xff0c;首先是论文说这是一个混合数据集&#xff0c;但事实上博主在实验时是将三个数据集分开的&#xff0c;那么在数据读取时是如何混合的呢&#xff0…

林沛满-Wireshark的提示

本文整理自&#xff1a;《Wireshark网络分析的艺术 第1版》 作者&#xff1a;林沛满 著 出版时间&#xff1a;2016-02 最近有不少同事开始学习 Wireshark&#xff0c;他们遇到的第一个困难就是理解不了主界面上的提示信息&#xff0c;于是跑来问我。问的人多了&#xff0c;我也…

如何一步步优化负载均衡策略

发展到一定阶段后&#xff0c;Web 应用程序就会增长到单服务器部署无法承受的地步。这时候企业要么提升可用性&#xff0c;要么提升可扩展性&#xff0c;甚至两者兼而有之。为此&#xff0c;他们会将应用程序部署在多台服务器上&#xff0c;并在服务器之前使用负载均衡器来分配…

第10章 MySQL(二)

10.11 请你说下你对ACID的理解 难度:★ 重点:★★ 白话解析 前面的题目搞明白了MySQL的原理、架构和索引,那接下来,我们捋一捋SQL在执行过程中的最核心的问题了——事务问题。 先搞明白事务的4个特性。 参考答案 1、A(Atomicity):原子性,就是一堆的SQL操作要么全部…

华为云云耀云服务器L实例评测|SpringCloud相关组件——nacos和sentinel的安装和配置 运行内存情况 服务器被非法登陆尝试的解决

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍SpringCloud相关组件——nacos和sentinel的安装和配置&#xff0c;并分析了运行内存情况&#xff0c;此…

数据在内存中的存储(1)

文章目录 目录1. 数据类型介绍1.1 类型的基本归类 2. 整形在内存中的存储2.1 原码、反码、补码2.2 大小端介绍2.3 练习 附&#xff1a; 目录 数据类型介绍整形在内存中的存储大小端字节序介绍及判断浮点型在内存中的存储 1. 数据类型介绍 前面我们已经学习了基本的内置类型以…

【数据结构】数据结构基础概念

系列文章目录 第一章&#xff1a;【数据结构】数据结构基础概念 文章目录 系列文章目录前言简介名词解释数据数据元素数据项数据对象数据结构数据类型抽象抽象数据类型算法算法设计要求 总结 前言 数据结构是软件编程的基础&#xff0c;是程序员的基本功。 简介 数据结构是一…

Ubuntu20配置Mysql常用操作

文章目录 版权声明ubuntu更换软件源Ubuntu设置静态ipUbuntu防火墙ubuntu安装ssh服务Ubuntu安装vmtoolsUbuntu安装mysql5.7Ubuntu安装mysql8.0Ubuntu卸载mysql 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明&#xff0c;所有版权属于黑马程…

12、建立健全人员培训体系

9、大小屏分离与精细化审核 10、质量审核的设立与合并 11、视频分类建议 内容仓为公司其他部门输送了许多人才&#xff0c;既包括有潜力的主管&#xff0c;也有表现突出或者具备某些特殊能力的员工&#xff0c;从内容仓走出的同事&#xff0c;有些已经成为公司重要业务某个方…

回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测

回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测 目录 回归预测 | MATLAB实现PSO-SVR粒子群优化支持向量机回归多输入单输出预测预测效果基本介绍模型描述程序设计预测效果 <

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…

Fiddler抓取手机https包的步骤

做接口测试时&#xff0c;有时我们需要使用fiddler进行抓包分析&#xff0c;那么如何抓取https包。主要分为以下七步&#xff1a; 1.设置fiddler选项&#xff1a;Tools->Options,按如下图勾选 2.下载并安装Fiddler证书生成器 下载地址&#xff1a;http://www.telerik.com/…

C/C++——内存管理

1.为什么存在动态内存分配 灵活性 静态内存分配是在编译时确定的&#xff0c;程序执行过程中无法改变所分配的内存大小&#xff1b;动态内存分配可以根本程序的运行环境来动态分配和释放空间&#xff0c;提供了更大的灵活性 动态数据结构 有些数据结构的大小和结构在编译时…

运动控制:分辨率、定位精度、重复定位精度

分辨率&#xff0c;定位精度&#xff0c;重复定位精度三者之间有什么关系&#xff1f; 对于这个问题&#xff0c;我相信&#xff0c;很多刚开始做设计的伙伴们&#xff0c;都有这样的疑问。 今天&#xff0c;不墨迹&#xff0c;直接讲问题。 先说分辨率&#xff0c;这个最容…

[计算机入门] Windows附件程序介绍(工具类)

3.14 Windows附件程序介绍(工具类) 3.14.1 计算器 Windows系统中的计算器是一个内置的应用程序&#xff0c;提供了基本的数学计算功能。它被设计为一个方便、易于使用的工具&#xff0c;可以满足用户日常生活和工作中的基本计算需求。 以下是计算器程序的主要功能&#xff1a…

【算法基础】基础算法(二)--(高精度、前缀和与差分)

一、高精度 当一个数很大&#xff0c;大到 int 无法存下时&#xff0c;我们可以考虑用数组来进行存储&#xff0c;即数组中一个位置存放一位数。 但是对于数组而言&#xff0c;一个数顺序存入数组后&#xff0c;对其相加减是很简单的。但是当需要进位时&#xff0c;还是很麻烦的…