使用loading动画让你的条件渲染页面更高级

news2024/12/26 23:38:41

前言

在我们做项目的使用常常会使用条件渲染有选择的给用户展示相关页面,如果渲染的数据或场景比较多比较复杂,那么往往需要3、4s的时间去完成,用户点击了之后就会陷入3、4s的空白期,并且这段时间屏幕是处于一种”未响应“的状态,用户并不知道自己是否点击生效了。这篇文章主要是介绍一种让条件渲染展示页面更丝滑的方法,这样能大大提高用户的体验。


效果图

在渲染还未完成时展现loading动画给用户

这个看上去是在多个页面进行跳转,实则是只有一个页面,不过是用了条件渲染和loading动画让用户感觉自己跳转了页面。这里就不具体介如何使用条件渲染来将多个页面整合成一个页面了,我之前的博客有详细的描述(https://blog.csdn.net/Zchengjisihan/article/details/129016013?spm=1001.2014.3001.5501)。这篇博客我们将重点放在loading动画上。


核心思想

  • 使用外部组件库的vant-weapp的Popup组件

  • 使用CSS的animation动画

  • 使用JS的setTimeout来等全部数据渲染完成后再隐藏loading动画


vant-weapp的Popup组件

我使用的是样式是从上方弹出并且是圆角的形式,你可以根据自己的需求来调整从哪个方向弹出,是否显示 ”× “ 等等,这些Popup组件支持的api你均可以在官方文档下找的到,在这我就不赘述了


在Popup上添加loading样式

这里需要用到相关CSS的animation知识,如果你想换个更炫酷的loading动画可以直接在相关网站上搜索,很多源码的。我把自己的loading动画放在下面了(这个是参考一个博主的,修改了主色调)

<!-- 弹出层 -->
<van-popup show="{{ popShow }}" position="top" custom-style="height: 300rpx;" round>
      <!-- loading盒子,用来装loading动画的 -->
      <view class="loadingBox"  style="margin-top: 200rpx;">
             <view class="loader-dots">
             <view></view>
             <view></view>
             <view></view>
             <view></view>
             <view></view>
             </view>
      </view> 
</van-popup>

.loader-dots view{
       width: 40rpx;
       height: 40rpx;
       background: brown;
       border-radius: 30%;
       display:inline-block;
       animation: slide 1s infinite;
     }
.loader-dots view:nth-child(1){
       animation-delay:.1s;
}
.loader-dots view:nth-child(2){
       animation-delay:.2s;
}
.loader-dots view:nth-child(3){
       animation-delay:.3s;
       background: linear-gradient(to bottom right,rgb(155, 55, 55),#FFFFFF)
}
.loader-dots view:nth-child(4){
       animation-delay:.4s;
       background: linear-gradient(to bottom right,rgb(145, 55, 55),#FFFFFF)
}
.loader-dots view:nth-child(5){
       animation-delay:.5s;
       background:linear-gradient(to bottom right,rgb(135, 55, 55),#FFFFFF)
}
@keyframes slide{
0%{
       transform: scale(1)
}
50%
{
       opacity:0.3;
       transform:scale(2);
}
100%{
       transform: scale(1)
}

若渲染数据较大或增加loading的时间需使用延迟函数setTimeout

除了上诉情况,我们也可以在登录页面的跳转的时候添加这个loading动画。

使用setTimeout的好处一方面是可以等待数据全部渲染完成后再展示给用户,从而避免了数据残留以及数据错位的情况;另一方面则是可以自主设置最短loading动画的时间

例:如上图:虽然渲染完全部的数据只花了几毫秒,但是为了稍微的延迟登录时间,我将setTimeout的时间参数调整到了1000(1s)。我将所有代码放在下面了,需要的自取~

<!-- wxml -->
<!-- 原始内容层 -->
<view class="box">
       <van-divider contentPosition="center" 
       customStyle="color: grey; border-color: grey; font-size: 36rpx; width: 90% ; margin-left:40rpx ; margin-right:40rpx ; margin-top:150rpx"
       >
       团团活动管理
       </van-divider>
       <button bindtap="goIndex" class="button_location" style="width: 450rpx; height: 100rpx"> 
              <text style="font-size: 36rpx; float: left; margin-left: 80rpx;">用户端登录</text>
              <van-icon name="friends-o" size="60rpx" custom-style="height:60rpx; margin-top:15rpx;"/>
       </button>
       <button bindtap="goNext" class="Teacherbutton_location" style="width: 450rpx; height: 100rpx"> 
              <text style="font-size: 36rpx; float: left; margin-left: 80rpx;">审批端登录</text>
              <van-icon name="manager-o" size="60rpx" custom-style="height:60rpx; margin-top:15rpx;"/> 
       </button>
       <!-- 右下角的图书和提示字 -->
       <view style="width: 140rpx;height: 180rpx;position: absolute; right: 40rpx; bottom: 70rpx;" bindtap="lookGuide">
              <view style="width: 140rpx;height: 40rpx; font-size: 28rpx; text-align: center; font-weight: 700; color: brown;">手册及日志</view>
              <image src="../../icon/guide.png" style="width: 140rpx;height: 140rpx;"></image>
       </view>
       <van-divider contentPosition="center" 
       customStyle="color: grey; border-color: grey; font-size: 36rpx; width: 90% ; position: absolute;margin-left:40rpx ; margin-right:40rpx ; bottom:0px"
       >
       Copyright© STU引力弹簧工作室
       </van-divider>
</view>
<!-- 遮罩层 -->
<van-overlay show="{{ show }}" z-index="2">
       <view class="wrapper">
              <view class="login">
                     <view class="loginHead">
                            <image src="../../icon/tuantuan.png" class="tuantuan"></image>
                            <view class="cross">
                                   <van-icon name="cross" size="40px" custom-style="position:relative; margin-top:20rpx; margin-left:80rpx" bindtap="onClickHide"/>
                            </view>
                     </view>
                     <view class="loginBody">
                            <van-divider
                            contentPosition="left"
                            customStyle="color: grey; border-color: grey; font-size: 36rpx; width: 520rpx ; position:relative; padding-top:80rpx; padding-left:40rpx; ">
                                   Account
                            </van-divider>
                            <input bindinput="getAccount" class="inputborder1" placeholder="输入账号"></input>
                            <van-divider
                            contentPosition="left"
                            customStyle="color: grey; border-color: grey; font-size: 36rpx; width: 520rpx ; position:relative; padding-left:40rpx;"
                            >
                                   Password
                            </van-divider>
                            <input class="inputborder2" type="password"  placeholder="输入密码" value='{{password}}' bindinput='getPassWord'></input> 
                            <view bindtap="goRegister" class="goRegister">注册账号</view>
                            <view bindtap="goRetrieve" class="goRetrieve">忘记密码</view>
                     </view>
                     <view class="loginFeet">
                            <view class="loginButton">
                                   <button bindtap="enterIndex" style="width: 88%;border-radius: 40rpx;background-color: #D43030; color:#FFFFFF;box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.35);">登录</button>
                            </view>
                            <image src="../../icon/client-side.png" class="client-side"></image>
                     </view>
              </view>
       </view>
       <!-- 由于不显示导航栏故loading盒子需要修改margin-top值 -->
       <van-popup show="{{ popShow }}" position="top" custom-style="height: 300rpx;" round>
              <view class="loadingBox"  style="margin-top: 200rpx;">
                     <view class="loader-dots">
                     <view></view>
                     <view></view>
                     <view></view>
                     <view></view>
                     <view></view>
                     </view>
              </view> 
       </van-popup>
</van-overlay>       

const db  = wx.cloud.database()
Page({
       data: {
              popShow:false,
              show:false,
              password :'',
              account :''
       },
       goNext(e){
              console.log('点击了审批端登录')
              wx.navigateTo({
                url: '../nextChoice/nextChoice',
              })
       },
       goIndex(e){
              console.log('点击了用户登录')
              //显示用户端的遮罩层
              this.setData({
                     show:true
              })
       },
       // 隐藏遮罩层
       onClickHide() {
              this.setData({ 
                     show: false 
              });
       },
       //点击登录
       enterIndex(){
              let that = this
              let account = this.data.account
              let password = this.data.password
              db.collection("studentUser")
              .where({
                     account:account
              })
              .get({})
              .then(res=>{
                     console.log("查询数据库成功",res.data)
                     if(password == res.data[0].password){
                            console.log('登录成功')
                            this.setData({
                                   popShow:true
                            })
                            setTimeout(() => {
                                   wx.switchTab({
                                          url: '../index/index',
                                          success(){
                                                 that.setData({
                                                        popShow:false
                                                 })
                                          }
                                   })
                            }, 1000);
                     }
                     else{
                            console.log("登录失败")
                            wx.showToast({
                              title: '登录失败,账号或密码不正确',
                              icon : "none"
                            })
                     }
              })
              .catch(res=>{
                     wx.showToast({
                            title: '登录失败,账号或密码不正确',
                            icon : "none"
                          })
              })




       },
       //获取输入的账号
       getAccount(e){
              this.setData({
                     account : e.detail.value
              })
       },
       //获取输入的密码
       getPassWord: function(e) {
              var password = e.detail.value;
              this.setData({
                password: password
              })
       },
       //进入注册界面
       goRegister(){
              wx.navigateTo({
                     url: '../closeRegister/closeRegister',
              })
       },
       //进入找回账号密码页面
       goRetrieve(){
              wx.navigateTo({
                     url: '../retrieve/retrieve',
              })
       }
})

{
       //json
       "usingComponents": {
              "van-icon": "@vant/weapp/icon/index",
              "van-overlay": "@vant/weapp/overlay/index",
              "van-divider": "@vant/weapp/divider/index",
              "van-popup": "@vant/weapp/popup/index"
       },
       "navigationStyle": "custom"
}

当前页面的CSS
text{
       padding-right: 10px;
}
.loginHead{
       width: 100%;
       height: 160rpx;
}
.cross{
       float: right;
       width: 160rpx;
       height: 120rpx;
       padding-top: 40rpx;
       padding-right: 40rpx;
}
/* 团团图片样式 */
.tuantuan{
       width: 160rpx;
       height: 120rpx;
       padding-top: 40rpx;
       padding-left: 40rpx;
}
.loginBody{
       width: 100%;
       height: 700rpx;
}
.loginFeet{
       width: 100%;
       height: 300rpx;
}
   /* 遮罩层内嵌盒子包装层 */
.wrapper {
       display: flex;
       align-items: center;
       justify-content: center;
       height: 100%;
     }
/* 遮罩层内嵌盒子内容层 */
.login{
       background-color: #FFFFFF;
       width: 600rpx;
       height: 1200rpx;
       border-radius: 40rpx;
}
/* 输入账号的input */
.inputborder1{
       margin-left: 40rpx;
       margin-right:40rpx;
       margin-bottom: 30rpx;
       padding-top: 30rpx;
       padding-bottom: 30rpx;
       padding-left: 30rpx;
       padding-right:30rpx;
       border-radius: 20rpx;
       border: 2rpx solid #F2E6E6;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.15);
}
/* 输入密码的input */
.inputborder2{
       margin-left: 40rpx;
       margin-right:40rpx;
       margin-bottom: 30rpx;
       padding-top: 30rpx;
       padding-bottom: 30rpx;
       padding-left: 30rpx;
       padding-right:30rpx;
       border-radius: 20rpx;
       border: 2rpx solid #F2E6E6;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.15);
}
/* button在wxss里面修改不了宽度和高度,故在wmxl里面添加style属性来实现 */
.loginButton{
       position: relative;
       padding-top: 100rpx;
     }

.goRegister{
       position: relative;
       top: 5rpx;
       float: right; 
       right: 40rpx; 
       font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
.goRetrieve{
       position: relative;
       top: 5rpx; 
       left: 40rpx;
       float: left; 
       font-family: 'Franklin Gothic Medium', 'Arial Narrow', Arial, sans-serif;
}
.client-side{
       width: 120rpx;
       height: 80rpx;
       float: right;
       margin-top:10rpx ;
       margin-right:20rpx;
}

总页面的CSS
/* choicePage 和 nextChoice的两个按钮 */
.Teacherbutton_location{
       margin-top: 20rpx;
       border-radius: 80rpx;
       color:black;
       background-color: #FFFFFF;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.15);
       border: 2rpx solid brown;
}
.button_location{
       border-radius: 80rpx;
       margin-top: 420rpx;
       color:#FFFFFF;
       background-color: #D43030;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.15);
       border: 2rpx solid #FFFFFF;
}
/* 无数据时显示的图片和文字格式 */
.noData{
       height: 700rpx;
       width: 100%;
       position: absolute;
       top: 200rpx;
       left: 0px;
       margin-top: 50rpx;
}
.fail{
       height: 700rpx;
       width: 100%;
       position: absolute;
       top: 100rpx;
       margin-top: 50rpx;
}
.tip{
       position: relative;
       margin-top: 800rpx;
       font-size: 36rpx;
       color:gray;
       text-align: center;
}
/* 所有状态标签的样式 */
.state_0{
       float: right;
       width: 160rpx;
       height: 80rpx;
       background-color:#FFC300;
       border-radius: 0 30rpx 0 30rpx;
}
.state_1{
      width: 160rpx;
      height: 80rpx;
      background-color:#43CF7C;
      border-radius: 0 30rpx 0 30rpx;
      z-index: 2;
}
.state_2{
       width: 160rpx;
       height: 80rpx;
       background-color:#FF5733;
       border-radius: 0 30rpx 0 30rpx;
       z-index: 2;
}
.state_4{
       float: right;
       width:160rpx;
       height:80rpx;
       background-color:#CCCCCC;
       border-radius:0 30rpx 0 30rpx;
       z-index: 2;
       flex-direction: row;
       position: relative;
       margin-left: 40rpx;
}
/* 用来装标签的盒子 */
.state_content{
       position: relative;
       margin-top:20rpx ;
       margin-left: 30rpx;
       font-size: 30rpx;
       color: white;
}
/* 预约老师和申请活动的盒子 */
.mine_application{
       margin-left: 50rpx;
       margin-right: 50rpx;
}
.mine_application_title{
       height: 90rpx;
       border-bottom: 5rpx solid #A6A6A6;
       font-size: 56rpx;
       font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.mine_application_content{
       height: 300rpx;
       width: 100%;
       display: flex;
       position: relative;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.1);
       margin-top: 40rpx;
       border-radius:30rpx;
       background-color: rgb(252, 252, 252);
       border: 1rpx solid rgb(210, 210, 210);
}
.mine_appointment_title{
       height: 90rpx;
       border-bottom: 5rpx solid #A6A6A6;
       font-size: 56rpx;
       font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}

.mine_appointment_content{
       height: 500rpx;
       width: 100%;
       display: flex;
       position: relative;
       box-shadow: 16rpx 8rpx 24rpx rgba(212,48,48, 0.1);
       margin-top: 30rpx;
       border-radius: 30rpx;
       background-color: rgb(252, 252, 252);
       border: 1rpx solid rgb(210, 210, 210);
}
/* 活动的具体样式 */
.event{
       font-size: 40rpx;
       font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
       position: relative;
       margin:30rpx;
       width: 90%;
       flex: 1;
}
.eventTime{
       margin-top: 10rpx;
       font-size: 28rpx;
       color: #A0A9BD;
}
/* loading盒子的样式 */
.loadingBox{
       margin-top: 60rpx;
       padding-left: 260rpx;
}
.loader-dots view{
       width: 40rpx;
       height: 40rpx;
       background: brown;
       border-radius: 30%;
       display:inline-block;
       animation: slide 1s infinite;
     }
.loader-dots view:nth-child(1){
       animation-delay:.1s;
}
.loader-dots view:nth-child(2){
       animation-delay:.2s;
}
.loader-dots view:nth-child(3){
       animation-delay:.3s;
       background: linear-gradient(to bottom right,rgb(155, 55, 55),#FFFFFF)
}
.loader-dots view:nth-child(4){
       animation-delay:.4s;
       background: linear-gradient(to bottom right,rgb(145, 55, 55),#FFFFFF)
}
.loader-dots view:nth-child(5){
       animation-delay:.5s;
       background:linear-gradient(to bottom right,rgb(135, 55, 55),#FFFFFF)
}
@keyframes slide{
0%{
       transform: scale(1)
}
50%
{
       opacity:0.3;
       transform:scale(2);
}
100%{
       transform: scale(1)
}
}

结语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

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

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

相关文章

【欧拉筛法】洛谷 P3383 线性筛素数

3383. 线性筛素数 文章目录题目描述输入格式&#xff1a;输出格式&#xff1a;数据范围输入样例输出样例方法一&#xff1a;埃氏筛法解题思路代码复杂度分析&#xff1a;方法二&#xff1a;欧拉筛法解题思路代码复杂度分析&#xff1a;两种方法对比埃氏筛法欧拉筛法题目描述 给…

Jetpack管理生命周期——Lifecycle

Android Jetpack 对于任何一个产品来说&#xff0c;我们开发中都会面对哪些问题&#xff1f;如&#xff1a;产品交互、用户体验、代码结构、数据获取、数据存储、网络优化、任务调度等等&#xff0c;虽然在现在的阶段这些问题已经有了很好的解决和优化&#xff0c;也有很多大神…

堆球问题,开普勒猜想(格密码相关)

目录 一. 介绍 二. 历史进展分析 三.2维下的堆球问题 四. 3维下的堆球问题 五. 8维与24维下的堆球问题 总结 一. 介绍 堆球问题又叫堆球理论、最密堆积、球填充&#xff0c;英文为The Theory Of Sphere Packings。 堆球问题的本质就是填充一堆大小相同的球。要求这些球…

FANUC机器人通过KAREL程序实现与PLC位置坐标通信的具体方法示例

FANUC机器人通过KAREL程序实现与PLC位置坐标通信的具体方法示例 在通信IO点位数量足够的情况下,可以使用机器人的IO点传输位置数据,这里以传输机器人的实时位置为例进行说明。 基本流程如下图所示: 基本步骤可参考如下: 首先确认机器人控制柜已经安装了总线通信软件(例如…

CMMI高效实施的5大注意事项

1、明确CMMI实施目标及范围 CMMI在实施过程中&#xff0c;需要根据组织的实际情况&#xff0c;确定CMMI的实施目标和范围&#xff0c;制定实施的计划表&#xff0c;为后续组织过程改进提供明确的方向。 CMMI高效实施注意事项&#xff1a;实施目标及范围的确定​ 2、建立…

虹科新闻 | 虹科与b-plus正式建立合作伙伴关系,共同致力于用于ADAS/AD系统开发的VV测量解决方案

虹科b-plus 携手共创未来&#xff01; 近期&#xff0c;虹科与德国b-plus正式建立合作伙伴关系。未来&#xff0c;虹科与b-plus将共同致力于提供用于ADAS/AD系统开发的V&V测量解决方案。 合作寄语 虹科CEO陈秋苑女士表示&#xff1a;“虹科非常期待与b-plus合作&#x…

线上研讨会报名 | 与龙智、Perforce共探大规模研发中的数字资产管理与版本控制,赢取千元大奖

2023年2月28日下午2:00&#xff0c;加入全球领先的数字资产管理工具厂商Perforce联合中国授权合作伙伴龙智举办的Perforce on Tour网络研讨会&#xff0c;除了与游戏、芯片、虚拟制作行业专家探讨并分享最佳实践外&#xff0c;还可以赢取惊喜大奖&#xff0c;包括千元华为手环、…

语言文件操作

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;C语言学习笔记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 C语言中的文件打开和关闭 文件指针 文件的打开和关闭 fclose 文件的顺序读写 fseek ftell …

Flink-多流转换(Union、Connect、Join)

文章目录多流转换分流基本合流操作联合&#xff08;Union&#xff09;连接&#xff08;Connect&#xff09;基于时间的合流——双流联结&#xff08;Join&#xff09;窗口联结&#xff08;Window Join&#xff09;间隔联结&#xff08;Interval Join&#xff09;窗口同组联结&a…

【Vue3】组件数据懒加载

组件数据懒加载-基本使用 目标&#xff1a;通过useIntersectionObserver优化新鲜好物和人气推荐模块 电商类网站&#xff0c;尤其是首页&#xff0c;内容有好几屏&#xff0c;而如果一上来就加载所有屏的数据&#xff0c;并渲染所有屏的内容会导致首页加载很慢。 数据懒加载&a…

Java面试题--熔断和降级的区别

熔断和降级都是系统自我保护的一种机制&#xff0c;但二者又有所不同&#xff0c;它们的区别主要体现在以下几点&#xff1a; 概念不同 触发条件不同 归属关系不同 1.概念不同 1.1熔断概念 “熔断”一词早期来自股票市场。熔断&#xff08;Circuit Breaker&#xff09;也…

Python3-数据类型转换

有时候&#xff0c;我们需要对数据内置的类型进行转换&#xff0c;数据类型的转换&#xff0c;一般情况下你只需要将数据类型作为函数名即可。 Python 数据类型转换可以分为两种&#xff1a; 隐式类型转换 - 自动完成 显式类型转换 - 需要使用类型函数来转换 隐式类型转换 在…

一图说明 monorepo 落地流程方案

关于 monorepo 初次讨论已有2年载&#xff0c;目前团队已经沉淀了成熟的技术方案且经受住了实战考验。所以特梳理相关如下&#xff1a; 也算是关于之前发起的 monorepo–依赖 的解答篇。 上图为目前团队贡献的主流程&#xff1a;① 本地开发 > ② 提交Git仓库 > ③ 触发…

网络安全高级攻击

对分类器的高层次攻击可以分为以下三种类型&#xff1a;对抗性输入&#xff1a;这是专门设计的输入&#xff0c;旨在确保被误分类&#xff0c;以躲避检测。对抗性输入包含专门用来躲避防病毒程序的恶意文档和试图逃避垃圾邮件过滤器的电子邮件。数据中毒攻击&#xff1a;这涉及…

一种改善调制宽带变换器的有意混叠方法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…

【数组与链表算法】矩阵算法在程序中常见的简单应用 | C++

第二十三章 矩阵算法 目录 第二十三章 矩阵算法 ●前言 ●矩阵算法与深度学习 ●一、矩阵相加 ●二、矩阵相乘 ●三、矩阵转置 ●四、稀疏矩阵 ●总结 前言 数组与链表都是相当重要的结构化数据类型&#xff0c;也都是典型线性表的应用。线性表用于计算机中的数据存储结构…

SpringCloud-学习笔记(五)nacos集群环境搭建

参考视频 集群搭建步骤 搭建MySQL集群并初始化数据库表 下载解压nacos 修改集群配置&#xff08;节点信息&#xff09;、数据库配置 分别启动多个nacos节点 nginx反向代理 安装数据库 官方的建议是使用MySQL组词给模式的高可用集群&#xff0c;这里为了方便演示&#xff0c;仅…

【大厂高频必刷真题100题】《有序矩阵中第 K 小的元素》 真题练习第27题 持续更新~

有序矩阵中第 K 小的元素 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。 你必须找到一个内存复杂度优于 O(n^2) 的解决方案。 示例 1: 输入:matrix = [[1,5,9…

makefile编写

文章目录什么是编译器GCC 编译器编写makefile什么是编译器 C语言代码由固定的词汇按照固定的格式组织起来&#xff0c;简单直观&#xff0c;程序员容易识别和理解&#xff0c;但是对于CPU&#xff0c;C语言代码就是天书&#xff0c;根本不认识&#xff0c;CPU只认识几百个二进…

Windows 免安装版mysql,快速配置教程

简单步骤 下载并解压mysql压缩包&#xff0c;把 “<mysql根目录>/bin” 路径添加到系统环境变量path中命令行执行 mysqld --initialize --console&#xff0c;初始化data目录&#xff08;数据库表文件默认存放在" <mysql安装根目录>/data "目录下&#…