Vue-组件高级(上)

一、目标

  • 能够掌握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

猜你喜欢

转载自blog.csdn.net/a_xia_o/article/details/131781295