Vue-组件高级(上)

news2024/11/26 16:30:47

一、目标

  • 能够掌握watch侦听器的基本使用
  • 能够知道vue中常用的生命周期函数
  • 能够知道如何实现组件之间的数据共享
  • 能够知道如何在vue3.x的项目中全局配置axios

二、目录


watch侦听器


1.什么是watch侦听器

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

2.watch侦听器的基本语法

开发者需要在 watch节点下,定义自己的侦听器。实例代码如下:

<template>
  <div>
  <input type="text" class="form-control" v-model.trim="username">
  </div>
</template>

<script>

export default {
    name:'MyCounter',
    data(){
        return{
            username:''
        }
    },
    watch:{
        username(newVal,oldVal){
            console.log(newVal,oldVal)
        }
    }
}
</script>

 3.使用watch检测用户名是否可用

监听username值的变化,并使用axios发起Ajax请求,检测当前输入的用户名是否可用

4.immediate选项

默认情况下,组件在初次加载完毕后不会调用watch侦听器。如果想让watch侦听器立即被调用,则需要使用immediate选项。实例代码如下:

5.deep选项

watch侦听的是一个对象,如果对象中的属性值发生了变化,则无法被监听到。此时需要使用deep选项,代码示例如下:

6.监听对象单个属性的变化

如果只想监听对象中单个属性的变化,则可以按照如下的方式定义watch监听器:

 7.计算属性vs侦听器

计算属性和侦听器侧重的应用场景不同

计算属性侧重于监听多个值的变化,最终计算并返回一个新值

侦听器侧重于侦听单个数据的变化,最终执行特定的业务处理,不需要有任何返回值

组件的生命周期


1.组件运行的过程

 组件的生命周期指的是:组件从创建->运行(渲染)->销毁的整个过程,强调的是一个时间段

 2.如何监听组件的不同时刻

vue框架为组件内置了不同时刻的生命周期函数,生命周期函数会伴随着组件的运行而自动调用。例如:

①当组件在内存中被创建完毕之后,会自动调用created函数

②当组件被成功的渲染到页面上之后,会自动调用mounted函数

③当组件被销毁完毕之后,会自动调用unmounted函数

3.如何监听组件的更新 

当组件的data数据更新之后,vue会自动重新渲染组件的DOM结构,从而保证View视图展示的数据和Model数据源保持一致。

当组件被重新渲染完毕之后,会自动调用uodated生命周期函数。

 4.组件中的主要的生命周期函数

注意:在实际开发中,created最常用的生命周期函数! 

5.组件中全部的生命周期函数

疑问:为什么不在beforeCreate中发ajax请求初始数据? 

因为,在拿到ajax返回的数据之后,要存到data里面去。存到data里面去,才能在组件渲染的时候访问到data里面的数据。注意,在beforeCreate生命周期函数中,我们无法访问到data里面数据的,无法挂载到data里面供我们去使用的。

6.完整的生命周期图示

可以参考Vue官方文档给出的“生命周期图示”,进一步理解组件生命周期执行的过程:

生命周期钩子 | Vue.js (vuejs.org)

组件之间的数据共享


1.组件之间的关系

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

①父子关系

②兄弟关系

③后代关系

2.父子组件之间的数据共享

父子组件之间的数据共享又分为:

父->子共享数据

子->父共享数据

父<->子双向数据同步

2.1父组件向子组件共享数据

父组件通过v-bind属性绑定向子组件共享数据。同时,子组件需要使用props接收数据。示例代码如下:

2.2 子组件向父组件共享数据

子组件通过自定义事件的方式向父组件共享数据。示例代码如下:

 2.3父子组件之间数据的双向同步

父组件在使用子组件期间,可以使用v-model指令维护组件内外数据的双向同步:

<template>
  <div>
    <h1>App根组件{{ count }}</h1>
    <!-- <Son :data="count" @numchange="getNum"></Son> -->
    <Son v-model:data="count"></Son>
  </div>
</template>

<script>
import Son from "../03Post/Son.vue";
export default {
  name: "MyApp",
  data() {
    return {
      count: 0,
    };
  },
  methods: {},
  components: {
    Son,
  },
};
</script>

<style>
</style>
<template>
  <div>
    <h1>这是子组件</h1>
    <h1>这是父->子{{ data }}</h1>
    <button type="button" @click="add">+1</button>
  </div>
</template>

<script>
export default {
  props: ["data"],
  emits: ["update:data"],
  methods: {
    add() {
      //   this.$emits("numchange", this.num + 1);
      this.$emit("update:data", this.data + 1);
    },
  },
};
</script>

<style>
</style>

3.兄弟组件之间的数据共享

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

 3.1安装mitt依赖包

在项目中运行如下的命令,安装mitt依赖包:

3.2创建公共的EventBus模块

在项目中创建公共的eventBus模块如下: 

 3.3在数据接收方自定义事件

在数据接收方,调用 bus.on('事件名称',事件处理函数)方法注册一个自定义事件。示例代码如下:

3.4在数据发送方触发事件

 在数据发送方,调用 bus.emit('事件名称',要发送的数据)方法触发自定义事件。示例代码:

 4.后代关系组件之间的数据共享

后代关系组件之间共享数据,指的是父节点的组件向其子孙组件共享数据。此时组件之间的嵌套关系比较复杂,可以使用 provide  inject 实现后代关系组件之间的数据共享。

4.1父节点通过provide共享数据

父节点的组件可以通过provide方法,对其子孙组件共享数据:

 4.2子孙节点通过inject接收数据

子孙节点可以使用inject数组,接收父级节点向下共享的数据。示例代码如下:

4.3父节点对外共享响应式的数据

 父节点使用provide向下共享数据时,可以结合computed函数向下共享响应式的数据。示例代码如下:

4.4子孙节点使用响应式数据

如果父级节点共享的是响应式的数据,则子孙节点必须以.value的形式进行使用。示例代码如下:

 5.vuex

vuex是终极的组件之间的数据共享方案。在企业级的vue项目开发中,vuex可以让组件之间的数据共享变得高效清晰、且易于维护。(父组件和子组件,父组件和孙子组件之间存在复杂的数据传递关系,vuex应运而生)

6.总结

  • 父子关系

    •  父->子  属相绑定

    • 子->父   事件绑定

    • 父<->子  组件上的v-model

  •  兄弟关系
    • EventBus
  • 后代关系
    • provide&inject
  • 全局数据共享
    • vuex

 Vue 3.x中全局配置axios


1.为什么要全局配置axios

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

①每个组件中都需要导入axios(代码臃肿)

②每次发请求都需要填写完整的请求路径(不利于后期的维护)

 2.如何全局配置axios

main.js入口文件中,通过app.config.globalProperties全局挂栽axios,示例代码如下:

 在mian.js中全局封装:

//1.按需导入createApp函数
import { createApp } from 'vue'
//2.导入待渲染的app.vue
import App from './components/v-model/App.vue'

import axios from 'axios'
//3.调用createApp函数,创建SPA应用的实例
const app = createApp(App);
axios.defaults.baseURL = 'https://applet-base-api-t.itheima.net'
app.config.globalProperties.$http = axios
    //4.调用mount()把App组件的模板结构,渲染到指定的el区域中
app.mount('#app')

GetInfo.vue

<template>
  <div>第一个</div>
  <button type="button" @click="getInfo">get</button>
</template>

<script>
export default {
  name: "GetInfo",
  data() {
    return {};
  },
  methods: {
    async getInfo() {
      const { data: res } = await this.$http.get("/api/get", {
        params: {
          name: "ls",
          age: 33,
        },
      });
      console.log(res);
    },
  },
};
</script>

PostInfo.vue

<template>
  <div>第二个</div>
  <button type="button" @click="postInfo">post</button>
</template>

<script>
export default {
  name: "PostInfo",
  data() {
    return {};
  },
  methods: {
    async postInfo() {
      const { data: res } = await this.$http.post("/api/post", {
        name: "zs",
        age: 16,
      });
      console.log(res);
    },
  },
};
</script>

购物车案例

写文章-CSDN创作中心https://mp.csdn.net/mp_blog/creation/editor/131834173

总结

①能够掌握watch侦听器的基本使用

  • 定义最基本的watch侦听器
  • immediate、deep、监听对象中单个属性的变化

②能够知道vue中最常用的生命周期函数

  • 创建阶段、运行阶段、销毁阶段
  • created、mounted

③能够知道如何实现组件之间的数据共享

  • 父子组件、兄弟组件、后代组件

④能够知道如何在vue3的项目中全局配置axios

  • main.js入口文件中进行配置
  • app.config.globalProperties.$http=axios

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

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

相关文章

什么小程序需要商家自营相关类目?

1、百货&#xff1a;小程序主体公司综合零售商&#xff0c;在线售卖多种日用品&#xff0c;需补充商家自营-百货类目。预包装食品定义&#xff1a; 预包装食品&#xff0c;指预先定量包装或者制作在包装材料和容器中的食品&#xff1b;包括预先定量包装以及预先定量制作在包装…

微信小程序中如何携带参数跳转到tabBar页面

在小程序中使用了tabBar组件之后就不能用wx.navigateTo跳转到tabBar页面了 , 能跳转到tabBar页面的方法有以下两种 但是使用第一种方法时,会因为这种方法在路径后不能携带参数,所以行不通 那么就只能用第二种方法 , 用wx.reLaunch进行跳转 , 地址后跟上自己想要的参数 , 或者用…

使用Vue+elementUI实现CRUD

文章目录 前言一、简介二、使用Vue-Cli搭建Vue项目1. vue-cli 介绍2.axios.js 介绍3.Element-Ul 介绍4.moment.js 介绍5.搭建项目6.添加main.js配置7.修改App.vue8. 将moment.js 格式 Date 类型引入9. 加入分页10. 实现删除11. 实现添加12. 实现修改 总结 前言 最近了解了一下…

Qt 模态 非模态对话框 半模态 不阻塞对话框

Part1&#xff1a; 什么是模态和非模态对话框 对话框分为模态对话框和非模态对话框。 所谓模态对话框 所谓模态对话框&#xff0c;会阻塞同一应用程序中其它窗口的输入。同时会阻塞当前线程&#xff1b;程序不再下执行&#xff1b; 关闭 窗口&#xff0c;执行下面的代码&a…

从Nginx学习如何获取时间

最近因为工作接触到Nginx的学习&#xff0c;我就把Nginx的源代码下载下来&#xff0c;然后对其进行了分析。发现Nginx的性能强大离不开作者编码的苦心&#xff0c;作者将C的性能发挥到了极致&#xff0c;每个变量都用得非常出神入化。有如此强大的功能&#xff0c;才支撑了全球…

React:从 npx开始

使用 npm 来创建第一个 recat 文件&#xff08; react-demo 是文件名&#xff0c;可以自定义&#xff09; npx create-react-app react-demo npx是 npm v5.2 版本新添加的命令&#xff0c;用来简化 npm 中工具包的使用 原始&#xff1a; 全局安装npm i -g create-react-app 2 …

格式工厂5.10.0版本安装

目前格式工厂有很多&#xff0c;大多都可以进行视频转换 之前遇到一个用ffmpeg拉流保存的MP4在vlc和迅雷都无法正常播放的问题&#xff0c;发现视频长度不对&#xff0c;声音也不对&#xff0c;最后换到了格式工厂的格式播放器是可以正常播放的 格式工厂下载之家的地址 http…

【历史上的今天】7 月 20 日:人类登上月球;数据仓库之父诞生;Mac OS X Lion 发布

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 7 月 20 日&#xff0c;在 2005 年的今天&#xff0c;时任微软全球副总裁的李开复加盟谷歌担任谷歌全球副总裁及中国区总裁。谷歌公司在发布聘请李开复消息的同…

ffplay播放器剖析(5)----视频输出剖析

文章目录 1.视频输出模块1.1 视频输出初始化1.1.1 视频输出初始化主要流程1.1.2 calculate_display_rect初始化显示窗口大小 1.2 视频输出逻辑1.2.1 event_loop开始处理SDL事件1.2.2 video_refresh1.2.2.1 计算上一帧显示时长,判断是否还要继续上一帧1.2.2.2 估算当前帧显示时长…

数据结构——(一)绪论

&#x1f449;数据元素整体思维导图 欢迎补充 一、基本概念❤️ 1.1基本术语⭐️ &#xff08;1&#xff09;数据 客观事务属性的数字、字符。 &#xff08;2&#xff09;数据元素 数据元素是数据的基本单位&#xff0c;一个数据元素可由若干数据项组成&#xff0c;数据项是…

【测试开发】Python+Django实现接口测试工具

PythonDjango接口自动化 引言&#xff1a; 最近被几个公司实习生整自闭了&#xff0c;没有基础&#xff0c;想学自动化又不知道怎么去学&#xff0c;没有方向没有头绪&#xff0c;说白了其实就是学习过程中没有成就感&#xff0c;所以学不下去。出于各种花里胡哨的原因&#xf…

C语言第七课----------函数的定义及使用--------C语言重要一笔

作者前言 个人主页::小小页面 gitee页面:秦大大 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________ 目录 1.函数是什么 2. 库函数 3. 自定义函数 4. 函数参数 5. 函数调用 6. 函数的嵌套调用和链式访问 7. 函数的声…

《向量数据库指南》:使用公共的Pinecone数据集

目录 数据集包含向量和元数据 列出公共数据集 加载数据集 迭代数据集 分批迭代文档并插入到索引中。 将数据集插入为数据帧。 接下来怎么做 本文档介绍如何使用现有的Pinecone数据集。 要了解创建和列出数据集的方法,请参阅创建数据集。 数据集包含向量和元数据 P…

C++的对象优化经验

先看一个例子&#xff1a; class Test{ private:int ma;public:Test(int a 0) : ma(a) { cout << "Test(int a)" << endl; }~Test() { cout << "~Test" << endl; }Test(const Test &t){ma t.ma;cout << "Test(c…

【软件工程中的各种图】

1、用例图&#xff08;use case diagrams&#xff09; 【概念】描述用户需求&#xff0c;从用户的角度描述系统的功能 【描述方式】椭圆表示某个用例&#xff1b;人形符号表示角色 【目的】帮组开发团队以一种可视化的方式理解系统的功能需求 【用例图】 2、静态图(Static …

CXL Bias Mode (1) - Bias Mode 背景与分类

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

波奇学C++:实现一个简单的vector以及避开雷

vector的文档&#xff1a;vector - C Reference (cplusplus.com)​​​​​ 什么是vector&#xff1f; vector是数组。vector空间连续&#xff0c;可变大小&#xff0c;可存放自定义类型。 vector简单的使用 vector<int> v; //int型实例化 v.push_back(1);//插入数据 …

selenium定位rect元素

rect元素属性 rect元素的属性如下&#xff1a; x&#xff1a;此属性确定矩形的x坐标。 值类型&#xff1a;| ; 默认值&#xff1a;0 动画&#xff1a;是y&#xff1a;此属性确定矩形的y坐标。 值类型&#xff1a;| ; 默认值&#xff1a;0 动画&#xff1a;是width&#xff1a…

Web后端开发总结

后端web开发大致流程 和对应的核心技术 对应技术的来源 springMVC可以理解为spring框架中的web开发框架 springMVCSpringMybatis就是我们熟知的ssm框架了

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 21 日论文合集)

文章目录 一、检测相关(15篇)1.1 Representation Learning in Anomaly Detection: Successes, Limits and a Grand Challenge1.2 AlignDet: Aligning Pre-training and Fine-tuning in Object Detection1.3 Cascade-DETR: Delving into High-Quality Universal Object Detectio…