从零搭建uniapp项目

目录

创建uni-app项目

基础架构

安装 uni-ui 组件库

安装sass依赖

easycom配置组件自动导入

配置view等标签高亮声明

配置uni-ui组件类型声明

解决 标签 错误

关于tsconfig.json中提示报错

关于非原生标签错误(看运气)

安装 uview-plus 组件库

​编辑

Pinia 配置

pinia 依赖安装

测试

pinia 持久化配置


创建uni-app项目

npx degit dcloudio/uni-preset-vue#vite-ts new-project-name

new-project-name:这里更改一下为自己的项目名称

基础架构

安装 uni-ui 组件库

官网:uni-app官网

通过官网说明文档相对应的搭建

pnpm i @dcloudio/uni-ui

安装sass依赖

pnpm i sass@1.63.2 -D
pnpm i sass-loader@10.4.1 -D

easycom配置组件自动导入

// pages.json
{// uniapp 配置文件"easycom": {"autoscan": true,// 以正则方式自定义组件匹配规则"custom": {// uni-ui 规则如下配置"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue",// 以serive开头的组件,在 components 文件夹中查找引入(需要重启服务器)//"^serive(.*)": "@/components/serive/serive$1.vue"}},// 其他内容pages:[// ...]
}

配置view等标签高亮声明

pnpm i -D miniprogram-api-typings @uni-helper/uni-app-types

安装成功后复制对应的依赖包名放置在 tsconfig.json中的type字段

同时加上 vueCompilerOptions 配置

  "vueCompilerOptions": {"experimentalRuntimeMode": "runtime-uni-app"},

配置uni-ui组件类型声明

组件声明类型依赖官网(注意:如果缓慢需要魔法):@uni-helper/uni-ui-types - npm

pnpm i -D @uni-helper/uni-ui-types

安装成功后复制对应的依赖包名放置在 tsconfig.json中的type字段

解决 标签 错误

关于tsconfig.json中提示报错

选项“importsNotUsedAsValues”已删除。请从配置中删除它。请改用“verbatimModuleSyntax”

主要是我们使用的tsconfig版本太低了

步骤1:

更新@vue/tsconfig版本,在package.json文件中找到@vue/tsconfig,把版本号改为0.7.0

 "@vue/tsconfig": "^0.7.0",

随后运行pnpm 更新依赖

pnpm install

最后更改 tsconfig 地址 

  "extends": "@vue/tsconfig/tsconfig.dom.json",

这样就不报错了

关于非原生标签错误(看运气)

当我们发现正常标签报错

更改我们的 tsconfig.json,参考一下我下面的配置

{"extends": "@vue/tsconfig/tsconfig.dom.json","compilerOptions": {"sourceMap": true,"baseUrl": ".","paths": {"@/*": ["./src/*"]},"lib": ["esnext", "dom"],// 类型声明文件"types": ["@uni-helper/uni-ui-types",   // uni-ui 组件类型"@dcloudio/types", // uni-app API 类型"miniprogram-api-typings", // 原生微信小程序类型"@uni-helper/uni-app-types" // uni-app 组件类型]},// vue 编译器类型,校验标签类型"vueCompilerOptions": {//新增加的配置 experimentalRuntimeMode 已废弃,现调整为 nativeTags,请升级 Volar 插件至最新版本"nativeTags": ["block", "component", "template", "slot"],// experimentalRuntimeMode 已废弃,请升级 Vue - Official 插件至最新版本"plugins": ["@uni-helper/uni-app-types/volar-plugin"]},"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}

如果还是爆红,多次尝试重启 Vue - Official 插件,以及重启vscode,我就是这样不明不白的改好了。

安装 uview-plus 组件库

执行命令安装 uview 依赖

pnpm install uview-plus

挂载使用

import uviewPlus from 'uview-plus'app.use(uviewPlus);

由于uview-plus 不是原生组件,所以我们要自定义声明类型,这样就不会爆红波浪线了

uview-plus.d.ts

// src/types/uview-plus.d.ts
declare module 'uview-plus' {import { Plugin } from 'vue';const install: Plugin;export default install;
}

全局样式配置

 /* src\uni.scss */
@import  'uview-plus/theme.scss';
// src\App.vue
<style lang="scss">/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */@import "uview-plus/index.scss";
</style>

自动导入

// pages.json
{"easycom": {"autoscan": true,// 注意一定要放在custom里,否则无效,https://ask.dcloud.net.cn/question/131175"custom": {"^u--(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue","^up-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue","^u-([^-].*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue"}},// 此为本身已有的内容"pages": [// ......]
}

Pinia 配置

Pinia官网(注意:如果缓慢需要魔法):Pinia | The intuitive store for Vue.js

pinia 依赖安装

执行命令安装 Pinia 依赖

pnpm install pinia

分包创建目录

index.ts配置pinia

import { createPinia } from "pinia";
const pinia = createPinia();    // 创建 Pinia 实例
// 默认导出,给 main.ts 使用
export default pinia;
// 模块统一导出
export * from "./modules/counter";

main.ts 使用 pinia

import { createSSRApp } from "vue";
import App from "./App.vue";
import pinia from "./stores";
export function createApp() {const app = createSSRApp(App);app.use(pinia); // 挂载piniareturn {app,};
}
测试

counter.ts

import { defineStore } from "pinia";
import { computed, ref } from "vue";
export const useCounterStore = defineStore("counter", () => {// 声明 数据类型const count = ref(0);// 定义 计数器方法const increment = () => {count.value++;}// 声明基于数据派生的计算属性const double = computed(() => {return count.value * 2;})// 返回 计数器数据、方法、计算属性return {count,double,increment,}},
);

Test.vue

<script lang="ts" setup>
import { useCounterStore } from '@/stores';
import { storeToRefs } from 'pinia';
const counter = useCounterStore();const { count } = storeToRefs(counter);
const {double} = storeToRefs(counter)
const {increment} =  counter</script><template><div class="Test"><uni-card><text>计数:{{ count }}</text><br><text>双倍:{{ double }}</text></uni-card><up-button @tap="increment">+</up-button></div>
</template><style lang="scss" scoped></style>

pinia 持久化配置

执行命令安装 pinia-plugin-persistedstate 依赖

pnpm i pinia-plugin-persistedstate

 index.ts配置持久化

import { createPinia } from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";
const pinia = createPinia();    // 创建 Pinia 实例pinia.use(piniaPluginPersistedstate);   // 使用 pinia-plugin-persistedstate 持久化配置// 默认导出,给 main.ts 使用
export default pinia;// 模块统一导出
export * from "./modules/counter";

配置持久化 counter.ts


import { defineStore} from "pinia";
import { computed, ref } from "vue";export const useCounterStore = defineStore("counter", () => {// 声明 数据类型const count = ref(100);// 定义 计数器方法const increment = () => {count.value++;console.log('增加了:',count.value);}// 声明基于数据派生的计算属性const double = computed(() => {return count.value * 2;})// 返回 计数器数据、方法、计算属性return {count,double,increment,}  
},// 配置项 {// 网页端的 持久化配置// persist: true// 移动端的 持久化配置// persist: {//     storage: localStorage,//     key: 'count',// }// 小程序的 持久化配置, 同时兼容大部分浏览器H5persist: {storage: {getItem(key) {return uni.getStorageSync(key);},setItem(key, value) {return uni.setStorageSync(key, value);},}}}
);

报错 X [ERROR] Could not resolve "destr"

解决方法:

降低 持久化依赖的版本

  "pinia-plugin-persistedstate": "^3.2.3",

测试效果,成功持久化存储到本地

请求配置

添加拦截器

// src/utils/http.tsimport { useUserStore } from "@/stores/modules/user"
// 基础的请求地址
const baseUrl = "http://localhost:3000"
// 拦截器配置
const httpInterceptor = {// 拦截前触发invoke(options: UniApp.RequestOptions) {// 1、非 http 开头需拼接地址if (!options.url.startsWith('http')) {options.url = baseUrl + options.url}// 2、请求超时,如果没有配置则默认 60soptions.timeout = options.timeout || 10000// 3、添加小程序端请求头标识options.header = options.header || {...options.header,  // 如果请求设置方法前配置了 header 则保留之前配置过的'source-client': 'uniapp'}// 4、添加 token 请求标识const userStore = useUserStore();// 这里 ?. 表示 可选链操作符,如果 userStore.userInfo 为空,则 token 为 undefinedconst token = userStore.userInfo?.token;if  (token) {options.header['Authorization'] = 'Bearer ' + token;}}
}
// 添加拦截器,这里共用一份拦截器
uni.addInterceptor('request', httpInterceptor)
uni.addInterceptor('uploadFile', httpInterceptor)

添加封装请求函数

// src/utils/http.ts// .....  接着添加// 2.3 指定响应数据结构
interface Data<T>{code: number,msg: string,result: T
}
// 2.2 添加类型,支持泛型
const http = <T>(options: UniApp.RequestOptions) => {// 返回 Promise 对象return new Promise<Data<T>>((resolve, reject) => {uni.request({...options,// 2、请求成功success: (res) => {// 2.1 提取核心数据 res.data// 类型断言指定数据类型resolve(res.data as Data<T>)},fail: (err: UniApp.GeneralCallbackResult) => {reject(err)}})})
}

添加响应拦截

// src/utils/http.ts// .....  接着添加// 2.2 添加类型,支持泛型
const http = <T>(options: UniApp.RequestOptions) => {// 返回 Promise 对象return new Promise<Data<T>>((resolve, reject) => {uni.request({...options,// 2、请求成功success: (res) => {// 2.1 提取核心数据 res.data// 状态码 2xx,axios 就是这样设计的if (res.statusCode >= 200 && res.statusCode < 300) {// 类型断言指定数据类型resolve(res.data as Data<T>)} else if (res.statusCode === 401) {// 401 错误 -> 清理用户信息,跳转登录页const userStore = useUserStore();userStore.clearUserInfo();uni.navigateTo({        // 跳转登录页url: '/pages/login/login'});reject(res);} else {// 其他错误 --> 根据后端错误信息轻提示uni.showToast({title: (res.data as Data<T>).msg || '请求错误',icon: 'none'});reject(res);}},// 响应失败fail: (err: UniApp.GeneralCallbackResult) => {uni.showToast({title:'网络请求错误,请尝试切换网络',icon: 'none'});reject(err)}})})
}

--------------------------------- 持续更新中---------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis主从复制的原理一 之 概述

概述 本文概要性的介绍了Redis主从复制原理&#xff0c;及新旧版本主从复制的区别&#xff0c;优缺点。具体的主从复制过程可详见「Redis主从复制原理二 之 主从复制工作流程」 旧版主从复制的实现 Redis的复制功能分为 同步&#xff08;sync&#xff09;和 命令传播&#xff…

网络原理 4-TCP3

上篇文章&#xff0c;我们讲了TCP协议的连接管理&#xff08;”三次握手“和”四次挥手“的过程&#xff09;。 4、滑动窗口 这个滑动窗口是TCP中非常有特点的机制。我们知道&#xff0c;TCP是通过前面讲的三个机制&#xff1a;确认应答&#xff0c;超时重传&#xff0c;连接…

【使用 Loki + Promtail + Grafana 搭建轻量级容器日志分析平台】

使用 Loki Promtail Grafana 搭建轻量级容器日志分析平台 摘要 本文介绍如何通过 Docker Compose 快速搭建 Loki 日志存储、Promtail 日志采集和 Grafana 日志可视化/告警的完整流程。用最小化示例演示核心配置、常见问题排查和告警规则设置&#xff0c;帮助读者快速上手。…

CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云

目前已有一号通快递查询、阿里云快递查询扩展 扩展入口文件 文件目录 crmeb\services\express\Express.php 默认一号通快递查询 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…

使用 Python 自动化 Word 文档样式复制与内容生成

在办公自动化领域&#xff0c;如何高效地处理 Word 文档的样式和内容复制是一个常见需求。本文将通过一个完整的代码示例&#xff0c;展示如何利用 Python 的 python-docx 库实现 Word 文档样式的深度复制 和 动态内容生成&#xff0c;并结合知识库中的最佳实践优化文档处理流程…

【MATLAB代码】基于MCC(最大相关熵)的EKF,一维滤波,用于解决观测噪声的异常|附完整代码,订阅专栏后可直接查看

本文所述的代码实现了一种基于最大相关熵准则(Maximum Correntropy Criterion, MCC)的鲁棒性卡尔曼滤波算法(MCC-KF),重点解决传统卡尔曼滤波在观测噪声存在异常值时估计精度下降的问题。通过引入高斯核函数对残差进行加权处理,有效降低了异常观测值对状态估计的干扰。订…

46、web实验-遍历数据与页面bug修改

46、web实验-遍历数据与页面bug修改 在Web开发中&#xff0c;遍历数据和修改页面bug是常见的任务。以下是关于这两个主题的讲解&#xff1a; ### 一、遍历数据 **目的**&#xff1a;在页面上动态展示数据&#xff0c;例如用户列表、商品信息等。 **常用方法**&#xff1a; ####…

华为云Flexus+DeepSeek征文|体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的自定义聊天助手

华为云FlexusDeepSeek征文&#xff5c;体验华为云ModelArts快速搭建Dify-LLM应用开发平台并创建自己的自定义聊天助手 什么是华为云ModelArts 华为云ModelArts ModelArts是华为云提供的全流程AI开发平台&#xff0c;覆盖从数据准备到模型部署的全生命周期管理&#xff0c;帮助…

Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token

Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token 目录 Qwen大语言模型里,<CLS>属于特殊的标记:Classification Token功能解析工作机制应用场景举例说明技术要点在自然语言处理(NLP)领域 都是<CLS> + <SEP>吗?一、CLS和SEP的作用与常见用法1. **CLS标…

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…

JAVA毕业设计224—基于Java+Springboot+vue的家政服务系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的家政服务系统(源代码数据库)224 一、系统介绍 本项目前后端分离&#xff0c;分为用户、家政人员、管理员三种角色 1、用户&#xff1a; 登录、注册、轮播…

滴滴 服务端 面经

一、缓存与数据库的使用场景及性能差异 1. 缓存的适用场景 高频读、低频写场景&#xff1a;如商品详情页、用户信息等读多写少的数据&#xff0c;减少数据库压力。实时性要求不高的数据&#xff1a;如首页推荐列表、统计数据&#xff08;非实时更新&#xff09;&#xff0c;允…

linux操作系统---网络协议

目录 案例演练----网络搭建 路由启配置 多个路由情况下如何联通 静态路由 案例演练----网络搭建 Cisco交换机的命令行用户模式1 switch> 特权模式1 switch>enable disable回到用户模式 2 switch#全局配置模式1 switch#config terminal 2 switch(co…

华为OD机试_2025 B卷_计算某个字符出现次数(Python,100分)(附详细解题思路)

文章目录 题目描述字符计数解析&#xff1a;简单高效的统计方法核心解题思路完整代码实现应用场景扩展 题目描述 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出"输入字符串&#xff08;第二行输入的字符&a…

华为仓颉语言初识:并发编程之同步机制(上)

前言 线程同步机制是多线程下解决线程对共享资源竞争的主要方式&#xff0c;华为仓颉语言提供了三种常见的同步机制用来保证线程同步安全&#xff0c;分别是原子操作&#xff0c;互斥锁和条件变量。本篇文章详细介绍主要仓颉语言解决同步机制的方法&#xff0c;建议点赞收藏&a…

树莓派远程登陆RealVNC Viewer出现卡顿

原因是&#xff1a;没有连接显示屏&#xff0c;图像传输会受到限制。 没有显示屏怎么解决&#xff1a; &#x1f4dd; 树莓派5虚拟显示器配置教程&#xff08;强制启用全性能GPU渲染&#xff09; &#x1f527; 步骤1&#xff1a;安装虚拟显示驱动 bash 复制 下载 # 更…

go-zero微服务入门案例

一、go-zero微服务环境安装 1、go-zero脚手架的安装 go install github.com/zeromicro/go-zero/tools/goctllatest2、etcd的安装下载地址根据自己电脑操作系统下载对应的版本&#xff0c;具体的使用自己查阅文章 二、创建一个user-rpc服务 1、定义user.proto文件 syntax &qu…

[BIOS]VSCode zx-6000 编译问题

前提&#xff1a;Python 3.6.6及以上版本安装成功&#xff0c;Python 3.6.6路径加到了环境变量# DEVITS工具包准备好 问题&#xff1a;添加环境变量 1&#xff1a;出现环境变量错误&#xff0c;“py -3” is not installed or added to environment variables #先在C:\Windows里…

【Linux】系统部分——进程控制

11.进程控制 文章目录 11.进程控制一、进程创建二、进程终止退出码进程终止的方式 三、进程等待进程等待的方式获取⼦进程status小程序阻塞与非阻塞等待 四、进程程序替换替换原理进程程序替换的接口——exec替换函数 五、总结 一、进程创建 之前学习了fork()函数创建子进程&a…

【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知识卷积激活函数池化上采样、上池化、反卷积softmax 归一化函数交叉熵损失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper&#xff1a;https://arxiv.org/ab…