logo

uni-app开发全解析:从目录结构到高级路由管理

作者:暴富20212025.09.19 19:05浏览量:0

简介:本文全面解析uni-app开发核心机制,涵盖目录结构规范、页面生命周期管理、组件交互模式及路由系统设计,为开发者提供从基础搭建到高级功能实现的完整技术指南。

一、uni-app标准目录结构解析

uni-app采用模块化目录设计,根目录包含以下核心文件夹:

  1. pages目录:存放所有页面组件,采用”页面名/index.vue”命名规范。例如:
    1. pages/
    2. ├── index/
    3. ├── index.vue # 页面逻辑
    4. └── index.scss # 页面样式
    5. └── user/
    6. ├── user.vue
    7. └── user.js # 页面专用脚本
  2. static目录:静态资源存储区,支持图片、字体等非代码文件
  3. components目录:全局可复用组件库,建议按功能分类:
    1. components/
    2. ├── ui/ # 基础UI组件
    3. ├── button.vue
    4. └── input.vue
    5. └── business/ # 业务组件
    6. └── order-card.vue
  4. 配置文件群
    • pages.json:路由配置中枢,定义页面路径、窗口样式及导航栏
    • manifest.json:应用全局配置,包含AppID、权限声明等
    • uni.scss:全局样式变量定义文件

最佳实践:建议使用HBuilderX的”新建页面”模板功能,自动生成符合规范的目录结构。对于大型项目,可增加utilsapi等辅助目录。

二、页面生命周期管理

uni-app页面生命周期分为两大阶段:

1. 页面级生命周期

  1. export default {
  2. // 初始化阶段
  3. onLoad(options) { // 接收路由参数
  4. console.log('页面加载', options.id);
  5. },
  6. onShow() { // 页面显示时触发
  7. this.loadData();
  8. },
  9. onReady() { // 页面首次渲染完成
  10. this.initChart();
  11. },
  12. // 销毁阶段
  13. onHide() { // 页面隐藏时触发
  14. clearInterval(this.timer);
  15. },
  16. onUnload() { // 页面卸载时触发
  17. this.$refs.webview.stop();
  18. }
  19. }

关键场景

  • onLoad:适合初始化数据请求,可接收navigateTo传递的参数
  • onShow:适合实时数据刷新,如消息列表页
  • onHide:必须清理定时器、WebSocket连接等资源

2. 组件级生命周期

  1. components: {
  2. myComponent: {
  3. beforeCreate() { // 实例初始化前
  4. console.log('组件准备创建');
  5. },
  6. mounted() { // 组件挂载完成
  7. this.startAnimation();
  8. },
  9. beforeDestroy() { // 组件销毁前
  10. this.stopObserver();
  11. }
  12. }
  13. }

组件通信时序:父组件mounted → 子组件beforeCreate → 子组件mounted → 父组件可安全访问子组件方法

三、页面通信机制

1. 路由参数传递

  1. // 跳转时传递参数
  2. uni.navigateTo({
  3. url: '/pages/detail/detail?id=123&name=test'
  4. });
  5. // 接收参数
  6. onLoad(options) {
  7. console.log(options.id); // 123
  8. }

2. 全局状态管理

  • Vuex方案:适合中大型项目
    ```javascript
    // store/index.js
    export default new Vuex.Store({
    state: { userInfo: null },
    mutations: {
    setUser(state, info) {
    1. state.userInfo = info;
    }
    }
    });

// 页面中使用
this.$store.commit(‘setUser’, data);

  1. - **EventBus方案**:适合简单跨组件通信
  2. ```javascript
  3. // utils/eventBus.js
  4. import Vue from 'vue';
  5. export const EventBus = new Vue();
  6. // 发送事件
  7. EventBus.$emit('refresh', data);
  8. // 接收事件
  9. EventBus.$on('refresh', (data) => {
  10. console.log(data);
  11. });

3. 本地存储

  1. // 存储对象
  2. uni.setStorageSync('user', {name: 'John'});
  3. // 读取数据
  4. const user = uni.getStorageSync('user');

四、路由系统深度解析

1. 路由配置规范

pages.json核心配置示例:

  1. {
  2. "pages": [
  3. {
  4. "path": "pages/index/index",
  5. "style": {
  6. "navigationBarTitleText": "首页",
  7. "enablePullDownRefresh": true
  8. }
  9. },
  10. {
  11. "path": "pages/detail/detail",
  12. "style": {
  13. "navigationBarTitleText": "详情",
  14. "navigationStyle": "custom"
  15. }
  16. }
  17. ],
  18. "tabBar": {
  19. "list": [
  20. {
  21. "pagePath": "pages/index/index",
  22. "text": "首页"
  23. }
  24. ]
  25. }
  26. }

2. 路由API对比

API 特点 适用场景
navigateTo 保留当前页,跳转到新页 普通页面跳转
redirectTo 关闭当前页,跳转到新页 登录后跳转
switchTab 切换Tab页 底部导航切换
reLaunch 关闭所有页,打开新页 退出登录后重置首页

3. 路由守卫实现

通过onLoad和全局变量模拟路由守卫:

  1. // 在App.vue中
  2. onLaunch() {
  3. uni.addInterceptor('navigateTo', {
  4. invoke(args) {
  5. if (!getApp().globalData.isLogin &&
  6. !args.url.includes('login')) {
  7. uni.redirectTo({ url: '/pages/login/login' });
  8. return false;
  9. }
  10. return true;
  11. }
  12. });
  13. }

五、页面创建与删除规范

1. 页面创建流程

  1. 手动创建

    • pages.json中添加路由配置
    • 创建对应目录和.vue文件
    • 示例命令:
      1. mkdir pages/newPage
      2. touch pages/newPage/index.vue
  2. 自动化方案

    1. // 自动化脚本示例
    2. const fs = require('fs');
    3. const pageName = 'order';
    4. fs.mkdirSync(`pages/${pageName}`);
    5. fs.writeFileSync(`pages/${pageName}/index.vue`, `
    6. <template>
    7. <view>${pageName}页面</view>
    8. </template>
    9. <script>
    10. export default {
    11. data() {
    12. return {}
    13. }
    14. }
    15. </script>
    16. `);

2. 页面删除注意事项

  1. 必须同步操作

    • 删除pages.json中的对应配置
    • 删除文件系统中的页面目录
    • 检查全局状态管理中的相关引用
  2. 热更新风险

    1. // 错误示例:直接删除文件不更新配置
    2. fs.rmdirSync('pages/oldPage', { recursive: true });
    3. // 可能导致应用启动时找不到页面而崩溃

六、性能优化建议

  1. 生命周期优化

    • 将耗时操作放在onReady而非onLoad
    • 使用onPullDownRefresh时设置防抖
      1. onPullDownRefresh() {
      2. clearTimeout(this.refreshTimer);
      3. this.refreshTimer = setTimeout(() => {
      4. this.loadData();
      5. uni.stopPullDownRefresh();
      6. }, 300);
      7. }
  2. 路由性能

    • 避免在tabBar页面中使用navigateTo嵌套过多层级
    • 对大列表页面使用keep-alive缓存
      1. <keep-alive>
      2. <list-page v-if="activeTab === 'list'" />
      3. </keep-alive>
  3. 组件复用

    • 将高频使用的UI组件注册为全局组件
      1. // main.js
      2. import Button from '@/components/ui/button.vue';
      3. Vue.component('m-button', Button);

通过系统掌握这些核心机制,开发者能够构建出结构清晰、性能优良的uni-app应用。建议结合官方文档持续验证最新特性,特别是在跨平台兼容性方面保持关注。

相关文章推荐

发表评论