微信小程序的框架

news2024/12/23 10:16:04

目录

一、视图层

1. WXML

数据绑定

列表渲染

条件渲染

模板

2. WXSS

尺寸单位

样式导入

内联样式

选择器

3. WXS事件

二、逻辑层

1. 页面生命周期

2.跳转 

1. 一级跳一级

2. 一级跳二级

3. 二级跳二级

4. 二级跳一级

总结

带给我们的收获


一、视图层

1. WXML

WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件、事件系统,可以构建出页面的结构。

要完整了解 WXML 语法,请参考WXML 语法参考。

根据我博客中进行创建一个微信小程序项目: 开发微信小程序的下载安装及入门icon-default.png?t=N7T8https://blog.csdn.net/SAME_LOVE/article/details/133826628?spm=1001.2014.3001.5501

之后在项目中增加四个页面,分别命名为 : home,classify,orders,me 。

( 可以根据自己的需求进行更改命名 )

在项目的主体中找到 app.json 这个文件进行增加以上四个文件。

在该文件中找到 pages ,在里面进行直接页面。

  "pages":[
    "pages/home/home",
    "pages/classify/classify",
    "pages/orders/orders",
    "pages/me/me",
    "pages/user/user",
    "pages/index/index",
    "pages/logs/logs"
  ],
  • 数据绑定

在我们创建的页面中 ( home ) ,在 home.wxml中 编写代码 : 

<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<!--wxml-->
<view> {{message}} </view>

在我们创建的页面中 ( home ) ,在 home.js的data中 编写代码 : 

  /**
   * 页面的初始数据
   */
  data: {
    message: 'Hello MINA !  欢迎进入 。。 '
  },

在模拟器中可以看到的效果 : 

  • 列表渲染

在我们创建的页面中 ( home ) ,在 home.wxml中 编写代码 : 

<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<!--wxml-->
<view> {{message}} </view>
<!--wxml-->
<view wx:for="{{array}}" style="margin-left: 10px;"> {{item}} </view>

在我们创建的页面中 ( home ) ,在 home.js的data中 编写代码 : 

  data: {
    message: 'Hello MINA !  欢迎进入 。。 ',
    array: [1, 2, 3, 4, 5]
  },

在模拟器中可以看到的效果 : 

  • 条件渲染

在我们创建的页面中 ( home ) ,在 home.wxml中 编写代码 : 

<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<!--wxml-->
<view> {{message}} </view>
<!--wxml-->
<view wx:for="{{array}}" style="margin-left: 10px;"> {{item}} </view>
<!--wxml-->
<view wx:if="{{view == '1'}}"> 坤坤 </view>
<view wx:elif="{{view == '2'}}"> ikun </view>
<view wx:else="{{view == '3'}}"> 篮球 </view>

在我们创建的页面中 ( home ) ,在 home.js的data中 编写代码 : 

  /**
   * 页面的初始数据
   */
  data: {
    message: 'Hello MINA !  欢迎进入 。。 ',
    array: [1, 2, 3, 4, 5],
    view: '2'
  },

在模拟器中可以看到的效果 : 

  • 模板

在我们创建的页面中 ( home ) ,在 home.wxml中 编写代码 : 

<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<!--wxml-->
<view> {{message}} </view>
<!--wxml-->
<view wx:for="{{array}}" style="margin-left: 10px;"> {{item}} </view>
<!--wxml-->
<view wx:if="{{view == '1'}}"> 坤坤 </view>
<view wx:elif="{{view == '2'}}"> ikun </view>
<view wx:else="{{view == '3'}}"> 篮球 </view>
<!--wxml-->
<template name="staffName">
  <view>
    BookName: {{BookName}}, Author: {{Author}}
  </view>
</template>

<template is="staffName" data="{{...BookA}}"></template>
<template is="staffName" data="{{...BookB}}"></template>
<template is="staffName" data="{{...BookC}}"></template>

在我们创建的页面中 ( home ) ,在 home.js的data中 编写代码 : 

  /**
   * 页面的初始数据
   */
  data: {
    message: 'Hello MINA !  欢迎进入 。。 ',
    array: [1, 2, 3, 4, 5],
    view: '2',
    BookA: {BookName: '掌中球', Author: '秘名'},
    BookB: {BookName: '起飞的小猪', Author: '夏凉'},
    BookC: {BookName: '手中棍', Author: '勇者'}
  },

在模拟器中可以看到的效果 : 

2. WXSS

WXSS (WeiXin Style Sheets)是一套样式语言,用于描述 WXML 的组件样式。

WXSS 用来决定 WXML 的组件应该怎么显示。

为了适应广大的前端开发者,WXSS 具有 CSS 大部分特性。同时为了更适合开发微信小程序,WXSS 对 CSS 进行了扩充以及修改。

与 CSS 相比,WXSS 扩展的特性有:

  • 尺寸单位
  • 样式导入
  • 尺寸单位

rpx(responsive pixel): 可以根据屏幕宽度进行自适应。规定屏幕宽为750rpx。如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375px = 750物理像素,1rpx = 0.5px = 1物理像素。

设备rpx换算px (屏幕宽度/750)px换算rpx (750/屏幕宽度)
iPhone51rpx = 0.42px1px = 2.34rpx
iPhone61rpx = 0.5px1px = 2rpx
iPhone6 Plus1rpx = 0.552px1px = 1.81rpx

建议: 开发微信小程序时设计师可以用 iPhone6 作为视觉稿的标准。

注意: 在较小的屏幕上不可避免的会有一些毛刺,请在开发时尽量避免这种情况。

  • 样式导入

使用@import语句可以导入外联样式表,@import后跟需要导入的外联样式表的相对路径,

;表示语句结束。

方法一 :  

/** common.wxss **/
.small-p {
  padding:5px;
}

方法二 :   

/** app.wxss **/
@import "common.wxss";
.middle-p {
  padding:15px;
}
  • 内联样式

框架组件上支持使用 style、class 属性来控制组件的样式。

  • style:静态的样式统一写到 class 中。style 接收动态的样式,在运行时会进行解析,请尽量避免将静态的样式写进 style 中,以免影响渲染速度。
<view style="color:yellow;" />
  • class:用于指定样式规则,其属性值是样式规则中类选择器名(样式类名)的集合,样式类名不需要带上.,样式类名之间用空格分隔。
<view class="vi" />

 

  • 选择器

选择器样例样例描述
.class.intro选择所有拥有 class="intro" 的组件
#id#firstname选择拥有 id="firstname" 的组件
elementview选择所有 view 组件
element, elementview, checkbox选择所有文档的 view 组件和所有的 checkbox 组件
::afterview::after在 view 组件后边插入内容
::beforeview::before在 view 组件前边插入内容

全局样式与局部样式 : 

定义在 app.wxss 中的样式为全局样式,作用于每一个页面。在 page 的 wxss 文件中定义的样式为局部样式,只作用在对应的页面,并会覆盖 app.wxss 中相同的选择器。

3. WXS事件

在组件中绑定一个事件处理函数。

bindtap,当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

在我们创建的页面中 ( home ) ,在 home.wxml中 编写代码 : 

<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<!--wxml-->
<view> {{message}} </view>
<!--wxml-->
<view wx:for="{{array}}" style="margin-left: 10px;"> {{item}} </view>
<!--wxml-->
<view wx:if="{{view == '1'}}"> 坤坤 </view>
<view wx:elif="{{view == '2'}}"> ikun </view>
<view wx:else="{{view == '3'}}"> 篮球 </view>
<!--wxml-->
<template name="staffName">
  <view>
    BookName: {{BookName}}, Author: {{Author}}
  </view>
</template>

<template is="staffName" data="{{...BookA}}"></template>
<template is="staffName" data="{{...BookB}}"></template>
<template is="staffName" data="{{...BookC}}"></template>

<button id="tapTest" data-hi="Weixin" data-name="小君" bindtap="tapName"> Click me! </button>

在我们创建的页面中 ( home ) ,在 home.js中编写代码 : 

 /**
   * 页面的初始数据
   */
  data: {
    message: 'Hello MINA !  欢迎进入 。。 ',
    array: [1, 2, 3, 4, 5],
    view: '2',
    BookA: {BookName: '掌中球', Author: '秘名'},
    BookB: {BookName: '起飞的小猪', Author: '夏凉'},
    BookC: {BookName: '手中棍', Author: '勇者'}
  },
  /**
   * 方法事件
   */
  tapName: function(event) {
    console.log(event);
    console.log(event.target.dataset);
  },

 所看到的效果如图  : 

二、逻辑层

1. 页面生命周期

思维图 :

微信小程序中逻辑层的页面生命周期包括以下几个阶段:

1. onLoad:页面加载时触发,只会触发一次,可以在此处进行页面初始化操作。

2. onShow:页面显示时触发,每次页面显示都会触发,可以在此处进行数据刷新操作。

3. onReady:页面初次渲染完成时触发,只会触发一次,可以在此处进行一些界面操作,如设置导航栏标题等。

4. onHide:页面隐藏时触发,当用户切换到其他页面时触发。

5. onUnload:页面卸载时触发,当用户关闭当前页面或者返回上一页时触发,可以在此处进行一些资源释放操作。

6. onPullDownRefresh:下拉刷新时触发,用户下拉页面时触发,可以在此处进行数据刷新操作。

7. onReachBottom:上拉触底时触发,用户滑动页面到底部时触发,可以在此处进行数据加载操作。

8. onShareAppMessage:分享页面时触发,用户点击分享按钮时触发,可以在此处设置分享内容。

在逻辑层中,可以通过重写这些生命周期函数来实现页面的各种操作和逻辑。

2.跳转 

代码:

在项目主体 app.json 中 增加以下代码:

 "tabBar": {
    "list": [{
      "pagePath": "pages/index/index",
      "text": "欢迎页"
    }, {
      "pagePath": "pages/logs/logs",
      "text": "日志"
    },{
      "pagePath": "pages/home/home",
      "text": "首页"
    },{
      "pagePath": "pages/me/me",
      "text": "我的"
    }]
  },

在我们创建的页面中 ( home ) ,在 home.wxml中 编写代码 : 

<!--pages/home/home.wxml-->
<text>pages/home/home.wxml</text>
<!--wxml-->
<view> {{message}} </view>
<!--wxml-->
<view wx:for="{{array}}" style="margin-left: 10px;"> {{item}} </view>
<!--wxml-->
<view wx:if="{{view == '1'}}"> 坤坤 </view>
<view wx:elif="{{view == '2'}}"> ikun </view>
<view wx:else="{{view == '3'}}"> 篮球 </view>
<!--wxml-->
<template name="staffName">
  <view>
    BookName: {{BookName}}, Author: {{Author}}
  </view>
</template>

<template is="staffName" data="{{...BookA}}"></template>
<template is="staffName" data="{{...BookB}}"></template>
<template is="staffName" data="{{...BookC}}"></template>

<button id="tapTest" data-hi="Weixin" data-name="小君" bindtap="tapName"> Click me! </button>
<button style="margin-top: 20px;"  bindtap="bindViewTap">
home 跳转到classify页面&&一级跳二级</button>

在我们创建的页面中 ( home ) ,在 home.js中编写代码 : 

// pages/home/home.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    message: 'Hello MINA !  欢迎进入 。。 ',
    array: [1, 2, 3, 4, 5],
    view: '2',
    BookA: {BookName: '掌中球', Author: '秘名'},
    BookB: {BookName: '起飞的小猪', Author: '夏凉'},
    BookC: {BookName: '手中棍', Author: '勇者'}
  },
  /**
   * 方法事件
   */
  tapName: function(event) {
    console.log(event);
    console.log(event.target.dataset);
  },
      // 事件处理函数
      bindViewTap() {
        wx.navigateTo({
          url: '/pages/classify/classify',
        })
      },

   /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    console.log("home.onLoad");
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    console.log("home.onReady");
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    console.log("home.onShow");
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    console.log("home.onHide");
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  console.log("home.onUnload");
  },
 
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

在我们创建的页面中 ( classify) ,在 classify.wxml中 编写代码 : 

<!--pages/classify/classify.wxml-->
<text>pages/classify/classify.wxml</text>
<button  bindtap="bindViewTap">
classify跳转到orders二级跳二级</button>

在我们创建的页面中 ( classify) ,在 classify.js中编写代码 : 

// pages/classify/classify.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },
      // 事件处理函数
      bindViewTap() {
        wx.navigateTo({
          url: '/pages/orders/orders',
        })
      },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    console.log("classify.onLoad");
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    console.log("classify.onReady");
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    console.log("classify.onShow");
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    console.log("classify.onHide");
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  console.log("classify.onUnload");
  },
  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },
  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

在我们创建的页面中 ( orders) ,在 orders.wxml中 编写代码 : 

<!--pages/orders/orders.wxml-->
<text>pages/orders/orders.wxml</text>
<button style="margin-top: 20px;"  bindtap="bindViewTap">
orders跳转到home页面&&二级跳一级</button>

在我们创建的页面中 ( orders) ,在 orders.js中编写代码 :  

// pages/orders/orders.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },
        // 事件处理函数
        bindViewTap() {
          wx.switchTab({
            url: '/pages/home/home',
          })
        },

   /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    console.log("orders.onLoad");
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    console.log("orders.onReady");
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    console.log("orders.onShow");
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    console.log("orders.onHide");
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  console.log("orders.onUnload");
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

  在我们创建的页面中 ( me) ,在 me.js中编写代码 :  

// pages/me/me.js
Page({

  /**
   * 页面的初始数据
   */
  data: {

  },

   /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    console.log("me.onLoad");
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    console.log("me.onReady");
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    console.log("me.onShow");
  },
  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {
    console.log("me.onHide");
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  console.log("me.onUnload");
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

1. 一级跳一级

效果如图 : 

2. 一级跳二级

效果如图 : 

3. 二级跳二级

效果如图 : 

4. 二级跳一级

效果如图 : 

总结

  • 一级页面不会销毁
  • 一级层级跳到子级层级,或者子级层级跳到子级层级,如: 一级跳二级,二级跳二级,二级跳三级,三级跳四级,以上路由跳法,上一级隐藏,下一级显示(初次显示会调用onLoad,onReady,onShow方法) ; 如果是从下级返回到上级,下级将会被销毁。上级显示(初次显示会调用onLoad,onReady,onShow方法) ;
  • 隔代返回的话,会将中间所有的子级进行销毁。如 : 四级返回到一级或者跳转到一级,中间的四级,三级,二级都将被销毁,而一级会显示(初次显示会调用onLoad,onReady,onShow方法) ;

带给我们的收获

学习微信小程序中的视图层和逻辑层级页面的生命周期可以带来以下收获:

1. 理解小程序的整体架构:学习视图层和逻辑层的生命周期可以帮助我们更好地理解小程序的整体架构,从而更好地设计和开发小程序。

2. 控制页面的生命周期:通过学习生命周期,我们可以了解到页面在不同阶段会触发哪些事件,从而可以在不同的生命周期中执行相应的操作,例如在页面加载时请求数据,在页面卸载时清理资源等。

3. 实现页面交互和动画效果:通过生命周期函数,我们可以在页面的不同阶段执行相应的操作,例如在页面显示时执行动画效果,给用户更好的交互体验。

4. 优化小程序性能:了解生命周期可以帮助我们更好地管理页面的资源和数据,从而优化小程序的性能,例如及时释放不需要的资源,避免内存泄漏等。

5. 调试和排查问题:当遇到问题时,了解生命周期可以帮助我们更好地定位问题所在,例如通过打印生命周期函数的日志来查看页面的加载和卸载情况,从而排查问题。

总之,学习微信小程序中的视图层和逻辑层级页面的生命周期可以帮助我们更好地理解和掌握小程序的开发,提高开发效率和用户体验。

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

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

相关文章

竞赛 深度学习YOLOv5车辆颜色识别检测 - python opencv

文章目录 1 前言2 实现效果3 CNN卷积神经网络4 Yolov56 数据集处理及模型训练5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLOv5车辆颜色识别检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0…

微信小程序使用阿里巴巴iconfont,报错Failed to load font http://at.alicdn.com/t/..........

介绍 上篇文章&#xff0c;介绍了&#xff0c;在微信小程序里导入并使用阿里巴巴iconfont图标&#xff1b;但是在页面里使用后&#xff0c;可以看到后台日志有打印错误信息&#xff0c;具体报错如下&#xff1a; 分析 报这个错&#xff0c;是因为项目里使用了 iconfont字体…

OpenCV15-图像边缘检测:Sobel、Scharr、Laplace、Canny

OpenCV15-图像边缘检测&#xff1a;Sobel、Scharr、Laplace、Canny 1.边缘检测原理2.Sobel算子3.Scharr算子4.生成边缘检测滤波器5.Laplacian算子6.Canny算法 1.边缘检测原理 图像的边缘指的是图像中像素灰度值突然发生变化的区域&#xff0c;如果将图像中的每一行像素和每一列…

功能集成,不占空间,同为科技TOWE嵌入式桌面PDU超级插座

随着现代社会人们生活水平的不断提高&#xff0c;消费者对生活质量有着越来越高的期望。生活中&#xff0c;各式各样的电气设备为我们的生活带来了便利&#xff0c;在安装使用这些用电器时&#xff0c;需要考虑电源插排插座的选择。传统的插排插座设计多暴露于空间之中&#xf…

直播美颜技术的技术背后:美颜SDK的原理与实践

对于美颜美颜SDK来说大家都不会陌生&#xff0c;通过它&#xff0c;我们能够实现实时美颜效果&#xff0c;改善视频质量&#xff0c;吸引更多观众。 一、美颜SDK是什么&#xff1f; 美颜SDK为开发者提供了一整套美颜和图像处理功能&#xff0c;用于实时处理直播视频流。这个工…

Android USB分析

先下一个定论&#xff0c;常规来讲&#xff0c;所有作slave的android设备都是配件&#xff0c;作为主机的android设备还是叫Host。此外还有usb tethering支持的radnis功能以及ncm功能&#xff0c;这两个是网络相关的usb应用&#xff0c;使用usb模拟网卡。其中radnis属于上网能力…

如何减轻软件测试的时间压力?6大注意事项

软件测试处于软件研发流程的下游。如果上游的项目进度延迟&#xff0c;往往会遇到通过压缩测试时间来按时交付的情况。 因此软件测试人员经常遇到时间压力&#xff0c;可能会为了赶时间草率测试&#xff0c;导致测试人员无法充分地测试所有功能和场景&#xff0c;影响测试的覆盖…

如何制作有专业水准的的电子杂志:专家教你秘籍

​随着数字化时代的到来&#xff0c;电子杂志作为一种新型的传媒形式&#xff0c;越来越受到人们的关注和喜爱。但是&#xff0c;如何制作一份具有专业水准的电子杂志呢&#xff1f; 今天&#xff0c;给大家分享一款在线就能制作的电子杂志------FLBOOK&#xff0c;让你轻松打造…

【mac】常用命令01

1、如何像windows一样看磁盘&#xff1f; 不断的在上层文件夹显示&#xff0c;找到最上层&#xff0c;拖拽到左侧&#xff0c;方便之后找 2、Macintosh HD显示隐藏文件夹方法 终端窗口&#xff1a; defaults write com.apple.finder AppleShowAllFiles true killall Finder 或者…

Java发起Soap请求

目录 1.前言2.请求报文格式2.1不带表头的请求格式2.2带表头的请求格式 3 请求代码实例3.1解析Soap返回的XML&#xff0c;提取需要的元素 参考 文章所属专区 超链接 1.前言 SOAP请求&#xff08;Simple Object Access Protocol&#xff0c;简单对象访问协议&#xff09;是HTTP…

CEC2013(MATLAB):猎豹优化算法(The Cheetah Optimizer,CO)求解CEC2013

一、猎豹优化算法CO 猎豹优化算法&#xff08;The Cheetah Optimizer&#xff0c;CO&#xff09;由MohammadAminAkbari等人于2022年提出&#xff0c;该算法性能高效&#xff0c;思路新颖。 参考文献&#xff1a; Akbari, M.A., Zare, M., Azizipanah-abarghooee, R. et al. Th…

word误删除的文件怎么恢复?恢复办法分享

在日常工作和学习中&#xff0c;我们常常会使用到Word来撰写文章、毕业论文、方案等。然而&#xff0c;我们可能会遇到Word误删文件的情况&#xff0c;令我们陷入恐慌&#xff0c;特别是这个文件很重要时。幸运的是&#xff0c;有办法找回。下面一起来看下word误删除的文件怎么…

RFID固定资产管理的应用

在如今的商界竞争中&#xff0c;要确保企业的固定资产管理得当至关重要。庆幸的是&#xff0c;现代科技为这一挑战带来了一项高效的解决方案&#xff0c;那就是RFID技术。 **RFID技术就是借助无线射频通信&#xff0c;通过RFID标签和读写器之间的互动&#xff0c;来识别和跟踪资…

【力扣520】检测大写字母

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述二、题目分析 一、题目描述 题目链接&#xff1a;检测大写字母 我们定义&#xff0c;在以下情况时&#xff…

ARM Cortex-A9:裸机开发,点亮LED3

1.看原理图 外设板原理图 核心板原理图 2.在芯片手册中找到控制硬件的有效的特殊功能寄存器 选择0x1输出 GPX1DAT[0]->GPX1_0 0->1/0 3.编程 start.s Makefile复制到桌面 使用超级终端&#xff0c;连接串口 随便写一个 选择串口 配置串口 板子上电马上按enter…

MATLAB | 对随机信号进行统计分析,绘制频次直方图、频率分布图,与理论概率密度进行比较

一、问题描述 对于一个随机信号&#xff0c;我们可以通过统计手段&#xff0c;得到其的频次分布图&#xff08;直方图&#xff09;&#xff0c;并由此计算出它的频率分布图。当观察次数区域无穷大时&#xff0c;频率分布图近似于概率密度函数。 下面我们以稳定分布的随机变量为…

MySQL多表查询面试题一

其中分析题意&#xff0c;学生表student是与成绩表score关联&#xff0c;课程表course与教师表teacher关联&#xff0c;由此可以先确定关联关系&#xff0c;学生表为s&#xff0c;课程表为c&#xff0c;教师表为t&#xff0c;成绩表为o。s.s_ido.s_id&#xff0c;c.t_idt.t_id …

SpringBoot核心功能与基础配置

SpringBoot简介 原先的Spring程序缺点&#xff0c;包括依赖设置繁琐&#xff0c;每项jar的引用都需要自己撰写。并且配置繁琐&#xff0c;配置文件中也需要自己写加载bean等。由此针对原始的Spring程序&#xff0c;Pivotal团队提供的全新框架——SpringBoot&#xff0c;其设计…

PyQt 定义控件SwitchButton 指南

PyQt 定义控件SwitchButton 指南 PyQt 定义控件SwitchButton 指南实例程序效果如下所示&#xff1a; PyQt 定义控件SwitchButton 指南 SwitchButton 是一个自定义开关按钮控件&#xff0c;通常用于在用户界面中启用或禁用某些功能或选项。它是一种用户友好的控件&#xff0c;允…

云汉芯城一站式电子制造平台启想智联顺利通过IATF16949:2016质量管理体系认证

近日&#xff0c;云汉芯城旗下一站式电子制造服务平台上海启想智能科技有限公司&#xff08;以下简称“启想智联”&#xff09;顺利通过IATF16949:2016质量管理体系认证&#xff0c;并获得由URS颁发的认证证书。通过此项认证&#xff0c;标志着启想智联在全球汽车行业的技术规范…