当前位置: 首页 > news >正文

微信小程序入门学习教程,从入门到精通,电影之家小程序项目知识点详解 (17)

电影之家小程序项目知识点详解


一、项目创建与基础结构

知识点1:创建微信小程序项目

语法说明

  • 使用微信开发者工具创建项目
  • app.json 是全局配置文件
  • project.config.json 是项目配置文件

案例代码:app.json

{"pages": ["pages/index/index",        // 首页"pages/movieList/movieList", // 电影列表页"pages/movieDetail/movieDetail", // 电影详情页"pages/reviewList/reviewList", // 影评列表页"pages/reviewDetail/reviewDetail" // 影评详情页],"window": {"backgroundTextStyle": "light","navigationBarBackgroundColor": "#000","navigationBarTitleText": "电影之家","navigationBarTextStyle": "white"},"style": "v2","sitemapLocation": "sitemap.json"
}

说明

  • pages 数组定义所有页面路径,第一项为首页
  • window 配置全局窗口表现
  • style: "v2" 表示启用新版组件样式

二、安装与使用组件库(以 Vant WeUI 为例)

知识点2:引入第三方 UI 组件库

步骤

  1. 下载 Vant WeUI 小程序版
  2. dist 文件夹复制到项目 miniprogram_npm/@vant/weapp/
  3. 在页面 JSON 中引入组件

案例代码:movieList.json

{"usingComponents": {"van-search": "@vant/weapp/search/index","van-loading": "@vant/weapp/loading/index","van-card": "@vant/weapp/card/index"}
}

对应 WXML 使用示例(movieList.wxml)

<van-searchvalue="{{ keyword }}"placeholder="请输入电影名称"bind:change="onSearchChange"bind:search="onSearch"
/><view wx:if="{{ loading }}" class="loading"><van-loading size="24px">加载中...</van-loading>
</view><van-cardwx:for="{{ movieList }}"wx:key="id"title="{{ item.title }}"desc="{{ item.year }} · {{ item.director }}"thumb="{{ item.poster }}"bind:click="goToDetail"data-id="{{ item.id }}"
/>

说明

  • usingComponents 声明自定义组件
  • wx:for 循环渲染列表
  • data-id 用于传递参数到事件处理函数

三、页面开发核心知识点

知识点3:页面生命周期与数据绑定

语法说明

  • Page() 构造器定义页面逻辑
  • data 存储页面数据
  • onLoad 页面加载时触发

案例代码:index.js(首页)

Page({data: {bannerList: [],       // 轮播图数据recommendMovies: [],  // 推荐电影loading: true         // 加载状态},// 页面加载时调用onLoad() {this.fetchBanner();this.fetchRecommendMovies();},// 获取轮播图async fetchBanner() {try {const res = await wx.request({url: 'https://api.example.com/banner',method: 'GET'});this.setData({bannerList: res.data});} catch (err) {console.error('获取轮播图失败', err);}},// 获取推荐电影async fetchRecommendMovies() {try {const res = await wx.request({url: 'https://api.example.com/recommend',method: 'GET'});this.setData({recommendMovies: res.data,loading: false});} catch (err) {this.setData({ loading: false });wx.showToast({ title: '加载失败', icon: 'none' });}},// 跳转到电影详情goToDetail(e) {const movieId = e.currentTarget.dataset.id;wx.navigateTo({url: `/pages/movieDetail/movieDetail?id=${movieId}`});}
});

说明

  • setData() 是唯一更新视图的方式
  • 使用 async/await 处理异步请求
  • wx.navigateTo 实现页面跳转并传参

知识点4:WXML 条件渲染与列表渲染

案例代码:index.wxml

<!-- 轮播图 -->
<swiperindicator-dots="true"autoplay="true"interval="3000"duration="500"class="banner-swiper"
><block wx:for="{{ bannerList }}" wx:key="id"><swiper-item><image src="{{ item.imageUrl }}" mode="aspectFill" class="banner-img" /></swiper-item></block>
</swiper><!-- 推荐电影区域 -->
<view class="section-title">为你推荐</view>
<view class="movie-grid"><viewwx:for="{{ recommendMovies }}"wx:key="id"class="movie-item"bindtap="goToDetail"data-id="{{ item.id }}"><image src="{{ item.poster }}" class="poster" mode="aspectFill" /><text class="title">{{ item.title }}</text><text class="rating">评分:{{ item.rating }}</text></view>
</view><!-- 加载状态 -->
<view wx:if="{{ loading }}" class="loading">加载中...</view>
<view wx:elif="{{ recommendMovies.length === 0 && !loading }}" class="empty">暂无推荐</view>

说明

  • wx:if / wx:elif / wx:else 条件渲染
  • block 用于包裹多个元素而不产生额外节点
  • bindtap 绑定点击事件

知识点5:页面间传参与接收

案例:movieDetail.js 接收参数

Page({data: {movie: null,reviews: []},onLoad(options) {const { id } = options; // 从 URL 获取参数if (id) {this.loadMovieDetail(id);this.loadReviews(id);}},async loadMovieDetail(movieId) {const res = await wx.request({url: `https://api.example.com/movie/${movieId}`});this.setData({ movie: res.data });},async loadReviews(movieId) {const res = await wx.request({url: `https://api.example.com/reviews?movieId=${movieId}`});this.setData({ reviews: res.data });},// 跳转到影评详情goToReviewDetail(e) {const reviewId = e.currentTarget.dataset.reviewId;wx.navigateTo({url: `/pages/reviewDetail/reviewDetail?id=${reviewId}`});}
});

说明

  • onLoad(options)options 包含 URL 参数
  • 使用模板字符串拼接 API 地址

四、影评模块开发

知识点6:表单提交与用户交互

案例:发布影评(简化版)

reviewList.wxml

<view class="post-review"><textareaplaceholder="写下你的影评..."bindinput="onInput"value="{{ content }}"/><button type="primary" bindtap="submitReview" disabled="{{ !content.trim() }}">发布</button>
</view>

reviewList.js

Page({data: {content: '',movieId: ''},onLoad(options) {this.setData({ movieId: options.movieId });},onInput(e) {this.setData({ content: e.detail.value });},async submitReview() {if (!this.data.content.trim()) {wx.showToast({ title: '内容不能为空', icon: 'none' });return;}try {await wx.request({url: 'https://api.example.com/reviews',method: 'POST',data: {movieId: this.data.movieId,content: this.data.content,userId: wx.getStorageSync('userId') // 假设有用户登录}});wx.showToast({ title: '发布成功' });this.setData({ content: '' });// 重新加载影评列表this.triggerEvent('refresh'); // 或调用父页面方法} catch (err) {wx.showToast({ title: '发布失败', icon: 'none' });}}
});

说明

  • bindinput 实时获取输入内容
  • disabled 控制按钮状态
  • 使用 wx.getStorageSync 获取本地存储数据

五、综合性案例:完整电影详情页

综合案例:movieDetail 页面(含电影信息 + 影评列表 + 发布功能)

movieDetail.json

{"usingComponents": {"van-rate": "@vant/weapp/rate/index","van-button": "@vant/weapp/button/index"}
}

movieDetail.wxml

<view class="container" wx:if="{{ movie }}"><!-- 电影海报与信息 --><view class="movie-header"><image src="{{ movie.poster }}" class="poster" /><view class="info"><text class="title">{{ movie.title }}</text><text class="year">{{ movie.year }}</text><view class="rating"><van-rate value="{{ movie.rating / 2 }}" readonly size="20" /><text class="score">{{ movie.rating }}</text></view><text class="director">导演:{{ movie.director }}</text><text class="cast">主演:{{ movie.cast.join(' / ') }}</text></view></view><!-- 剧情简介 --><view class="section"><text class="section-title">剧情简介</text><text class="summary">{{ movie.summary }}</text></view><!-- 影评列表 --><view class="section"><text class="section-title">用户影评 ({{ reviews.length }})</text><view wx:for="{{ reviews }}" wx:key="id" class="review-item"><text class="review-content">{{ item.content }}</text><text class="review-time">{{ item.createTime }}</text></view></view><!-- 跳转到完整影评列表 --><van-buttontype="default"size="small"bindtap="goToReviewList"data-movie-id="{{ movie.id }}">查看全部影评</van-button>
</view><view wx:else class="loading">加载中...</view>

movieDetail.js(部分)

Page({data: {movie: null,reviews: []},onLoad(options) {const { id } = options;this.loadMovieAndReviews(id);},async loadMovieAndReviews(id) {wx.showLoading({ title: '加载中' });try {// 并行请求const [movieRes, reviewRes] = await Promise.all([wx.request({ url: `https://api.example.com/movie/${id}` }),wx.request({ url: `https://api.example.com/reviews?movieId=${id}&limit=3` })]);this.setData({movie: movieRes.data,reviews: reviewRes.data});} catch (err) {wx.showToast({ title: '加载失败', icon: 'none' });} finally {wx.hideLoading();}},goToReviewList(e) {const movieId = e.currentTarget.dataset.movieId;wx.navigateTo({url: `/pages/reviewList/reviewList?movieId=${movieId}`});}
});

综合知识点

  • 并行请求优化加载速度(Promise.all
  • 使用 Vant 组件库的评分组件
  • 动态绑定数据与事件
  • 页面加载状态管理

六、项目测试与发布

知识点7:小程序测试与上传

测试方法

  • 使用开发者工具的“真机调试”
  • 模拟不同网络环境(弱网、断网)
  • 使用 wx.setStorageSync 模拟登录状态

上传发布命令(通过开发者工具 GUI 操作)

  1. 点击“上传”按钮
  2. 填写版本号与项目备注
  3. 登录微信公众平台审核发布

测试示例:mock 数据(开发阶段)

// utils/mock.js
export const mockMovie = {id: '1001',title: '肖申克的救赎',year: '1994',rating: 9.7,director: '弗兰克·德拉邦特',cast: ['蒂姆·罗宾斯', '摩根·弗里曼'],poster: 'https://example.com/poster1.jpg',summary: '银行家安迪被冤入狱,用智慧与希望重获自由...'
};// 在页面中使用
onLoad() {if (__DEV__) { // 开发环境使用 mockthis.setData({ movie: mockMovie });} else {// 真实请求}
}

总结

本项目覆盖了微信小程序开发的核心知识点:

模块关键技术
项目结构app.json 配置、页面注册
UI 组件Vant WeUI 引入与使用
数据请求wx.request、async/await
页面通信URL 传参、事件传参
用户交互表单处理、按钮状态控制
渲染逻辑wx:for、wx:if、数据绑定
发布流程上传、审核、发布

通过以上案例,可构建一个功能完整、交互流畅的“电影之家”小程序。

http://www.dtcms.com/a/477886.html

相关文章:

  • CoRL2025口头报告:基于最优传输对齐人类视角和机器人视角的多模态数据,真正解决跨模态数据融合的问题
  • 线程进阶:线程池、单例模式与线程安全深度解析
  • ELK运维之路(Logstash7Kibana接入ES集群-7.17.24)
  • # Pandas 与 Spark 数据操作完整教程
  • 大数据实战项目-基于K-Means算法与Spark的豆瓣读书数据分析与可视化系统-基于python的豆瓣读书数据分析与可视化大屏
  • AI 数字人小程序功能全拆解:从用户体验到商业落地的产品设计逻辑
  • Agent 开发设计模式(Agentic Design Patterns )第 6 章:规划设计模式 Planning
  • 厦门做网站xm37如何增加网站内链建设
  • css变量的使用。
  • 全网首发 OpenAI Apps SDK 使用教程
  • mysql_page pagesize 如何实现游标分页?
  • Hive 拉链表
  • 集宁网站建设SEO优化安卓开发基础教程
  • C++友元函数和友元类!
  • Java面向对象编程深度解析:从对象思维到系统架构的艺术
  • 多制式基站综合测试线的架构与验证实践(4)
  • 洛阳制作网站ihanshi汉口网站建设制作
  • 2025年 Varjo XR-4 升级新品发布!首款专为陆、海、空领域战备训练打造的XR头显
  • 【XR硬件系列】AR眼镜的终极形态会是“普通眼镜”吗?技术瓶颈还有哪些?
  • 发布自己的 jar 包到 Maven 中央仓库 ( mvnrepository.com )
  • 页表 vs. 组相联缓存:内存管理与性能优化的殊途同归
  • 泉州专业建站品牌校园门户网站开发需求分析
  • 版本控制器之Git理论与实战
  • 注册网站时应注意什么域名注册后 免费自建网站
  • wpf passwordbox控件 光标移到最后
  • Linux wlan网络协议栈-路由框架详解
  • 廊坊安次区网站建设公司上海高登联合建设网站
  • 凡科网站手机投票怎么做wordpress vr主题
  • 【ElasticSearch】text 和 keyword 类型区分
  • vue3的组件通信方式汇总