Vue3-23-组件-依赖注入的使用详解

news2024/11/23 17:21:34

什么是依赖注入

个人的理解 : 
    依赖注入,是在 一颗 组件树中,由 【前代组件】 给 【后代组件】 提供 属性值的  一种方式 ;
    这种方式 突破了 【父子组件】之间通过 props 的方式传值的限制,只要是 【前代组件】提供的 依赖,【后代组件】都可以执行注入使用;
    我愿称之为 【跨代传值】。

依赖注入使用到的 关键方法:
provide() : 提供依赖
inject() : 注入依赖

依赖注入使用的注意事项

1、依赖注入的组件 ,必须是 一棵组件树的 前后代关系,兄弟组件不支持;
2、不建议后代组件中直接修改 注入的依赖的值,建议 前代组件中 将修改依赖的方法一并暴露出去;
3、依赖注入支持 全局的注入(这个较为特殊一些);
借用官网的一张图就是下面的样子:

在这里插入图片描述

依赖注入的使用方式

1、注入普通值 : 直接指定 key  和 value 
2、注入响应式的值 : 注入的值是一个 响应式的对象
3、注入时提供默认值 :inject() 方法 第二个参数可以指定默认值,当没有提供依赖时 展示的时默认值
4、限制 提供的数据不能被 后代修改 : 使用 readonly 进行限制
5、同时提供响应式的修改方法
6、全局提供依赖 ; 可以在 app 中进行全局提供依赖,所有的组件都可以注入依赖
7、使用 Symbol() 的方式指定 key
8、给 依赖注入 提供 类型约束

下面对上述的清醒进行案例介绍:

1、注入普通值

provide(key,value) : 提供依赖
const value = inject(key) : 注入依赖

前代组件 : 提供依赖

<template>

    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}

        <br><br>

        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
  
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    // 提供一个普通的依赖对象
    provide('key1','key1 的值')

</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        注入的普通的依赖值 :{{ key1Value }}
    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject } from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 注入依赖 - 普通的数据
    const key1Value = inject('key1')
    console.log('后代组件中接收到的 key1 的值 : ',key1Value)
    
</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果:

在这里插入图片描述

2、注入响应式的值

前代组件 : 提供依赖

<template>

    
    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}

        <br>  
        APP.vue 中的 abc : {{ abc }}
        <br>
        <br>
        
        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
    
  
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'


    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    // 提供一个响应式的依赖对象
    const abc = ref(1001)
    provide('key2',abc)

</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        
        注入的响应式依赖 :{{ key2Value }}

    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject} from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 注入依赖-响应式的依赖
    const key2Value = inject('key2') 
    console.log('后代组件中接收到的 key2 的值 :',key2Value)
    
</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果:

在这里插入图片描述

3、注入依赖时写一个默认值

后代组件 在进行 依赖注入时,如果前代组件没有 提供依赖,则可以只用默认值进行代替
默认值 是 inject() 方法的第二个参数

前代组件 : 提供依赖

<template>

    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}

        <br>  <br>

        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
    
  
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'


    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')
    
</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        
        注入的响应式依赖 :{{ key2Value }}

    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject,toRef } from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 注入依赖-响应式的依赖
    const key2Value = inject('key2','key2的默认值') 
    console.log('后代组件中接收到的 key2 的值 :',key2Value)

    
</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果:

在这里插入图片描述

4、提供响应式的修改方法

前代组件 : 提供依赖
此时提供的依赖是 一个对象的形式 :包含 数据方法

<template>

    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}

        <br>  
        APP.vue 中的 abc : {{ abc }}
        <br>

        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'


    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    // 提供一个响应式的依赖对象
    const abc = ref(1001)
    
    // 提供修改的方法
    const changeABC = ()=>{
        console.log('App 中修改 abc 的值为 888');
        abc.value = 888;
    }

    // 提供 依赖对象 和 方法
    provide('key2',{abc,changeABC})

</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        注入的响应式依赖 :{{ key2Value }}
        <br>
        <button @click="changeAbcFromHd">修改 abc 的值</button>

    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject} from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 注入依赖-响应式的依赖
    const key2Value = inject('key2') 
    console.log('后代组件中接收到的 key2  :',key2Value)


    // 点击按钮修改 依赖的值
    const changeAbcFromHd = ()=>{
        key2Value.changeABC();
    }
    
</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果: 注意观察点击前后的 数据状态的变化

初始页面点击按钮后
在这里插入图片描述在这里插入图片描述

5、readonly 限制修改

当想限制传递的依赖只能是只读时,需要使用 readonly 关键字进行限制;
注意 : 只能是针对 没有提供修改函数的依赖,如果该依赖提供了修改函数,通过修改函数触发的修改仍然是有效的。

前代组件 : 提供依赖 : 一个普通的,一个只读的

<template>

    
    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}

        <br>  
        APP.vue 中的 abc : {{ abc }}
        <br>
        APP.vue 中的 xyz : {{ xyz }}
        <br>

        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide,readonly } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    // 提供一个普通的依赖对象
    // provide('key1','key1 的值')
    // 提供一个响应式的依赖对象
    const abc = ref(1001)
    const xyz = ref(2002)
    

    // 提供 依赖对象
    provide('key2',abc)

    // 提供一个只读的依赖对象
    provide('key3',readonly(xyz))
    
    
</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        <!-- 注入的普通的依赖值 :{{ key1Value }} -->
        <!-- <br> -->
        注入的响应式依赖key2 :{{ key2Value }}
        <br>
        注入的响应式依赖key3 :{{ key3Value }}
        <br>
    
    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject } from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 注入依赖-响应式的依赖
    const key2Value = inject('key2') 
    console.log('后代组件中接收到的 key2  :',key2Value)

    const key3Value = inject('key3') 
    console.log('后代组件中接收到的 key3  :',key2Value)

    // 延迟10s 执行修改
    console.log(new Date())
    setTimeout(() => {
        console.log(new Date(), '开始执行 依赖值的修改' )
        key2Value.value = 666;
        key3Value.value = 888;
    }, 10000);

</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果:

在这里插入图片描述
在这里插入图片描述

6、全局提供依赖

main.js : 提供全局依赖

import { createApp } from 'vue'

// 根组件
import App from './App.vue'

// 创建应用实例
const app = createApp(App)

// 直接注入一个全局的 依赖
app.provide('globalKey1','全局的变量值1')

// 挂在应用,渲染页面,这一步应该是在最后执行的
app.mount("#app")

后代组件 : 注入依赖

<template>
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { inject } from 'vue'

    const globalValue = inject('globalKey1')
    console.log('组件中注入全局的变量 :',globalValue)
    
</script>
    
<style scoped>
</style>

运行效果:

在这里插入图片描述

7、Symbol() 的方式指定 key

之前我们在提供依赖的时候,都是直接用字符串作为依赖的key,
说实话,这样做 一点毛病没有。
但是,大家不都是讲求规范嘛,Symbol() 就提供了这种方式:
1、写一个专门用来声明 key 的文件;
2、前代组件 引入 key,提供依赖;
3、后代组件 引入 key ,注入依赖。

key 文件


// 声明 两个key
export const KEY1 = Symbol()

export const KEY2 = Symbol()

前代组件 : 提供依赖

<template>

    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}

        <br>  
        APP.vue 中的 abc : {{ abc }}
        <br>
    
        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
    
  
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')

    // 引入定义的key
    import { KEY1 ,KEY2} from './key';
    // 提供依赖
    const abc = ref(1001)
    provide(KEY1,abc)
    provide(KEY2,'key2valueladfadfa')

</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        <!-- 注入的普通的依赖值 :{{ key1Value }} -->
        <!-- <br> -->
        注入的响应式依赖key :{{ keyValue }}
        <br>
        注入的响应式依赖key2 :{{ key2Value }}
        <br>
      
    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject } from 'vue'

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')
    
    // 引入 key 
    import { KEY1,KEY2 } from './key';
    // 注入依赖
    const keyValue = inject(KEY1) 
    const key2Value = inject(KEY2) 

</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果:

在这里插入图片描述

8、 依赖注入 提供 类型约束

InjectionKey 接口 : 限制 依赖注入的值的类型

key文件


// 从 vue 中 导入 类型
import type { Ref,InjectionKey } from 'vue'

// 声明 key : 指定注入的依赖的值的类型是 Ref
export const KEY1 = Symbol() as InjectionKey<Ref<number>>
// 声明 key : 指定注入的依赖的值的类型是 string
export const KEY2 = Symbol() as InjectionKey<string>

前代组件 : 提供依赖

<template>

    <div class="basediv">
      
        APP.vue 中的 msg : {{ msg }}
        <br>  
        APP.vue 中的 abc : {{ abc }}
        <br>
    
        <!-- 引入子组件 -->
        <ChildComponent />
    
    </div>
  
</template>
    
<script setup lang="ts">

	// 引入 provide 方法
    import { ref,provide } from 'vue'

    // 引入子组件
    import ChildComponent from './ChildComponent.vue'

    // 声明父组件的一个变量
    const msg = ref('这是父组件的msg变量')
    
    // 引入定义的key
    import { KEY1 ,KEY2} from './key';
    // 提供依赖
    const abc = ref(1001)
    // 提供一个响应式的对象依赖
    provide(KEY1,abc) 
    // 提供一个 普通的 string 对象
    provide(KEY2,'key2valueladfadfa')

</script>
    
<style scoped>

    .basediv{
        width: 600px;
        height: 400px;
        border: 1px solid red;
    }
</style>

后代组件 : 注入依赖

<template>

    <!-- 子组件 -->
    <div class="childdiv">
        
        子组件 - msg : {{ msg }}
        <br>
        <!-- 注入的普通的依赖值 :{{ key1Value }} -->
        <!-- <br> -->
        注入的响应式依赖key :{{ keyValue }}
        <br>
        注入的响应式依赖key2 :{{ key2Value }}
        <br>
      
    </div>
    
</template>
    
<script setup lang="ts">

	// 引入 inject 方法
    import { ref,inject } from 'vue'

    // 引入 Ref 类型
    import type { Ref } from 'vue';

    // 声明一个变量
    const msg = ref('这是子组件的msg变量')

    // 引入 key 
    import { KEY1,KEY2 } from './key';
    // 注入依赖 : 同样可以使用泛型指定类型
    const keyValue = inject<Ref<number>>(KEY1) 
    const key2Value = inject<string>(KEY2,"默认值") 

</script>
    
<style scoped>

    .childdiv{
        width: 350px;
        border: 1px solid green;
    }

</style>

运行效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

至此,依赖注入的使用就完成了。

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

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

相关文章

自动化测试工具-Selenium:WebDriver的API/方法使用全解

我们上一篇文章介绍了Selenium的三大组件&#xff0c;其中介绍了WebDriver是最重要的组件。在这里&#xff0c;我们将看到WebDriver常用的API/方法&#xff08;注&#xff1a;这里使用Python语言来进行演示&#xff09;。 1. WebDriver创建 打开VSCode&#xff0c;我们首先引…

数据结构与算法之美学习笔记:39 | 回溯算法:从电影《蝴蝶效应》中学习回溯算法的核心思想

目录 前言如何理解“回溯算法”&#xff1f;两个回溯算法的经典应用内容小结 前言 本节课程思维导图&#xff1a; 我们在前面深度优先搜索算法利用的是回溯算法思想。这个算法思想非常简单&#xff0c;但是应用却非常广泛。它除了用来指导像深度优先搜索这种经典的算法设计之外…

原生微信小程序中使用-阿里字体图标-详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…

GLTF/GLB模型在线预览、编辑、动画查看以及材质修改

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 GLTF在线编辑器提供了一个内置的模型查看器&#xff0c;可以加载和预…

NC65凭证保存时,报“错误:凭证内部错误号:[10001]凭证借贷金额不平!”

NC65凭证保存时&#xff0c;报“错误:凭证内部错误号&#xff1a;[10001]凭证借贷金额不平&#xff01;” 实际就是分录少录了2分钱。加上去即可。 代码排查&#xff1a; nc.bs.gl.voucher.VoucherBO.save(VoucherVO voucher, Boolean isneedcheck) throws BusinessExceptio…

微服务之服务注册与发现

服务注册发现 服务注册就是维护一个登记簿&#xff0c;它管理系统内所有的服务地址。当新的服务启动后&#xff0c;它会向登记簿交待自己的地址信息。服务的依赖方直接向登记簿要 Service Provider 地址就行了。当下用于服务注册的工具非常多 ZooKeeper&#xff0c;Consul&…

Centos8一键启动多个Springboot jar包 改进版

一、前言 上篇《Centos8一键启动多个Springboot jar包》写了在centos环境下如何快速启动多个jar包。实际使用下来还是会发现不够完美&#xff0c;如我想重新启动10个jar包里面的两个&#xff0c;我得这么写&#xff1a; ./start.sh restart test1.jar; ./start.sh restart te…

为什么项目管理工具需要项目财务信息?

在讨论项目时&#xff0c;钱是绕不开的话题。 资金是项目管理中最重要的因素之一&#xff0c;与范围和时间并列&#xff0c;三者共同构成了 “三重约束”。例如&#xff0c;如果缩短项目时间&#xff0c;就必须增加成本。 如果无法清楚了解开支及其对项目的影响&#xff08;反…

TrustZone之可信操作系统

有许多可信内核&#xff0c;包括商业和开源的。一个例子是OP-TEE&#xff0c;最初由ST-Ericsson开发&#xff0c;但现在是由Linaro托管的开源项目。OP-TEE提供了一个功能齐全的可信执行环境&#xff0c;您可以在OP-TEE项目网站上找到详细的描述。 OP-TEE的结构如下图所示&…

成熟又专业的内外网文件交换系统,了解一下!

近年来全球网络安全威胁态势的加速严峻&#xff0c;使得企业对于网络安全有了前所未有的关注高度。越来越多的企业在网络安全体系建设和日常工作中&#xff0c;都面临一个核心问题&#xff0c;如何保护企业核心数据资产&#xff1f; 绝大多数企业都在内部实施了网络隔离&#x…

WEB测试之兼容性测试

1. 软件兼容性测试 兼容性测试是指待测试项目在特定的硬件平台上&#xff0c;不同的应用软件之间&#xff0c;不同的操作系统平台上&#xff0c;在不同的网络等环境中能正常的运行的测试。 兼容性测试的目的&#xff1a;待测试项目在不同的操作系统平台上正常运行&#xff0c…

如何通过ETLCloud的API对接功能实现各种SaaS平台数据对接

前言 当前使用SaaS系统的企业越来越多&#xff0c;当我们需要对SaaS系统中产生的数据进行分析和对接时就需要与SaaS系统提供的API进行对接&#xff0c;因为SaaS一般是不会提供数据库表给企业&#xff0c;这时就应该使用ETL&#xff08;Extract, Transform, Load&#xff09;的…

数据挖掘-09-IBM员工流失率预测(包括数据和代码)

文章目录 0. 代码数据下载1. 背景描述2. 探索性数据分析2.1 数据集分布2.2 特征的相关性2.3 散点图可视化 3. 特征工程和分类编程4. 实施机器学习模型3.1 随机森林分类器a. 通过随机森林进行特征排名b. 可视化树形图 3.2 梯度增强分类器a. 基于梯度增强模型的特征排序 3.3 结论…

《每天一分钟学习C语言·四》文本读写操作及二进制读写

fopen(参数1,参数2)&#xff0c;第一个参数是要打开的文件名&#xff0c;文件名字符串&#xff0c;第二个参数用于制定文件打开模式的一个字符串。 注&#xff1a;如果要打开某个盘的文本如F盘test文件夹下的test.txt文本&#xff0c;则fopen(“F:\test\test.txt”,”r”); 程序…

【Spring实战】创建第一个项目

文章目录 使用 Spring Initializr 创建第一个项目1. 打开官网2. 填写信息3. 生成工程4. 解压工程5. 导入 IDEA6. 编写 Hello world7. 启动项目8. 访问验证9. 详细代码最后 Spring 是一个强大且广泛使用的 Java 开发框架&#xff0c;提供了全面的基础设施和工具&#xff0c;用于…

springboot使用Validated实现参数校验

做为后端开发人员&#xff0c;一定有前端传的数据是可能会出错的警惕性&#xff0c;否则程序就可能会出错&#xff0c;比如常遇到的空指针异常&#xff0c;所以为了程序运行的健壮性&#xff0c;我们必须对每一个参数进行合法校验&#xff0c;就能避免很多不必要的错误&#xf…

刷题记录第五十一天-去除重复字母

题目要求的是字典序最小的结果。只需要理解一点就是按大小顺序排列的字符串的字典序就是最小的&#xff0c;如“abcd”这种。 解题思路如下&#xff1a; 首先明确要使用栈结构&#xff0c;并且是从栈底到栈顶递增&#xff0c;要尽可能保证递增&#xff0c;这样就能保证字典序最…

【Java系列】多线程案例学习——单例模式

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录…

第七节TypeScript 循环

1、简述 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 循环语句允许我们多次执行一个语句或语句组。 循环语句流程图&#xff…

Mybatis-Plus——02配置SQL日志,CRUD增(新注解)

配置SQL日志&#xff0c;CRUD增 一、配置SQL日志二、CRUD——增insert2.1、主建生成策略2.2、主建设置自增插入————————如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏(*&#xffe3;︶&#xffe3;)&#xff0c;谢谢~~ 一、配置SQL日志 mybatis-plus…