一幅长文细学Vue(五)——组件高级(上)

5 组件高级(上)

摘要

​ 在本文中,我们会详细讨论watch侦听器的基本使用,并且了解vue中常用的生命周期函数、实现组件之间的数据共享,最后学习如何在vue3.x项目中全局配置axios。

声明:为了文章的清爽性,在文章内部的代码演示中只会附上部分演示代码,main.js文件的代码通常不贴出,如果感兴趣可以前往代码仓库获取

作者:来自ArimaMisaki创作

文章目录

  • 5 组件高级(上)
    • 5.1 watch侦听器
      • 5.1.1 watch侦听器概述
      • 5.1.2 watch的使用场景
      • 5.1.3 侦听器选项
      • 5.1.4 监听对象单个属性的变化
      • 5.1.5 计算属性和侦听器
    • 5.2 生命周期
      • 5.2.1 组件运行的过程
      • 5.2.2 如何监听组件的不同时刻
      • 5.2.3 如何监听组件的更新
      • 5.2.4 组件生命周期函数
    • 5.3 数据共享
      • 5.3.1 组件之间的关系
      • 5.3.2 父子组件
      • 5.3.3 兄弟组件
      • 5.3.4 Prop逐级透传问题
      • 5.3.5 后代组件
      • 5.3.6 基于Provide向下共享响应式的数据
      • 5.3.7 vuex
    • 5.4 全局配置axios

5.1 watch侦听器

5.1.1 watch侦听器概述

说明:watch侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作。例如,监视用户名的变化并发起请求,判断用户名是否可用。

本质:监听器的本质也是一个函数,它允许接收两个参数,即新数据老数据

使用:在选项式API中,我们可以使用watch选项来定义所需的侦听器。


5.1.2 watch的使用场景

场景:检测用户名是否可用

说明:监听username值的变化,并使用axios发起Ajax请求,检测当前输入的用户名是否可用。要完成这个场景,需先安装axios包。

<template><div><h3>watch 侦听器的用法</h3><input type="text" class="form-control" v-model.trim="username"></div>
</template><script>
import axios from 'axios'export default {name: 'MyWatch',data() {return {username: 'admin',}},watch: {async username(newVal, oldVal) {console.log(newVal, oldVal);const { data: res } = axios.get('https://www.escook.cn/api/finduser' + newVal)console.log(res);}}
}
</script>
<template><div><h1>App根组件</h1><hr><my-watch></my-watch></div>
</template><script>
import MyWatch from "./MyWatch.vue"
export default {name: 'MyWatch',components: {MyWatch},
}
</script>

5.1.3 侦听器选项

immediate选项:watch是懒执行的。默认情况下,组件在初次加载完毕后不会调用watch侦听器,仅当数据源发生改变时,侦听器才会触发。如果想让watch侦听器立即被调用,需要使用immediate选项。需要额外注意的是,当我们第一次使用侦听器时,旧值为undefined。

deep选项:如果我们侦听的源是对象数组,在不使用选项的情况下我们无法使用侦听器来侦听它们的变化。使用deep选项可以强制深度遍历源,以便源在进行变更的时候触发回调。

info: {async handler(newVal) {const { data: res } = await axios.get('https://www.escook.cn/api/finduser' + newVal.username)console.log(res);},deep:true}

5.1.4 监听对象单个属性的变化

说明:使用deep选项会遍历数组或对象中的所有属性,如果想要监听单个属性,我们可以采用.的形式指定获取数组或对象的单个属性作为监听源。不过需要注意的是,由于使用了.的缘故,作为键的一方需要加上单引号双引号


5.1.5 计算属性和侦听器

说明:有很多人会搞混计算属性和侦听器。实际上,计算属性侧重于监听多个值得变化,并最终计算返回一个新值,而侦听器侧重于监听单个数据源的变化,最终执行特定的业务处理,不需要有任何返回值。


5.2 生命周期

5.2.1 组件运行的过程

组件的生命周期:组件的生命周期指的是组件从创建到湮灭的整个过程,该术语强调的是这个时间段。

image-20220828082013374


5.2.2 如何监听组件的不同时刻

说明:Vue框架为组件内置了不同时刻的生命周期函数,生命周期函数会伴随着组件的运行而自动调用。另外,生命周期函数常被称为生命周期钩子

  • 当组件在内存中被创建完毕之后,会自动调用created函数
  • 当组件被成功的渲染到页面上之后,会自动调用mounted函数
  • 当组件被销毁完毕之后,会自动调用unmounted函数。
<template><div><h3>LifeCycle 组件</h3></div>
</template><script>
export default {name:'LifeCycle',// 组件在内存中被创建完毕了created(){console.log(`created:组件在内存中被创建完毕了`);},// 组件第一次被渲染到页面上mounted(){console.log(`mounted:组件第一次被渲染到了页面上`);},// 组件被销毁完毕了unmounted(){console.log(`unmounted:组件被销毁完毕了`);}
}
</script>
<template><div><h1>App根组件</h1><hr><button @click="flag = !flag">toggle</button><life-cycle v-if="flag"></life-cycle></div>
</template><script>
import LifeCycle from "./life-cycle.vue"
export default {name: 'MyApp',data(){return{flag:true}},components: {LifeCycle}
}
</script>

5.2.3 如何监听组件的更新

说明:一旦组件中的data数据源发生变化,vue会自动重新渲染组件的DOM结构,从而保证View视图展示的数据和Model数据源保持一致。当组件被重新渲染完毕后,会自动调用updated生命周期函数。


5.2.4 组件生命周期函数

说明:在之前学习的四个周期函数之前加上before,即可出现另外四个生命周期函数。

image-20220828091256028


5.3 数据共享

5.3.1 组件之间的关系

说明:在项目开发中,组件之间的关系分为如下三种:

  • 父子关系
  • 兄弟关系
  • 后代关系

5.3.2 父子组件

父组件向子组件共享数据:父组件使用v-bind指令来向子组件共享数据,子组件需要使用props选项来接收数据。

子组件向父组件共享数据:子组件可以通过自定义事件的方式向父组件共享数据。

父子组件之间数据双向同步:通过v-model指令来维护组件内外数据的双向同步。


5.3.3 兄弟组件

说明:兄弟组件之间实现数据共享的方案是EventBus。可以借助于第三方的包mitt来创建eventBus对象,从而实现兄弟组件之间的数据共享。

示意图

image-20220828093406039

安装mitt依赖包npm install mitt

使用步骤

  1. 新建一个EventBus.js文件,在里面创建mitt实例,并默认导出
  2. 在数据接收方的created生命周期钩子中调用mitt实例对象.on('事件名称',要接收的数据)自定义一个事件,通过事件处理函数的形参来接收数据。
  3. 在数据发送方,调用bus.emit('事件名称',要发送的数据)方法触发自定义事件。

5.3.4 Prop逐级透传问题

说明:通常情况下,当我们需要从父组件向子组件传递数据时,会使用 props。想象一下这样的结构:有一些多层级嵌套的组件,形成了一颗巨大的组件树,而某个深层的子组件需要一个较远的祖先组件中的部分数据。在这种情况下,如果仅使用 props 则必须将其沿着组件链逐级传递下去,这会非常麻烦:

image-20220828100344487

如上图在传递的过程中,可能Footer组件根本不关心这些props,但为了DeepChild的使用,它必须接收并且继续往下传递,如果组件的链路非常长,可能会影响到这条路上更多的组件,这一问题被称为prop逐级透传,我们希望避免这种情况。


5.3.5 后代组件

说明:如果仅仅只是父子关系,那么使用props和v-bind或许是一种不错的策略,但如果要接收数据的组件离发送数据的组件很远(链路很长),使用props就会导致逐级透传问题,这时候我们可以使用provideinject来解决这一问题。

provide选项:provide是一个函数,和data一样返回一个共享的数据对象。对于provide对象上的每一个属性,后代组件都会用其key为注入名查找期望注入的值,属性的值就是要提供的数据。

inject选项:inject是一个数组,用于接收provide提供的共享数据,根据provide返回的对象中属性的键进行查找。


5.3.6 基于Provide向下共享响应式的数据


5.3.7 vuex

说明:vuex是终极的组件之间的共享方案。在企业级的vue项目开发中,vuex可以让组件之间的数据共享变得高效、清晰、且易于维护。


5.4 全局配置axios

引入:在实际项目中,几乎每个组件都会使用axios发起数据请求,此时会遇到两个问题:

  • 每个组件中都需要导入axios
  • 每次发请求都需要填写完整的请求路径

说明:想要全局配置axios可以在main.js入口文件中,通过app.config.globalProperties全局挂载axios。

格式:app.config.globalProperties.$http

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

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

相关文章

流行的编程语言及其趋势

转&#xff1a;StackOverflow上的编程趋势 http://www.csdn.net/article/2013-07-08/2816144-StackOverflow-Programming-Trends 摘要&#xff1a;相信每个程序员都知道StackOverflow问答网站&#xff0c;本文作者dodgy_coder通过StackExchange Data Explorer Query收集了该网站…

CentOS7.0 安装 tomcat-9.0

2019独角兽企业重金招聘Python工程师标准>>> 1、解压 # tar -zxvf apache-tomcat-9.0.0.M4.tar.gz -C /opt/usr/local 改个名字好以后操作&#xff1a; # mv apache-tomcat-9.0.0.M4.tar.gz tomcat 2、启动&停止 # /opt/usr/local/tomcat/bin/start…

一幅长文细学华为MRS大数据开发(四)——HBase

4 HBase 摘要&#xff1a;HBase是一种非关系型数据库&#xff0c;它是基于谷歌BigTable的开源实现&#xff0c;和BigTable一样&#xff0c;支持大规模海量数据的存储&#xff0c;对于分布式并发数据处理的效率极高&#xff0c;易于扩展且支持动态伸缩&#xff0c;适用于廉价设备…

AOP技术基础

1、引言2、AOP技术基础 3、Java平台AOP技术研究4、.Net平台AOP技术研究2.1 AOP技术起源 AOP技术的诞生并不算晚&#xff0c;早在1990年开始&#xff0c;来自Xerox Palo Alto Research Lab&#xff08;即PARC&#xff09;的研究人员就对面向对象思想的局限性进行了分析。他们研…

TCP 协议的三次握手、四次分手

详细描述了 TCP 协议的连接和关闭的整个过程。解释了为什么 TCP 协议是面向连接的、可靠的数据传输协议。 TCP 在互联网上之间的通信交流&#xff0c;一般是基于 TCP (Transmission Control Protocol&#xff0c;传输控制协议) 或者 UDP (User Datagram Protocol&#xff0c;用…

[Bzoj4182]Shopping(点分治)(树上背包)(单调队列优化多重背包)

4182: Shopping Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 374 Solved: 130[Submit][Status][Discuss]Description 马上就是小苗的生日了&#xff0c;为了给小苗准备礼物&#xff0c;小葱兴冲冲地来到了商店街。商店街有n个商店&#xff0c;并且它们之间的道路构成了一…

Tiny框架2.0版火热推出

方法论 方法论决定了可以达到的高度 方法论&#xff0c;就是人们认识世界、改造世界的根本方法。 它是人们用什么样的方式、方法来观察事物和处理问题。概括地说&#xff0c;世界观主要解决世界“是什么”的问题&#xff0c;方法论主要解决“怎么办”的问题。 方法论是一种以解…

Java--Socket通信

下面内容是Java开发内容的高级知识点&#xff0c;需要对Java中的面向对象、IO、多线程、以及网络相关知识有一定的基础。(知识永远都有深度&#xff0c;本章节长期更新内容) 1、网络基础知识 网络通信的条件&#xff1a;1、两个通信的端都要有各自的IP地址作为唯一标识&#xf…

一幅长文细学华为MRS大数据开发(五)——MapReduce和Yarn

5 MapReduce和Yarn 摘要&#xff1a;本文中主要讲述大数据领域中最著名的批处理和离线处理计算框架——MapReduce&#xff0c;包括MapReduce的原理、流程、使用场景&#xff0c;以及Hadoop集群中负责统一的资源管理和调度的组件——Yarn。 作者&#xff1a;来自ArimaMisaki创作…

Tensorflow从入门到精通之——Tensorflow基本操作

前边的章节介绍了什么是Tensorflow&#xff0c;本节将带大家真正走进Tensorflow的世界&#xff0c;学习Tensorflow一些基本的操作及使用方法。同时也欢迎大家关注我们的网站和系列教程&#xff1a;http://www.tensorflownews.com/&#xff0c;学习更多的机器学习、深度学习的知…

一幅长文细学Vue(七)——路由

7 路由 摘要&#xff1a;在本文中我们会谈及路由的知识点&#xff0c;了解前端路由工作的过程以及如何在Vue3中配置路由&#xff0c;知道怎么使用嵌套路由和实现动态路由匹配&#xff0c;以及使用编程式导航和导航守卫。 声明&#xff1a;为了文章的清爽性&#xff0c;在文章内…

Codeforces 913 二进制背包(柠檬水) 暴力贪心特殊背包(选题)

A B C 给你N(N<30)种水瓶每种水瓶有无限个 每个的体积是2^(i-1)价格是cost[i] 要求你花最少的钱弄出L体积的水 先从前到后扫一遍cost[i1]min(cost[i1],cost[i]*2) 再从后往前扫一遍cost[i]min(cost[i],cost[i1) 保证了价格的最优化 然后从0开始到30 如果二进制有当前体积的…

android baidupush

实战 QQ demo源码&#xff08;本例中有该应用&#xff09; 服务器端下载&#xff1a;http://download.csdn.net/download/knight_black_bob/9822551 android eclipse 版&#xff1a;http://download.csdn.net/download/knight_black_bob/9822553 android stdio 版本&#xff1…

jQuery源码分析--Event模块(1)

jQuery的Event模块提供了强大的功能&#xff1a;事件代理&#xff0c;自定义事件&#xff0c;自定义数据等。今天记录一下它实现的原理。 我们都知道&#xff0c;在js的原生事件中&#xff0c;有事件对象和回调函数这两样东西。但是事件对象是只读的&#xff0c;所以jQuery就用…

JSP内置对象(9个常用的内置对象)

为什么80%的码农都做不了架构师&#xff1f;>>> 2012-08-06 1.request对象 客户端的请求信息被封装在request对象中&#xff0c;通过它才能了解到客户的需求&#xff0c;然后做出响应。它是HttpServletRequest类的实例。 序号 方 法 说 明 1 object getAttribute(S…

用户可计算型出题程序

此次程序是对上次程序的再次开发&#xff0c;我将自己视作另一个在开发者&#xff0c;在对自己前面程序进行再次审视时&#xff0c;有了别样的感受&#xff0c;自己写的程序&#xff0c;一定要为别人(也有可能是自己)留一条活路。闲话不多说&#xff0c;进入大家最喜欢的**环节…

使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

前篇 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程&#xff08;一&#xff09;使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程&#xff08;二&#xff09;原文第十三步&#xff0c;Express API路由 第一个路由是用来创建角色…

匿名方法,lambad表达式,匿名类

其实lambad表达式就是“函数”或者说是“方法”写法的一个进化&#xff0c;越来越简化而已&#xff0c;如数学方法里的f(X)。 匿名方法&#xff1a;顾名思义&#xff0c;匿名方法就是没有名称的方法&#xff0c;但是有定义参数。 匿名方法最明显的好处就是可以降低另写一个方法…

Python3.1-标准库之Numpy

这系列用来介绍Python的标准库的支持Numpy部分。资料来自http://wiki.scipy.org/Tentative_NumPy_Tutorial&#xff0c;页面有许多链接&#xff0c;这里是直接翻译&#xff0c;所以会无法链接。可以大致看完该博文&#xff0c;再去看英文版。 1、先决条件 想要运行numpy&#x…

黑马Android全套视频无加密完整版

课程描述&#xff1a;java基础到javaweb开发&#xff0c;从基础入门到实战。安卓基础到实战。实体班近5个月的课程实录&#xff01;&#xff01;&#xff01;课程表&#xff1a;xml&dom_sax_dom4j编程tomcat与web程序结构与Http协议与HttpUrlConnectionjava web之servletja…