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

uni-app 入门学习教程,从入门到精通,uni-app基础扩展 —— 详细知识点与案例(3)

uni-app基础扩展 —— 详细知识点与案例


一、学习目标

本章旨在掌握 uni-app 中的生命周期机制、条件编译、扩展组件(uni-ui)的使用、辅助样式库(uni-scss)的集成,以及通过综合案例(新闻列表)巩固所学知识。


二、生命周期

uni-app 中的生命周期分为三类:应用生命周期页面生命周期组件生命周期函数

1. 应用生命周期(App.vue)

应用生命周期在整个 App 启动到关闭过程中只执行一次。

常用钩子函数:
  • onLaunch:App 初始化完成时触发(全局只触发一次)
  • onShow:App 启动或从后台进入前台显示
  • onHide:App 从前台进入后台
案例代码(App.vue):
<script>
export default {onLaunch() {console.log('App 启动完成');// 可用于初始化全局状态、获取用户信息等},onShow() {console.log('App 进入前台');// 可用于刷新 token、检查网络状态等},onHide() {console.log('App 进入后台');// 可用于暂停音频、保存临时数据等}
}
</script>

⚠️ 注意:应用生命周期只能在 App.vue 中使用,不能在页面或组件中使用。


2. 页面生命周期(pages/xxx.vue)

页面生命周期在每次页面加载/卸载时触发。

常用钩子函数:
  • onLoad:监听页面加载,参数为上个页面传递的数据
  • onShow:监听页面显示(每次进入页面都会触发)
  • onReady:监听页面初次渲染完成
  • onHide:监听页面隐藏
  • onUnload:监听页面卸载(如通过 navigateBack 返回)
案例代码(pages/news/news.vue):
<template><view class="news-page"><text>新闻列表页面</text></view>
</template><script>
export default {onLoad(options) {// 页面加载时触发,options 是上个页面传来的参数console.log('页面加载,参数:', options);// 例如:从首页跳转过来携带 id=123,则 options = { id: '123' }},onShow() {console.log('新闻页面显示');// 可用于刷新数据},onReady() {console.log('页面初次渲染完成');// 可用于操作 DOM(如调用 canvas、video 等原生组件)},onHide() {console.log('新闻页面隐藏');},onUnload() {console.log('新闻页面卸载');// 清理定时器、取消网络请求等}
}
</script>

3. 组件生命周期函数(components/xxx.vue)

组件生命周期与 Vue 3 的组合式 API 或选项式 API 兼容。uni-app 支持 Vue 2/3 语法。

常用钩子(选项式):
  • beforeCreate
  • created
  • mounted(对应 uni-app 的 onReady
  • beforeDestroy / unmounted

⚠️ 注意:在组件中不能使用页面生命周期(如 onLoad),只能使用 Vue 标准生命周期。

案例代码(components/NewsItem.vue):
<template><view class="news-item"><text>{{ title }}</text></view>
</template><script>
export default {props: {title: {type: String,default: '默认标题'}},created() {console.log('组件实例创建完成');// 可进行数据初始化},mounted() {console.log('组件挂载完成');// 可操作子组件或 DOM},beforeDestroy() {console.log('组件即将销毁');// 清理工作}
}
</script>

三、条件编译

uni-app 支持平台条件编译,可针对不同平台(H5、微信小程序、App 等)编写特定代码。

语法格式:

// #ifdef 平台标识
// 代码
// #endif// #ifndef 平台标识
// 非该平台的代码
// #endif

常见平台标识:

  • H5
  • MP-WEIXIN(微信小程序)
  • APP-PLUS(App 端)
  • MP-ALIPAY(支付宝小程序)

案例:不同平台显示不同按钮

<template><view><!-- 微信小程序专属 -->// #ifdef MP-WEIXIN<button type="primary">微信登录</button>// #endif<!-- H5 专属 -->// #ifdef H5<button type="default">H5 登录</button>// #endif<!-- 非 App 端显示 -->// #ifndef APP-PLUS<text>当前不是 App 端</text>// #endif</view>
</template>

JS 中使用条件编译:

// #ifdef H5
const apiUrl = 'https://h5.api.example.com';
// #endif// #ifdef MP-WEIXIN
const apiUrl = 'https://wx.api.example.com';
// #endif

四、扩展组件 uni-ui

uni-ui 是 DCloud 官方提供的跨端 UI 组件库,支持所有 uni-app 平台。

1. 安装 uni-ui

在 HBuilderX 中:

  1. 右键项目 → uni_modules从插件市场选择
  2. 搜索 uni-ui → 安装

或手动安装:

npm install @dcloudio/uni-ui

推荐使用 HBuilderX 图形化安装,自动处理依赖。

2. 引入并使用组件

全局注册(main.js):
import { createSSRApp } from 'vue'
import App from './App.vue'
import { UniCard, UniList, UniListItem } from '@dcloudio/uni-ui'export function createApp() {const app = createSSRApp(App)app.component('UniCard', UniCard)app.component('UniList', UniList)app.component('UniListItem', UniListItem)return app
}
局部引入(推荐,按需加载):
<template><view><uni-card title="新闻标题" :thumbnail="thumbUrl">这是新闻内容摘要...</uni-card></view>
</template><script>
// 按需引入
import { UniCard } from '@dcloudio/uni-ui'export default {components: { UniCard },data() {return {thumbUrl: 'https://example.com/thumb.jpg'}}
}
</script>

五、uni-scss 辅助样式

uni-scss 是一套基于 scss 的跨端样式变量库,提供统一的颜色、间距、边框等变量。

使用步骤:

  1. 安装 uni-scss(通常随 uni-ui 自动安装)
  2. App.vue 或页面中引入
<style lang="scss">
@import '@/uni_modules/uni-scss/index.scss';.news-container {padding: $uni-spacing-col-lg; // 使用预设间距变量background-color: $uni-bg-color-grey;
}
</style>

常用变量示例:

  • $uni-color-primary:主色
  • $uni-spacing-row-base:水平基础间距
  • $uni-font-size-lg:大号字体

六、案例:新闻列表(综合应用)

功能需求:

  • 使用 uni-list 展示新闻列表
  • 每条新闻包含标题、摘要、缩略图
  • 点击跳转详情页
  • 使用生命周期加载数据
  • 使用 uni-scss 统一样式
  • 条件编译:H5 端显示“刷新”按钮,小程序端不显示

1. pages/news/index.vue

<template><view class="news-container"><!-- 条件编译:仅 H5 显示刷新按钮 -->// #ifdef H5<button class="refresh-btn" @click="loadNews">刷新</button>// #endif<uni-list><uni-list-itemv-for="item in newsList":key="item.id":title="item.title":note="item.summary":thumb="item.thumb"thumb-size="lg"clickable@click="goDetail(item.id)"/></uni-list></view>
</template><script>
import { UniList, UniListItem } from '@dcloudio/uni-ui'export default {components: { UniList, UniListItem },data() {return {newsList: []}},onLoad() {this.loadNews()},methods: {loadNews() {// 模拟网络请求this.newsList = [{ id: 1, title: '科技新闻1', summary: '这是第一条科技新闻摘要...', thumb: '/static/thumb1.jpg' },{ id: 2, title: '财经新闻2', summary: '股市大涨...', thumb: '/static/thumb2.jpg' }]},goDetail(id) {uni.navigateTo({url: `/pages/news/detail?id=${id}`})}}
}
</script><style lang="scss">
@import '@/uni_modules/uni-scss/index.scss';.news-container {padding: $uni-spacing-col-base;background-color: $uni-bg-color;
}// #ifdef H5
.refresh-btn {margin-bottom: $uni-spacing-col-lg;background-color: $uni-color-primary;color: white;
}
// #endif
</style>

2. pages/news/detail.vue

<template><view class="detail-page"><uni-card :title="detail.title" :thumbnail="detail.thumb"><text>{{ detail.content }}</text></uni-card></view>
</template><script>
import { UniCard } from '@dcloudio/uni-ui'export default {components: { UniCard },data() {return {detail: {}}},onLoad(options) {const id = options.id// 模拟根据 id 获取详情this.detail = {title: `新闻详情 ${id}`,thumb: '/static/thumb1.jpg',content: '这里是详细的新闻内容...'}}
}
</script>

七、本章小结

知识点说明
生命周期区分应用、页面、组件三类生命周期,避免混用
条件编译实现多端差异化逻辑,提升兼容性
uni-ui官方 UI 库,开箱即用,支持按需引入
uni-scss提供统一设计变量,提升样式一致性
综合案例结合生命周期、组件、样式、路由实现完整功能

💡 最佳实践建议

  • 页面数据初始化放在 onLoad
  • 全局状态管理建议使用 vuexpinia
  • 组件尽量使用局部注册,减少包体积
  • 条件编译代码需谨慎维护,避免逻辑混乱

如需进一步扩展(如分页加载、下拉刷新、骨架屏等),可在本章基础上结合 onPullDownRefreshscroll-view 等 API 实现。

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

相关文章:

  • 解决uniapp中showLoading与showToast相互覆盖问题
  • 网站建设的外国文献三星网上商城怎么取消订单
  • 电子商务网站的建设内容家庭装什么宽带最划算
  • 轮廓系数(一个异型簇的分类标准)
  • 把 1688 商品详情搬进 MySQL:PHP 爬虫全链路实战(2025 版)
  • python+uniapp基于微信小程序的个人物品租售系统
  • 中国(新疆)航空航天国防展--三款MEMS惯性导航系统解析
  • 十大拿货网站爱做奈官方网站
  • 图像处理之膨胀
  • AI部署001 - C++环境部署与服务器使用
  • MP4格式视频无法播放怎么修?4个修复方法,解决难题
  • 语音处理:音频移形幻影,为何大振幅信号也无声
  • dedecms学校网站模板wordpress 3d插件
  • 注册一个新公司需要多少钱seo如何进行优化
  • Git流程规范介绍
  • Python 第十五节 OS文件操作相关方法用途详解
  • 动态规划的“递归之舞”:破解字符串的深层结构——扰乱字符串
  • 淮北市做网站最好的公司上海网站搭建平台公司
  • 网站域名设计推荐新华网海南频道
  • InternVL3.5多模态多大模型改进点及视觉分辨率路由模块技术浅尝
  • 人工智能基础知识笔记十八:Prompt Engineering
  • 深入理解Shell与反弹Shell:从原理到实战
  • LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
  • EvalScope模型压力测试实战
  • 极速网站建设服务商厦门网站建设网络推广
  • 新建网站如何调试网页设计公司的调研
  • 模拟oracle 索引平衡树叶子节点
  • Android 内存优化
  • Java JVM “垃圾回收(GC)”面试清单(含超通俗生活案例与深度理解)
  • Python快速落地的临床知识问答与检索项目(2025年9月教学实现部分)