乐于分享
好东西不私藏

uniapp开发学习第4天:组件化开发与TS深度适配,解锁工程化高阶玩法

uniapp开发学习第4天:组件化开发与TS深度适配,解锁工程化高阶玩法

各位坚持打卡、稳步进阶、立志吃透跨端全栈的老铁们,大家好!📣

欢迎入驻 UniApp零基础进阶营·Day4

快速复盘前三天的硬核收获,帮大家捋清技术成长脉络:

Day1 打通框架认知,搞定环境搭建与项目配置,拿到跨端开发入场券;

Day2 吃透核心语法与页面开发,告别小白式乱写代码;

Day3 拿下路由跳转、网络请求、本地存储、列表交互,让静态页面彻底“活”过来;

学到这里,很多同学已经能独立写完整页面、实现基础业务功能。但新的问题又来了:页面代码越写越长、逻辑越堆越乱,重复代码遍地都是,改一个地方全局出错!

这就是典型的无组件化、无工程化野路子开发痛点!

今天我们直接进阶UniApp高阶核心:组件化开发 + TS深度适配 + Pinia状态管理。彻底告别代码冗余、逻辑混乱,写出企业级标准、可复用、易维护的跨端代码!

老规矩,开篇封神口诀,背完直接拿捏全天核心知识点:

组件封装解冗余,TS约束稳运行;

四种通信选最优,生命周期记分明;

条件编译适配全,类型配置无漏洞;

Pinia管状态全局,工程进阶成大神!


一、什么是组件化?为什么必学?

给大家整一个人人都能听懂的生活化类比,彻底搞懂组件化的价值!

非组件化开发:就像自己做饭,买菜、洗菜、切菜、炒菜、洗碗全部自己干,每做一顿饭重复一遍,费时费力、容错率极低。

组件化开发:就像预制半成品食材,洗好、切好、调好味,一次封装、随处复用,需要用时直接拿来用,不用重复造轮子。

在项目中:按钮、卡片、列表项、弹窗、导航栏,这些高频重复的模块,全部封装成独立组件。

一次封装,百处复用,改一处、全局更新,这就是企业开发的核心标准!


二、UniApp自定义组件开发:Vue3组件的跨端升级版

很多会Vue3的同学会问:UniApp组件和Vue3组件一样吗?

答案:语法99%一致,底层多端适配更强,但存在细微差异,踩坑全在细节!

1. UniApp组件与Vue3组件核心差异

  • Vue3组件:仅适配浏览器Web端,依赖DOM节点,无多端兼容逻辑

  • UniApp组件:基于Vue3语法开发,底层做了小程序/APP/H5多端兼容处理,不依赖原生DOM,跨端零报错

简单说:Vue组件是单端专用,Uni组件是全端通用

2. 组件创建与注册(零基础实战)

第一步:创建自定义组件

在 components 目录新建组件文件,例如 UniCard.vue(通用卡片组件,项目高频复用)。

第二步:局部注册(单页面使用)

在需要使用的页面直接引入,随用随引,适合页面独有组件。

<scriptsetuplang="ts">// 直接引入组件,自动注册import UniCard from "@/components/UniCard.vue"</script><template>  <viewclass="content">    <UniCard />  </view></template>

第三步:全局注册(整项目复用)

在 main.ts 全局注册,所有页面无需引入直接使用,适合公共通用组件。

import UniCard from "@/components/UniCard.vue"app.component("UniCard"UniCard)

3. Props/Emits 全套TS类型约束(企业级规范)

组件开发最怕传参混乱、类型报错!TS的核心价值就是约束参数、杜绝隐性BUG

✅ 实战:带完整TS约束的卡片组件

<template>  <viewclass="card">    <textclass="card-title">{{ title }}</text>    <textclass="card-desc">{{ desc }}</text>    <button @click="handleClick">点击操作</button>  </view></template><scriptsetuplang="ts">// 1. Props TS类型约束:父传子interface CardProps {  title: string  desc?: string // 可选参数  id: number}const props = defineProps<CardProps>()// 2. Emits TS类型约束:子传父interface CardEmits {  (e"click"id: number): void}const emit = defineEmits<CardEmits>()// 触发自定义事件const handleClick = () => {  emit("click", props.id)}</script>

🔥 优势:参数类型错误、缺参、传错值,TS直接语法提示,开发阶段杜绝90%参数BUG


三、UniApp四大组件通信方式:按需选用、全端适配

组件通信是业务开发刚需!UniApp兼容Vue3所有通信方式,同时做了多端适配,今天一次性吃透四种主流通信方案,适配不同业务场景。

1. Props / Emits(父子组件最简通信)

适用场景:简单父子组件传值,最常用、最高效

逻辑:Props父传子、Emits子传父,上面实战代码已完整演示

多端适配:H5/小程序/APP原生兼容,零适配成本

2. ref模板引用(直接调用子组件方法/属性)

适用场景:父组件主动控制子组件状态、调用子组件方法

✅ 实战示例:

<template>  <UniCardref="cardRef" />  <button @click="callChildMethod">调用子组件方法</button></template><scriptsetuplang="ts">import { ref } from "vue"import UniCard from "@/components/UniCard.vue"// 绑定组件实例const cardRef = ref<InstanceType<typeof UniCard>>()const callChildMethod = () => {  // 调用子组件内部方法  cardRef.value?.initData()}</script>

3. provide / inject(深层祖孙组件穿透传值)

适用场景:多层嵌套组件传值,避免层层props透传的繁琐

核心优势:祖先组件提供数据,任意后代组件直接获取,无视层级

多端适配:UniApp全端兼容,和Vue3语法完全一致

4. 全局事件总线(跨组件简易通信)

适用场景:无关联组件、跨页面简易通信

UniApp摒弃了Vue2的EventBus,使用uni.$on / uni.$emit 全局事件,多端统一适配。

✅ 实战示例:

// 组件A:监听全局事件uni.$on("updateUser"(data) => {  console.log("接收全局数据:", data)})// 组件B:触发全局事件uni.$emit("updateUser", { name"跨端开发者" })

💡 通信口诀:父子传参用Props,父控子态用ref,深层穿透用注入,跨组通信靠总线!


四、UniApp组件生命周期:区分页面与组件钩子

新手最大误区:把页面生命周期和组件生命周期混为一谈,导致数据不刷新、逻辑不执行!

1. 核心区别(必记)

  • 页面生命周期:onLoad、onShow、onReady、onUnload,仅页面生效,组件不生效

  • 组件生命周期:onMounted、onUpdated、onUnmounted,组件专用,和Vue3一致

2. 实战场景举例

如果你在自定义组件里写 onLoad,永远不会执行!组件初始化数据,必须写在 onMounted 中。

// 组件正确初始化写法onMounted(() => {  console.log("组件挂载完成,初始化数据")})

3. 多端兼容说明

UniApp对组件生命周期做了底层统一,H5、小程序、APP执行顺序完全一致,无需单独做平台兼容


五、多端组件适配:条件编译,一招搞定差异化

跨端开发绕不开的痛点:不同平台组件样式、功能有差异

比如某些按钮小程序专属、部分样式APP需要特殊适配、H5需要单独兼容。

UniApp王炸能力:条件编译,精准区分平台、差异化渲染代码!

1. 条件编译语法规则

  • #ifdef H5:仅H5端生效

  • #ifdef MP-WEIXIN:仅微信小程序生效

  • #ifdef APP-PLUS:仅APP端生效

2. 实战差异化组件适配

场景:H5端展示网页按钮,小程序展示原生按钮,APP展示自定义按钮

<template>  <!-- H5专属组件 -->  <view #ifdefH5class="h5-btn">H5网页按钮</view>  <!-- 微信小程序专属组件 -->  <button #ifdefMP-WEIXIN>小程序原生按钮</button>  <!-- APP专属组件 -->  <view #ifdefAPP-PLUSclass="app-btn">APP自定义按钮</view></template>

✅ 核心价值:一套代码,多端差异化适配,不用新建多套项目,极致高效


六、UniApp+TS深度适配:解决所有类型报错

很多小伙伴用TS开发UniApp,天天踩坑:模块找不到、类型缺失、语法报错、全局变量无提示。

今天一次性搞定企业级TS全局配置,彻底告别TS报错!

1. 全局类型声明配置

在项目根目录新建 types.d.ts 全局类型文件,统一声明全局变量、自定义类型。

// 全局通用类型声明declare interface GlobalUser {  nicknamestring  tokenstring  avatarstring}// 扩展uni全局API类型declare module "uni-app" {  interface Uni {    myToast(titlestring) => void  }}

2. tsconfig.json 核心配置

开启严格类型校验、路径解析、模块兼容,适配UniApp跨端特性:

{  "compilerOptions": {    "strict": true, // 开启严格TS校验    "baseUrl": "./",    "paths": {      "@/*": ["src/*"] // 路径别名适配    },    "moduleResolution": "NodeNext"  },  "include": ["src/**/*", "types.d.ts"]}

配置完成后,全局类型提示齐全、语法报错清零、代码规范性拉满


七、Pinia状态管理:UniApp全局数据神器

Vue2时代我们用Vuex,Vue3+UniApp时代,Pinia是唯一首选!更轻、更快、语法更简单、TS适配完美。

1. Pinia在UniApp中的优势

  • 摒弃Vuex繁琐的mutations,语法极简

  • 天然适配TS,类型约束完整

  • 支持多端状态同步,H5/小程序/APP数据统一

  • 轻松实现数据持久化

2. 实战:用户状态全局管理+持久化

第一步:创建store/user.ts

import { defineStore } from "pinia"// TS类型约束interface UserState {  tokenstring  nicknamestring}export const useUserStore = defineStore("user", {  state: (): UserState => ({    token"",    nickname""  }),  actions: {    // 全局修改用户信息    setUserInfo(dataUserState) {      this.token = data.token      this.nickname = data.nickname    }  }})

第二步:页面使用全局状态

import { useUserStore } from "@/store/user"const userStore = useUserStore()// 修改全局状态userStore.setUserInfo({  token"123456",  nickname"跨端开发者"})// 获取全局状态console.log(userStore.nickname)

3. 状态持久化(刷新不丢失、重启不失效)

搭配uni存储,实现Pinia数据持久化,解决刷新页面状态重置问题,完美适配多端!


八、今日学习目标自查清单

全部掌握,正式迈入UniApp工程化开发✅

  1. 熟练掌握UniApp自定义组件开发,理清与Vue3组件的跨端差异,可独立封装组件,并为Props/Emits编写完整TS类型约束

  2. 吃透四大组件通信方案,掌握各方式适用场景与多端适配规则,能根据业务灵活选择最优通信方案

  3. 精准区分页面与组件生命周期,熟练使用条件编译实现多端组件差异化适配,解决跨端兼容问题

  4. 完成UniApp+TS深度适配配置,掌握全局类型声明、模块扩展、语法校验配置,清零TS类型报错

  5. 熟练使用Pinia实现全局状态管理,掌握多端状态同步与持久化处理,适配企业级项目开发


九、结尾

各位老铁,恭喜大家突破页面级开发,迈入工程化高阶开发!🎉

如果说前三天学的是“怎么写页面、怎么实现功能”,今天学的就是怎么写规范、怎么写高效、怎么写可维护的商用代码

组件化解决代码冗余,TS约束解决隐性BUG,条件编译解决多端兼容,Pinia解决全局状态混乱。

这一套组合拳下来,你的代码质量直接甩开80%的新手开发者,完全达到企业入职、接单交付的标准

从此告别堆砌代码、告别重复造轮子、告别多端适配踩坑、告别TS漫天报错!

明天我们进阶UniApp原生API、自定义弹窗、权限路由、项目打包发布,从代码开发到项目上线,一站式打通全流程!

坚持每日深耕打卡,稳步进阶跨端全栈大神,求职、副业、接单全程开挂!💪