news 2026/9/30 17:12:20

微信小程序实战:checkbox 与 radio 组件的动态样式控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
微信小程序实战:checkbox 与 radio 组件的动态样式控制

在微信小程序开发中,表单组件是非常基础且高频使用的部分。本文将通过一个完整的实战案例,带大家掌握checkbox(复选框)和radio(单选框)组件的用法,并实现通过它们动态控制文本样式的效果。

一、案例效果预览

我们要实现的功能是:页面上方展示一段文字(《满江红·写怀》),下方提供两组控制组件:

  • 三个 checkbox:分别控制文字是否加粗、是否倾斜、是否加下划线

  • 四个 radio:分别控制文字字号为30rpx、40rpx、50rpx、60rpx

当用户勾选或切换选项时,文字样式会实时变化。

二、核心知识点

在动手之前,先了解几个关键点:

  1. checkbox-group与radio-group

    • 单独的checkbox或radio不会触发change事件,必须包裹在对应的group组件中才能生效。

    • checkbox-group的change事件返回的是一个数组(所有被选中项的值)。

    • radio-group的change事件返回的是一个单值(当前选中项的值)。

  2. 动态样式绑定
    小程序中可以通过style="{{变量}}"的方式动态绑定样式,配合setData实现实时更新。

三、项目结构

text

复制

下载

├── app.json ├── app.wxss └── pages └── index ├── index.wxml ├── index.wxss └── index.js

四、代码实现

1. app.json 配置

如果你使用的是较新的开发者工具,默认可能开启了skyline渲染引擎。由于skyline对部分 CSS 属性(如text-indent)支持不完善,建议在app.json中移除renderer: "skyline"配置,使用默认的webview引擎:

json

复制

下载

{ "pages": [ "pages/index/index" ], "window": { "navigationBarTextStyle": "black", "navigationStyle": "custom" }, "style": "v2", "sitemapLocation": "sitemap.json" }

2. app.wxss 全局样式

css

复制

下载

/**app.wxss**/ .box { margin: 20rpx; padding: 20rpx; border: 2rpx solid silver; } .title { font-size: 40rpx; font-weight: bolder; text-align: center; margin-bottom: 30rpx; color: red; }

3. index.wxml 页面结构

关键点在于style属性使用了数据绑定,让文字样式随变量变化:

html

复制

下载

运行

<!--index.wxml--> <navigation-bar title="checkbox 和 radio 组件" back="false" color="black" background="#fff"></navigation-bar> <scroll-view class="scrollarea" scroll-y type="list"> <view class="box"> <view class="title">满江红·写怀</view> <!-- 动态绑定样式:加粗、倾斜、下划线、字号 --> <view class="txt" style="font-weight: {{myBold}}; font-style: {{myItalic}}; text-decoration: {{myUnderline}}; font-size: {{myFontSize}};"> <view> 怒发冲冠,凭栏处、潇潇雨歇。抬望眼、仰天长啸,壮怀激烈。三十功名尘与土、八千里路云和月。莫等闲、白了少年头,空悲切。 </view> <view> 靖康耻,犹未雪。臣子恨,何时灭。驾长车,踏破贺兰山缺。壮志饥餐胡虏肉,笑谈渴饮匈奴血。待从头、收拾旧山河,朝天阙。 </view> </view> <view class="other"> <!-- checkbox 组:控制字体样式 --> <checkbox-group bindchange="checkboxChange"> <checkbox value="isBold">加粗</checkbox> <checkbox value="isItalic">倾斜</checkbox> <checkbox value="isUnderline">下划线</checkbox> </checkbox-group> <!-- radio 组:控制字体大小 --> <radio-group bindchange="radioChange"> <radio value="30rpx" checked="true">30rpx</radio> <radio value="40rpx">40rpx</radio> <radio value="50rpx">50rpx</radio> <radio value="60rpx">60rpx</radio> </radio-group> </view> </view> </scroll-view>

4. index.wxss 页面样式

css

复制

下载

/**index.wxss**/ page { height: 100vh; display: flex; flex-direction: column; } .scrollarea { flex: 1; overflow-y: hidden; } radio, checkbox { margin: 20px; } .txt { text-align: justify; text-indent: 2em; margin: 60px 0; } .other { text-align: center; margin: 60px 0; }

5. index.js 逻辑处理

这是整个案例的核心,需要处理两个change事件:

javascript

复制

下载

// index.js Page({ data: { myFontSize: '30rpx', // 默认字号 myBold: '', myItalic: '', myUnderline: '' }, /** * checkbox-group 事件处理 * e.detail.value 是一个数组,包含所有被选中项的 value */ checkboxChange(e) { console.log(e); let selected = []; let myBold = ''; let myItalic = ''; let myUnderline = ''; // 获取所有选中项 selected = e.detail.value; // 遍历选中项,设置对应样式 for (let index = 0; index < selected.length; index++) { const element = selected[index]; if (element === 'isBold') { myBold = 'bold'; } if (element === 'isItalic') { myItalic = 'italic'; } if (element === 'isUnderline') { myUnderline = 'underline'; } } // 更新数据,视图自动刷新 this.setData({ myBold: myBold, myItalic: myItalic, myUnderline: myUnderline }); }, /** * radio-group 事件处理 * e.detail.value 是当前选中项的值 */ radioChange(e) { console.log(e); this.setData({ myFontSize: e.detail.value }); } });

五、常见问题与避坑指南

  1. 为什么点击 checkbox 没反应?
    检查是否把checkbox放在了checkbox-group里面,并且绑定了bindchange事件。单独使用checkbox是无法触发change事件的。

  2. 文字缩进text-indent不生效?
    如果app.json中配置了"renderer": "skyline",部分 CSS 属性会不兼容。建议删掉该配置,改用默认的webview渲染。

  3. 如何设置默认选中项?

    • checkbox:在组件上添加checked="true"。

    • radio:在需要默认选中的那个radio上添加checked="true",同时data中的初始值要与它的value一致。

  4. console.log(e)能看到什么?

    • checkbox-group:e.detail.value是数组,如["isBold", "isItalic"]。

    • radio-group:e.detail.value是字符串,如"40rpx"。

六、总结

通过这个案例,我们掌握了:

  • checkbox-group和radio-group的基本用法及事件处理

  • 通过e.detail.value获取用户选择结果

  • 利用setData配合动态style绑定实现样式的实时更新

这类“表单控制视图”的模式在小程序中非常常见,比如设置页面的主题切换、字体调节、权限开关等场景都可以套用这个思路。掌握它,你就迈出了小程序交互开发的重要一步。、

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/30 17:10:01

高原天文台的最后一夜:闭站前把整夜星空交还城市

五联封面&#xff1a;楼梯上行、镜面支架、控制台指示灯、穹顶裂隙、晨光落在脸上&#xff0c;取自本片三条镜头的关键画面。 摘要&#xff5c; 海拔四千米的观测穹顶在清晨闭站。女主用最后一夜完成镜面校准&#xff0c;把整夜的数据交还给城市。三条真实运动镜头、一首原创配…

作者头像 李华
网站建设 2026/9/30 16:52:58

HarmonyOS 7 + Form Kit + UIAbility 实战:运营看板卡片的刷新策略、状态同步与点击回流【鸿蒙心迹】

这一篇我想聊的是看起来很轻、做起来却很容易失衡的一类功能&#xff1a;桌面卡片。很多人第一次做运营看板卡片&#xff0c;最先关注的是“怎么把一块卡片显示出来”。但真正把它做成一个能用、可信、可跳转、可同步的业务入口以后&#xff0c;你会发现难点根本不在“显示”&a…

作者头像 李华
网站建设 2026/9/30 16:48:12

FPGA跨时钟域全解析:亚稳态、同步器与异步FIFO设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/30 16:47:48

第318篇_垃圾分类查询数据

【Python爬虫实战】第318篇:垃圾分类查询数据爬虫:物品分类映射与检索工具——实战项目 所属专栏:【Python爬虫实战】从零到企业级爬虫工程师(CSDN 付费专栏) 本篇篇目:第 318 篇(垂直行业爬虫 公共数据专题) 难度等级:入门级,零基础可跟 阅读时长:约 25 分钟(跟着…

作者头像 李华
网站建设 2026/9/30 16:46:43

分布式存储实战:核高基场景下的分片、容灾与混合架构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华