当前位置:首页 > 技术 > 正文内容

小程序核心组件详解与实践应用

访客 技术 2026年6月11日 1

组件基础结构与常用属性

在微信小程序中,组件是构建用户界面的基本单元。每个组件都遵循类似 HTML 的标签语法:

<标签名 属性名="属性值">内容</标签名>
  • id:唯一标识符,确保页面内不重复,通常用于事件绑定或样式定位。
  • class:关联 WXSS 样式文件中的类选择器,实现外观定制。
  • style:设置内联 CSS 样式,支持动态更新。
  • hidden:控制组件是否可见,默认为 false(显示)。
  • data-\*:自定义数据属性,在触发事件时可传递给处理函数。

布局容器组件

主要包括 viewscroll-viewswiper,用于组织和展示内容区块。

view 组件

作为基础布局容器,支持 Flex 布局。示例如下:

<view style="display: flex; justify-content: center;">
  <view style="flex: 1; border: 1px solid red;">区域 1</view>
  <view style="flex: 1; border: 1px solid red;">区域 2</view>
  <view style="flex: 1; border: 1px solid red;">区域 3</view>
</view>

通过调整 flex-direction 可实现垂直或水平排列,嵌套使用可构建复杂布局。

scroll-view 滚动视图

允许内容超出屏幕时滚动查看,需显式设置高度以启用滚动监听。常见属性包括:

  • scroll-y:启用纵向滚动
  • bindscrolltolower:滚动到底部触发加载更多
  • bindscrolltoupper:滚动到顶部刷新数据

JavaScript 实现分页加载逻辑:

Page({
  data: {
    list: [],
    page: 0,
    loading: false
  },
  loadNextPage() {
    const { page } = this.data;
    wx.request({
      url: 'https://example.com/api/list',
      data: { page: page + 1 },
      success: (res) => {
        this.setData({
          list: [...this.data.list, ...res.data.items],
          page: page + 1
        });
      }
    });
  },
  onScrollToLower() {
    this.loadNextPage();
  }
});

swiper 轮播图组件

常用于图片轮播、引导页等场景。由 <swiper><swiper-item> 配合使用:

<swiper autoplay interval="3000" indicator-dots>
  <swiper-item><image src="/images/banner1.jpg" mode="widthFix"/></swiper-item>
  <swiper-item><image src="/images/banner2.jpg" mode="widthFix"/></swiper-item>
  <swiper-item><image src="/images/banner3.jpg" mode="widthFix"/></swiper-item>
</swiper>

关键属性如 autoplay 自动播放、interval 切换间隔、indicator-dots 显示指示点。

基础信息展示组件

icon 图标

内置状态图标,适用于提示成功、警告、等待等情况:

<icon type="success" size="24" color="#09bb07"/>
<icon type="warn" size="24" color="#f89a1c"/>
<icon type="loading" size="24" color="#10aeff"/>

text 文本

行内文本容器,支持长按选中和空格处理:

<text selectable>这段文字可以被选中</text>
<text space="nbsp">保留多个  空格</text>

progress 进度条

显示任务完成进度:

<progress percent="60" show-info stroke-width="6" />
<progress percent="100" activeColor="#4cd964" active />

表单交互组件

button 按钮

提供多种类型增强操作引导性:

<button type="primary">主要操作</button>
<button type="default">普通按钮</button>
<button type="warn" plain>警告按钮(镂空)</button>
<button loading="{{isLoading}}" bindtap="onSubmit">提交</button>

radio 单选框

配合 radio-group 使用,限制一组选项中仅能选择一项:

<radio-group bindchange="onRadioChange">
  <label wx:for="{{options}}" class="radio-label">
    <radio value="{{item.value}}" /> {{item.name}}
  </label>
</radio-group>

checkbox 多选框

使用 checkbox-group 包裹多个选项:

<checkbox-group bindchange="onCheckChange">
  <label wx:for="{{cities}}" class="check-label">
    <checkbox value="{{item.code}}" /> {{item.name}}
  </label>
</checkbox-group>

switch 开关

切换二元状态:

<switch checked color="#09bb07" bindchange="onToggle"/>

slider 滑块

滑动调节数值:

<slider min="0" max="100" value="{{value}}" show-value bindchange="onSlide"/>

picker 选择器

支持多种模式:

  • selector:普通列表选择
  • multiSelector:多列联动选择(如省市区)
  • time/date:时间日期选择
  • region:地理位置三级选择

示例 - 时间选择:

<picker mode="time" value="{{time}}" start="09:00" end="18:00" bindchange="onTimeChange">
  当前时间:{{time}}
</picker>

input 与 textarea

输入控件,分别用于单行和多行文本输入:

<input placeholder="请输入用户名" bindinput="onInput" maxlength="20"/>
<textarea placeholder="请输入反馈内容" auto-height bindblur="onBlur"/>

label 标签

提升表单可用性,点击 label 可聚焦对应输入项:

<label for="username">用户名:<input id="username"/></label>

form 表单

包裹表单项并统一提交:

<form bindsubmit="onFormSubmit">
  <input name="name" />
  <radio-group name="gender">...</radio-group>
  <button form-type="submit">提交</button>
</form>

多媒体组件

image 图片

支持多种缩放模式:

  • aspectFit:完整显示图片
  • aspectFill:填充容器,可能裁剪
  • widthFix:宽度固定,高度自适应
<image src="/assets/photo.jpg" mode="widthFix" lazy-load />

audio 音频

音频播放控制:

<audio src="{{audioSrc}}" name="歌曲名称" author="歌手" controls />

通过 JS 控制播放行为:

const audioCtx = wx.createAudioContext('myAudio');
audioCtx.play();
audioCtx.pause();

video 视频

支持本地或网络视频播放:

<video src="{{videoPath}}" controls poster="/images/loading.jpg"/>

camera 相机

调用设备摄像头拍照或录像:

<camera device-position="back" flash="auto" binderror="onCameraError"/>
<button bindtap="takeSnapshot">拍摄</button>
takeSnapshot() {
  const ctx = wx.createCameraContext();
  ctx.takePhoto({
    quality: 'high',
    success: (res) => {
      this.setData({ photo: res.tempImagePath });
    }
  });
}

地图与绘图组件

map 地图

显示地理位置信息:

<map 
  latitude="{{lat}}" 
  longitude="{{lng}}" 
  scale="14" 
  markers="{{markers}}" 
  polyline="{{routes}}"
  style="width: 100%; height: 300px;"
/>

可在地图上添加标记点和路线路径。

canvas 画布

用于绘制图形图表:

<canvas canvas-id="chartCanvas" style="width: 300px; height: 200px;"/>
onReady() {
  const ctx = wx.createCanvasContext('chartCanvas');
  ctx.setFillStyle('#369');
  ctx.fillRect(20, 20, 150, 100);
  ctx.draw();
}

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。