新建 uni-app项目
备忘录,记录下创建uni项目步骤
1.安装手动创建 uniapp项目
vue3、vite、ts
npx degit dcloudio/uni-preset-vue#vite-ts my-uni-app
cd 进入项目
2.下载依赖
npm i
或者
pnpm install
3.下@dcloudio/uni-ui
pnpm i @dcloudio/uni-ui
4.下载uni的TS相关的辅助提示包
pnpm i -D @types/wechat-miniprogram @uni-helper/uni-app-types
5. 基本项目创建完成,预览看下效果
pnpm dev:mp-weixin
执行完成以后命令行中会提示,打开微信开发者工具,将项目中的dist\dev\[项目名] 文件导入,完成以上步骤以后可以在微信开发者工具中看到uni 的logo.
6.下载Less
pnpm i less
下载完成后,在项目中测试下,在src下新建common文件夹,继续在common下新建css文件,在css文件中新建global.less全局文件。
然后再less文件中随便写点样式,例如一下示例:
//这些都是less的自定义变量,都在可以全局使用
@data-color-cyan: #70FFE1;
@data-color-green: #00D08F;
@data-color-orange: #FA6400;
@user-state-orange: #FE824C;
@big-size: 30px;
@large-size: 25px;
@default-size: 20px;
@small-size: 15px;
@mini-size: 10px;
.cursor-pointer {
cursor: pointer;
}
然后找到src/pages/index/index.vue文件添加标签和样式,查看页面效果
<template>
<view class="content">
<image class="logo" src="/static/logo.png" />
<view class="text-area">
<text class="title">{{ title }}</text>
</view>
<span class="cursor-pointer">测试</span>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const title = ref('Hello');
</script>
<style lang="less">
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: @data-color-cyan;
}
</style>
在vite.config.ts中添加全局样式
import { defineConfig } from "vite";
import uni from "@dcloudio/vite-plugin-uni";
// https://vitejs.dev/config/
export default defineConfig({
plugins: [uni()],
css: {
// css预处理器
preprocessorOptions: {
less: {
charset: false,
additionalData: '@import "./src/common/css/global.less";',
},
},
},
});
在页面中查看效果,不想用命令行,就下载HBuilder X,然后再HBuilder X里启动项目。
pnpm dev:h5
运行正常,控制台中也可以看到less样式加载正常。
7.配置tsconfig.ts
前面下载了@types/wechat-miniprogram,@uni-helper/uni-app-types两个插件,需要在tsconfig里配置下,要不然不生效。
{
"extends": "@vue/tsconfig/tsconfig.json",
"ignoreDeprecations": "5.0",
"compilerOptions": {
"sourceMap": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
},
"lib": ["esnext", "dom"],
"types": ["@dcloudio/types",
"@types/wechat-miniprogram", // 配置1
"@uni-helper/uni-app-types" // 配置2
]
},
"vueCompilerOptions": {
"nativeTags": ["block", "component", "template", "slot"] // 配置3
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "src/stores/count.ts", "src/request/index.js"]
}
8.pinia下载
pnpm install pinia
下载完成后,在src目录下新建stores文件夹文件夹中新建两个文件,简单写下内容:
1.count.ts
import { defineStore } from 'pinia';
// 定义并导出容器
// 参数1:store id
// 参数2:选项对象
const useCounter = defineStore('count', {
state: () => {
return {
count: 100,
age: 20,
books: ['vue', 'react', 'svelte',121212],
obj:{
"key":111,
"name":"xiaoming",
"color":[11111],
},
}
},
getters: {
// NOTE getters 使用了 this,需要手动声明返回值类型
booksStr(state): string {
console.log(state.books)
return this.books.join('--')
},
},
actions: {
complexChange(step: number) {
this.age += step
this.books.push('solidjs', 'lit')
},
},
});
export default useCounter;
2.index.ts
import { createPinia } from "pinia"; //引入pinia
const stores = createPinia(); //创建pinia实例
export default stores; //导出pinia用于main.js注册
3.引入到main.ts中
import { createApp } from 'vue';
import App from './App.vue';
import stores from './stores'; //引入
const app = createApp(App);
app.use(stores);
app.mount('#app');
然后回到index.vue中测试是否生效
<template>
<view class="content">
<image class="logo" src="/static/logo.png" />
<view class="text-area">
<text class="title">{{ title }}</text>
</view>
<span class="cursor-pointer">测试</span>
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue';
import useCounter from "@/stores/count"; //引入仓库;
import { storeToRefs } from "pinia"; //引入pinia转换
const useCount = useCounter();
const {age,books,booksStr } = storeToRefs(useCount); // 响应式
const title = ref('Hello');
console.log(
age.value,
books.value,
booksStr.value
);
</script>
<style lang="less">
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.logo {
height: 200rpx;
width: 200rpx;
margin-top: 200rpx;
margin-left: auto;
margin-right: auto;
margin-bottom: 50rpx;
}
.text-area {
display: flex;
justify-content: center;
}
.title {
font-size: 36rpx;
color: @data-color-cyan;
}
</style>
在浏览中查看是否打印生效
9.配置接口
关于请求接口的封装从网上一搜一大堆,这里自己就记录下自己从网上找的用的。
在src下新建reques文件,接着新建一下两个文件:
1.api.js
// 全局请求封装
import { BASE_URL } from "@/common/js/config";
// 请求超出时间
const timeout = 5000;
// 需要修改token,和根据实际修改请求头
export default (params) => {
let url = params.url;
let method = params.method || "get";
let data = params.data || {};
let header = {
'Content-Type': 'application/json;charset=UTF-8',
'Authorization': 'Basic c2FiZXI6c2FiZXJfc2VjcmV0',
...params.header
}
if (method == "post") {
header = {
'Content-Type': 'multipart/form-data' // 自定义,跟后台约定好传什么格式的
};
}
return new Promise((resolve, reject) => {
uni.request({
url: BASE_URL + url,
method: method,
header: header,
data: data,
timeout,
success(response) {
const res = response
// 根据返回的状态码做出对应的操作
//获取成功
if (res.statusCode == 200) {
resolve(res.data);
} else {
uni.clearStorageSync()
switch (res.statusCode) {
case 401:
uni.showModal({
title: "提示",
content: "请登录",
showCancel: false,
success() {
// setTimeout(() => {
// uni.navigateTo({
// url: "/pages/login/index",
// })
// }, 1000);
},
});
break;
case 404:
uni.showToast({
title: '请求地址不存在...',
duration: 2000,
})
break;
default:
uni.showToast({
title: '请重试...',
duration: 2000,
})
break;
}
}
},
fail(err) {
console.log(err)
if (err.errMsg.indexOf('request:fail') !== -1) {
uni.showToast({
title: '网络异常',
icon: "error",
duration: 2000
})
} else {
uni.showToast({
title: '服务器错误',
duration: 2000
})
}
reject(err);
},
complete() {
// 不管成功还是失败都会执行
uni.hideLoading();
uni.hideToast();
}
});
}).catch(() => {
});
};
2.index.js
// 引入 request 文件
import request from './index.js';
// 分页查询学习列表
export const pageStudyInfo = (params) => {
return request({
url: '/study/studyInfo/page',
method: 'get',
data: params,
header: {} // 自定义
})
}
// 获取学习列表详细信息
export const studyInfoById = (id) => {
return request({
url: `/study/studyInfo/${id}`,
method: 'get',
})
}
到这里就创建完成。。。。。。好记性真不如烂笔头