尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

微信小程序开发入门实战:一天速通TodoList项目从开发到上线

微信小程序开发入门实战:一天速通TodoList项目从开发到上线 想学微信小程序开发但被各种“三天速成”、“七天精通”的教程搞得晕头转向你并不孤单。很多新手满怀热情地打开教程却发现要么是枯燥的API文档复读机要么是直接丢给你一个看不懂的复杂项目学了半天连自己的第一个页面都跑不起来。这篇文章要解决的核心问题就是帮你绕开那些华而不实的“速成”陷阱用一天时间真正从零跑通一个可发布的小程序。我们不谈“赋能”、“生态”这些大词只聚焦一件事让你亲手做出一个能运行、能分享、能上线的微信小程序。这不仅仅是学会几个组件更是理解小程序从开发到上线的完整工作流。你会发现微信小程序开发的门槛其实比你想象的要低。关键在于你是否掌握了一条清晰、无坑的路径。本文将为你拆解这条路径从开发工具安装、第一个页面创建到数据绑定、云开发接入最后完成审核发布。每个步骤都配有可运行的代码和避坑指南。学完本文你将拥有一个属于自己的、功能完整的小程序项目并彻底明白后续该如何继续深入学习。1. 为什么“一天速通”是可能的以及它的真实含义当你看到“一天速通”时可能会怀疑这是否又是标题党。这里需要做一个清晰的界定“速通”不等于“精通”。精通需要大量的项目实践和时间积累。但“速通”是完全可行的它的目标是让你在一天内搭建起完整的本地开发环境。理解小程序的核心概念和文件结构。亲手编写并运行一个包含基础交互如点击、数据更新的页面。体验从代码编写到手机真机预览的全过程。了解项目发布到微信平台的基本流程和条件。这就像学开车第一天你不需要成为赛车手但完全可以学会启动、挂挡、直线行驶和刹车把车开动起来。小程序开发的“开动起来”就是完成上述五点。本文的“一天”规划是基于6-8小时的集中学习与实践。我们将通过一个经典的“待办事项清单”TodoList项目来串联所有核心知识点因为它结构清晰涉及了数据展示、添加、删除和状态更新等核心交互。2. 核心概念扫盲小程序不是网页也不是App在写代码之前必须纠正几个常见的认知误区这能帮你少走很多弯路。误区一小程序就是套了壳的网页。虽然都使用类似HTML/CSS/JS的技术栈但小程序运行在微信封闭的沙箱环境中没有浏览器中的DOM和BOM对象如document,window。你不能直接用jQuery或操作DOM。小程序提供了自己的一套组件系统和API。误区二学会前端三件套HTML/CSS/JS就能直接开发。你需要学习的是小程序的专属语言WXML (WeiXin Markup Language) 类比HTML用于描述页面结构。但语法不同比如数据绑定用{{}}列表渲染用wx:for。WXSS (WeiXin Style Sheets) 类比CSS用于描述样式。它扩展了CSS比如引入了尺寸单位rpx能更好地适配不同屏幕。JavaScript / TypeScript 用于处理页面逻辑。小程序对JS进行了封装和增强提供了丰富的微信原生API如wx.request,wx.login。误区三开发小程序必须买服务器。微信云开发是这个问题的“游戏规则改变者”。它让开发者可以在小程序端直接操作数据库、存储文件和调用云函数而无需自建后端服务器。对于个人开发者和小型项目这极大地降低了入门和运维成本。我们后续的实战就会使用云开发。核心文件结构项目骨架一个标准的小程序项目至少包含以下文件理解它们是你“速通”的第一步my-miniprogram/ ├── pages/ // 页面目录每个页面一个子文件夹 │ ├── index/ // 首页 │ │ ├── index.js // 页面逻辑 │ │ ├── index.json // 页面配置如导航栏样式 │ │ ├── index.wxml // 页面结构 │ │ └── index.wxss // 页面样式 │ └── logs/ // 日志页示例页面 ├── utils/ // 工具类文件如通用函数 ├── app.js // 小程序全局逻辑生命周期、全局数据 ├── app.json // 小程序全局配置页面路径、窗口样式、tabBar等 ├── app.wxss // 小程序全局样式 └── project.config.json // 项目配置文件开发者工具设置记住这个结构接下来我们的一切操作都将在此框架内进行。3. 环境准备安装与配置一步到位工欲善其事必先利其器。小程序的开发工具是官方提供的集成环境IDE非常好用。步骤1下载并安装微信开发者工具访问微信公众平台官网找到“小程序”板块下载最新稳定版的“微信开发者工具”。支持 Windows 和 macOS。安装过程非常简单一路下一步即可。步骤2注册小程序账号至关重要在微信公众平台注册一个小程序账号。你需要一个未被注册过公众平台的邮箱。注册过程中会要求你选择主体类型个人开发者请选择“个人”。完成注册后登录后台在“开发”-“开发管理”-“开发设置”中获取你的AppID小程序ID。这个ID是项目的唯一标识没有它很多功能如真机预览、上传代码将无法使用。步骤3创建你的第一个项目打开安装好的微信开发者工具。点击“”号新建项目。项目目录选择一个空文件夹作为你的项目根目录。AppID填入你刚才获取的 AppID。如果只是学习也可以选择“测试号”但测试号功能有限强烈建议使用正式AppID。项目名称起一个你喜欢的名字例如“我的待办清单”。模板选择务必勾选“不使用云服务”。我们稍后会手动、清晰地引入云开发避免模板带来的混乱。点击“新建”。如果一切顺利你将看到一个包含“首页”和“日志页”的示例项目并且工具左侧是模拟器中间是代码编辑器右侧是调试器。恭喜你的开发环境已经就绪4. 项目实战从零构建一个待办清单TodoList我们将清空默认的示例代码从头构建。请跟着步骤一步步操作。4.1 初始化项目结构与全局配置首先我们整理文件。在pages目录下删除自带的logs文件夹。我们只需要一个index首页。修改根目录下的app.json文件这是小程序的“总说明书”{ pages: [ pages/index/index // 只保留首页路径。注意第一项默认为小程序启动页 ], window: { navigationBarTitleText: 我的待办清单, // 顶部导航栏标题 navigationBarBackgroundColor: #07c160, // 导航栏背景色微信绿 navigationBarTextStyle: white // 导航栏标题颜色 }, style: v2, // 使用新版样式增强兼容性 sitemapLocation: sitemap.json // 指明sitemap配置位置用于微信搜索 }保存后开发者工具会自动在pages目录下创建index文件夹及其四个基本文件如果不存在的话。4.2 编写页面结构 (WXML) 与样式 (WXSS)1. 编写页面结构 (pages/index/index.wxml)WXML 定义了页面的骨架。我们的待办清单需要一个输入框、一个添加按钮、一个待办列表。!-- pages/index/index.wxml -- view classcontainer !-- 头部标题 -- view classheader text classtitle今日待办/text text classsubtitle专注当下完成一件划掉一件/text /view !-- 添加待办区域 -- view classinput-area input classtodo-input placeholder请输入待办事项... bindinputonInputChange value{{inputValue}} confirm-typedone bindconfirmaddTodo / button classadd-btn typeprimary bindtapaddTodo添加/button /view !-- 待办列表 -- view classtodo-list view wx:for{{todoList}} wx:keyid classtodo-item {{item.done ? done : }} checkbox classtodo-checkbox checked{{item.done}} bindtaptoggleTodo>/* pages/index/index.wxss */ .container { padding: 30rpx; min-height: 100vh; background-color: #f5f5f5; } .header { text-align: center; margin-bottom: 60rpx; } .title { display: block; font-size: 48rpx; font-weight: bold; color: #333; } .subtitle { display: block; font-size: 28rpx; color: #999; margin-top: 10rpx; } .input-area { display: flex; align-items: center; margin-bottom: 40rpx; background: #fff; border-radius: 16rpx; padding: 20rpx; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05); } .todo-input { flex: 1; height: 80rpx; font-size: 32rpx; padding: 0 20rpx; } .add-btn { margin-left: 20rpx; width: 160rpx; } .todo-list { background: #fff; border-radius: 16rpx; overflow: hidden; box-shadow: 0 4rpx 12rpx rgba(0,0,0,0.05); } .todo-item { display: flex; align-items: center; padding: 30rpx; border-bottom: 1rpx solid #eee; } .todo-item:last-child { border-bottom: none; } .todo-checkbox { margin-right: 20rpx; } .todo-text { flex: 1; font-size: 34rpx; color: #333; } /* 已完成事项的样式 */ .todo-item.done .todo-text { text-decoration: line-through; color: #bbb; } .delete-btn { margin-left: 20rpx; } .empty-tip { text-align: center; padding: 60rpx 30rpx; color: #ccc; font-size: 30rpx; } .action-area { display: flex; justify-content: space-between; align-items: center; margin-top: 40rpx; padding: 0 20rpx; } .stats { font-size: 28rpx; color: #666; }代码解释rpx 是小程序自适应的尺寸单位可以根据屏幕宽度进行适配。设计稿通常以750rpx为基准。样式规则与CSS基本一致你可以像写CSS一样来写WXSS。4.3 实现页面逻辑 (JavaScript)这是小程序的“大脑”负责处理数据、响应用户交互。打开pages/index/index.js文件用以下代码完全替换// pages/index/index.js Page({ /** * 页面的初始数据 * 这里定义的所有数据都可以在WXML中通过 {{}} 绑定 */ data: { inputValue: , // 绑定输入框的内容 todoList: [ // 待办事项列表每个事项是一个对象 // { id: 1, text: 学习小程序开发, done: false } ] }, /** * 监听输入框内容变化 */ onInputChange(e) { // e.detail.value 是输入框当前的值 this.setData({ inputValue: e.detail.value }); }, /** * 添加待办事项 */ addTodo() { const text this.data.inputValue.trim(); if (!text) { // 简单提示实际项目中可使用更美观的组件 wx.showToast({ title: 内容不能为空, icon: none }); return; } const newTodo { id: new Date().getTime(), // 用时间戳生成一个简单ID text: text, done: false }; // 更新数据并清空输入框 this.setData({ todoList: [newTodo, ...this.data.todoList], // 新事项添加到数组开头 inputValue: // 清空输入框 }); // 可选保存到本地缓存防止刷新丢失 wx.setStorageSync(todoList, this.data.todoList); }, /** * 切换待办事项的完成状态 */ toggleTodo(e) { const index e.currentTarget.dataset.index; // 获取点击项的下标 const key todoList[${index}].done; // 构造要修改的数据路径 // 取反当前状态 this.setData({ [key]: !this.data.todoList[index].done }); // 更新本地缓存 wx.setStorageSync(todoList, this.data.todoList); }, /** * 删除待办事项 */ deleteTodo(e) { const index e.currentTarget.dataset.index; // 弹出确认框 wx.showModal({ title: 确认删除, content: 确定要删除这条待办吗, success: (res) { if (res.confirm) { const newList [...this.data.todoList]; newList.splice(index, 1); // 从数组中删除指定项 this.setData({ todoList: newList }); wx.setStorageSync(todoList, newList); } } }); }, /** * 清除所有已完成的事项 */ clearAllDone() { const undoneList this.data.todoList.filter(item !item.done); this.setData({ todoList: undoneList }); wx.setStorageSync(todoList, undoneList); wx.showToast({ title: 已清除, icon: success }); }, /** * 计算属性总事项数和已完成数 * 这些数据依赖于todoList适合放在这里计算 */ get totalCount() { return this.data.todoList.length; }, get doneCount() { return this.data.todoList.filter(item item.done).length; }, /** * 生命周期函数--监听页面加载 * 页面加载时从本地缓存读取数据 */ onLoad(options) { const savedList wx.getStorageSync(todoList) || []; this.setData({ todoList: savedList }); }, })代码解释Page({...}) 注册一个页面。传入的对象包含了页面的所有数据、方法和生命周期函数。data 定义页面的初始数据。这里定义的inputValue和todoList可以在WXML中绑定和修改。this.setData({...})这是小程序更新视图数据最核心的API。你不能直接修改this.data.xxx必须通过setData方法它才会触发视图的重新渲染。事件处理函数 如addTodo它们通过bindtap等绑定到WXML的组件上。wx.xxxAPI 如wx.showToast,wx.showModal,wx.setStorageSync这些都是微信小程序提供的原生API用于实现提示、对话框、本地存储等功能。onLoad 页面生命周期函数在页面加载时触发。我们在这里从本地缓存初始化数据。4.4 配置页面 (JSON)pages/index/index.json用于配置当前页面的窗口表现。这里我们保持默认即使用全局app.json中的window配置。文件内容可以是一个空对象{}如果需要单独设置本页面的导航栏标题可以在这里覆盖全局配置。5. 运行与调试在模拟器和真机上预览编写完代码后点击开发者工具左上角的“编译”按钮或按快捷键 Ctrl/Cmd B。你将在左侧模拟器中立即看到你的待办清单应用。核心调试技巧Console控制台 在右侧调试器的“Console”面板可以查看console.log打印的信息、JavaScript错误和警告。这是排查逻辑问题最常用的工具。Sources源代码 可以给你的JS代码设置断点进行单步调试。Wxml元素 类似于浏览器的“检查元素”可以查看当前页面的WXML结构以及组件对应的样式和属性。Network网络 当你后续调用网络请求如wx.request时可以在这里查看请求详情。Storage存储 可以查看、编辑和清除本地缓存数据方便调试wx.setStorage相关功能。真机预览非常重要模拟器再好也不及真机实测。点击工具栏上的“预览”按钮工具会生成一个二维码。用你注册小程序时绑定的管理员微信号扫描这个二维码即可在手机上实时运行你的小程序。这是检验布局适配和交互体验的必经步骤。6. 接入微信云开发让数据持久化并拥有后端能力目前我们的数据保存在手机本地换一台设备就没了。微信云开发提供了免费的云数据库可以让数据同步到云端。我们接下来接入它。步骤1开通云开发在开发者工具顶部点击“云开发”按钮。根据提示开通云开发环境。你会看到一个免费的基础版环境配额对于学习完全够用。开通后记下你的环境ID在云开发控制台设置中查看。步骤2初始化云开发修改根目录下的app.js文件在最前面初始化云开发// app.js App({ onLaunch() { // 初始化云开发环境 if (!wx.cloud) { console.error(请使用 2.2.3 或以上的基础库以使用云能力); } else { wx.cloud.init({ // 此处替换为你自己的环境ID env: your-env-id, traceUser: true, // 记录用户访问 }); } }, globalData: {} });步骤3创建云数据库集合打开开发者工具的“云开发”控制台。进入“数据库”标签页。点击“集合名称”右侧的“”号创建一个名为todos的集合。步骤4改造页面JS使用云数据库我们修改pages/index/index.js将本地存储替换为云数据库操作。注意这是一个简化示例实际生产环境需要考虑更严谨的错误处理和加载状态。// pages/index/index.js // 获取数据库引用 const db wx.cloud.database(); const todosCollection db.collection(todos); Page({ data: { inputValue: , todoList: [], loading: false // 新增加载状态 }, onLoad(options) { this.loadTodos(); // 页面加载时从云端读取 }, // 从云数据库加载待办事项 loadTodos() { this.setData({ loading: true }); todosCollection.orderBy(createTime, desc).get() // 按创建时间倒序排列 .then(res { console.log([云数据库] [查询记录] 成功: , res); this.setData({ todoList: res.data, loading: false }); }) .catch(err { console.error([云数据库] [查询记录] 失败, err); wx.showToast({ title: 加载失败, icon: none }); this.setData({ loading: false }); }); }, addTodo() { const text this.data.inputValue.trim(); if (!text) { wx.showToast({ title: 内容不能为空, icon: none }); return; } this.setData({ loading: true }); // 向云数据库添加一条记录 todosCollection.add({ data: { text: text, done: false, createTime: db.serverDate() // 使用服务端时间 } }) .then(res { console.log([云数据库] [新增记录] 成功记录 _id: , res._id); wx.showToast({ title: 添加成功 }); this.setData({ inputValue: }); this.loadTodos(); // 重新加载列表 }) .catch(err { console.error([云数据库] [新增记录] 失败, err); wx.showToast({ title: 添加失败, icon: none }); this.setData({ loading: false }); }); }, toggleTodo(e) { const index e.currentTarget.dataset.index; const item this.data.todoList[index]; const newDone !item.done; // 更新云数据库中对应记录的 done 字段 todosCollection.doc(item._id).update({ data: { done: newDone } }) .then(res { console.log([云数据库] [更新记录] 成功, res); const key todoList[${index}].done; this.setData({ [key]: newDone }); }) .catch(err { console.error([云数据库] [更新记录] 失败, err); wx.showToast({ title: 更新失败, icon: none }); }); }, deleteTodo(e) { const index e.currentTarget.dataset.index; const item this.data.todoList[index]; wx.showModal({ title: 确认删除, content: 确定要删除这条待办吗, success: (res) { if (res.confirm) { // 从云数据库删除记录 todosCollection.doc(item._id).remove() .then(res { console.log([云数据库] [删除记录] 成功, res); const newList [...this.data.todoList]; newList.splice(index, 1); this.setData({ todoList: newList }); wx.showToast({ title: 删除成功 }); }) .catch(err { console.error([云数据库] [删除记录] 失败, err); wx.showToast({ title: 删除失败, icon: none }); }); } } }); }, clearAllDone() { const doneItems this.data.todoList.filter(item item.done); if (doneItems.length 0) { wx.showToast({ title: 没有已完成事项, icon: none }); return; } // 注意云开发暂不支持批量删除这里循环删除仅作示例生产环境建议使用云函数 const deletePromises doneItems.map(item todosCollection.doc(item._id).remove()); Promise.all(deletePromises) .then(res { console.log([云数据库] [批量删除] 成功, res); this.loadTodos(); // 重新加载 wx.showToast({ title: 清除完成 }); }) .catch(err { console.error([云数据库] [批量删除] 失败, err); wx.showToast({ title: 清除失败, icon: none }); }); }, // ... 其他函数onInputChange, 计算属性等保持不变 });现在你的待办事项数据已经存储在云端。在任何一台手机上登录小程序看到的都是同一份数据。这就是云开发的核心魅力——无需自建后端服务。7. 常见问题与排查思路避坑指南在开发过程中你几乎一定会遇到下面这些问题。提前了解能节省大量搜索时间。问题现象可能原因排查方式解决方案编译失败提示“未找到入口文件”app.json中pages字段配置的路径错误或文件不存在。1. 检查app.json中pages数组的第一个路径是否正确。2. 检查对应的.js,.json,.wxml,.wxss文件是否齐全。确保路径拼写正确且文件确实存在于项目中。页面白屏但无报错1.app.js或页面JS中有语法错误导致执行中断。2. 页面JS中Page()注册失败。3. 基础库版本过低。1. 查看“调试器”-“Console”面板是否有JS错误。2. 检查app.js和页面JS文件顶部是否有未定义的变量或错误语法。1. 根据Console错误信息修复代码。2. 在“详情”-“本地设置”中调高“调试基础库”版本。this.setData is not a function在回调函数如setTimeout,wx.request的success内中直接使用this此时this指向已改变。检查报错行附近的函数看是否在回调中。在函数外部将this保存为thatconst that this;然后在回调中使用that.setData。或使用箭头函数。真机预览与模拟器显示不一致1. 样式单位使用px而非rpx导致适配问题。2. 真机网络环境导致云开发请求失败。3. 手机微信版本或基础库版本过低。1. 检查样式优先使用rpx。2. 真机开启调试模式设置-打开调试查看Console和Network。3. 在“详情”中查看基础库版本覆盖率。1. 使用rpx进行布局。2. 处理网络请求失败的情况给用户友好提示。3. 在app.json中配置style: v2并使用新版基础库。云开发数据库操作失败1. 未初始化云环境或环境ID错误。2. 数据库权限未设置。3. 查询语法错误。1. 检查app.js中wx.cloud.init的env参数是否正确。2. 在云开发控制台“数据库”-“权限设置”中检查集合的权限。3. 查看Console中云函数调用返回的具体错误信息。1. 核对环境ID。2. 开发阶段可将集合权限设置为“所有用户可读仅创建者可读写”。3. 根据错误信息修正查询语句。wx:for渲染列表时警告Now you can provide attr \wx:key\列表渲染未指定wx:key当列表动态变化时会影响渲染性能和正确性。检查使用wx:for的组件。为列表中的每一项指定一个唯一标识符作为wx:key的值例如wx:keyid或wx:key*this当项本身是唯一字符串或数字时。输入框bindinput事件触发过于频繁每次输入都会触发如果在此事件中执行复杂操作如实时搜索可能导致卡顿。观察输入时是否感觉页面响应变慢。使用防抖debounce或节流throttle技术优化。可以引入工具函数或在setData前进行判断。8. 项目发布上线让你的小程序被所有人看到开发完成并充分测试后就可以准备发布了。发布流程主要分为两步上传代码和提交审核。步骤1上传代码在开发者工具右上角点击“上传”按钮。填写版本号和项目备注例如v1.0.0 - 初始版本。这便于你后续管理多个版本。点击“上传”。代码将被上传到微信服务器与你的小程序AppID关联。步骤2在微信公众平台提交审核登录 微信公众平台 进入你的小程序管理后台。在“管理”-“版本管理”中找到你刚刚上传的开发版本。点击“提交审核”。你需要填写服务类目 根据小程序功能选择个人开发者可选的类目有限如工具、生活服务等。我们的待办清单通常属于“工具”-“效率”或“生活服务”。标签 用几个关键词描述你的小程序。小程序页面截图 从模拟器或真机截取。测试账号如有 如果小程序需要登录需提供测试账号。审核备注 向审核人员简要说明小程序的功能和用途。提交后通常需要1-7个工作日等待审核。审核通过后你将收到通知。步骤3发布上线审核通过后在“版本管理”中点击“发布”按钮即可将小程序发布到线上供所有微信用户搜索和使用。发布前关键检查清单[ ] 功能测试 核心功能在真机上全部测试通过。[ ] UI适配 在不同尺寸的手机上显示正常。[ ] 隐私协议 如果收集用户信息需在app.json中配置privacy字段并添加指引。[ ] 类目选择 确保选择的类目与小程序功能相符个人主体避免选择需要特殊资质的类目如社交、医疗。[ ] 内容合规 小程序内容不违反微信平台规范。9. 总结与后续学习方向至此你已经完成了一个微信小程序从环境搭建、编码开发、云服务接入到发布上线的全流程。回顾一下我们一天内攻克了哪些核心关卡建立了正确认知 小程序是独立生态不是网页。掌握了核心语法 WXML数据绑定与渲染、WXSS样式、JS逻辑与API调用。理解了核心机制Page生命周期、this.setData驱动视图更新、事件系统。实践了数据管理 从本地存储升级到云数据库理解了前后端分离的现代开发模式。走通了发布流程 体验了从代码到产品的完整路径。这个待办清单项目是一个完美的起点它涵盖了小程序至少70%的常用特性。基于这个“骨架”你可以轻松地扩展出更复杂的应用例如增加用户系统 使用云开发自带的登录能力让数据按用户隔离。实现更复杂的UI 学习使用小程序丰富的扩展组件库如 Vant Weapp 或官方扩展组件。接入更多能力 尝试地图定位(wx.getLocation)、扫码(wx.scanCode)、分享(onShareAppMessage)等API。优化性能与体验 学习使用自定义组件拆分复杂页面使用Behavior复用代码逻辑。学习状态管理 对于更复杂的应用可以引入如mobx-miniprogram这样的状态管理库。学习技术最怕的就是停留在“看”的阶段。现在你手头已经有了一个可以运行、可以修改、可以发布的项目。最好的学习方式就是以这个项目为实验田不断添加你想要的功能遇到问题就去查官方文档或搜索解决方案。微信小程序的官方文档非常详尽是你最可靠的学习资料。建议收藏本文在后续开发中遇到类似问题可以随时回来查阅“常见问题”部分。动手去做下一个爆款小程序的创造者可能就是你。
返回列表