HBuilderx 创建
命令创建项目
npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project
pnpm install
pnpm run dev:mp-weixin
dist/dev/mp-weixin
VSCode 开发uni-app项目
uni-create-view
uni-helper
uniapp小程序扩展
pnpm i -D @types/wechat-miniprogram @uni-helper/uni-app-types
"compilerOptions": {
"types": ["@types/wechat-miniprogram", "@uni-helper/uni-app-types"]
}
"vueCompilerOptions": {
"experimentalRuntimeMode": "runtime-uni-app"
}
uni-ui 组件库
pnpm i @dcloudio/uni-ui
{
"easycom": {
"autoscan": true,
"custom": {
"^uni-(.*)": "@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue"
}
},
pages:[
]
}
pnpm i -D @uni-helper/uni-ui-types
"compilerOptions": {
"types": ["@uni-helper/uni-ui-types"]
}
使用pinia
npm install pinia
const pinia = createPinia()
app.use(pinia)
import { defineStore } from 'pinia'
export const counterStore = defineStore('counter', {
state: () => ({
count: 0
}),
getters: {},
actions: {
increment() {
this.count++
}
}
})
import { useStore } from '@/store/counter.js'
import {storeToRefs} from 'pinia'
const store = useStore()
const {count, increment} = storeToRefs(store);
npm i pinia-plugin-persistedstate
import { createPinia } from 'pinia';
import persist from 'pinia-plugin-persistedstate';
const pinia = createPinia();
pinia.use(persist);
app.use(pinia);
export const useMemberStore = defineStore(
'counter',
() => {
},
{
persist: {
storage: {
setItem(key, value) {
uni.setStorageSync(key, value)
},
getItem(key) {
return uni.getStorageSync(key)
},
},
},
},
)
请求
import '@/utils/http.ts';
const getData = () => {
uni.request({
method: 'GET',
url: '/home/banner',
success: (res) => {
console.log(res.data)
},
fail: (err) => {
console.error(err)
}
})
}
const baseURL = 'https://api.example.com';
const httpInterceptor = {
invoked(options:UniApp.RequestOptions) {
if(!options.url.startsWith('http')){
options.url = baseURL + options.url;
}
options.timeout = 10000;
options.header = {
...options.header,
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + 'token'
}
}
};
uni.addInterceptor('request',httpInterceptor);
uni.addInterceptor('uploadFile',httpInterceptor);
interface Data<T> {
code:string,
msg:string,
result:T
}
export const http = <T>(options: UniApp.RequestOptions) => {
return new Promise<Data<T>>((resolve,reject)=>{
uni.request({
...options,
success: (res) => {
if(res.statusCode >= 200 && res.statusCode < 300){
resolve(res.data as Data<T>);
}else if(res.statusCode === 401){
reject(res);
}else{
uni.showToast({
title: (res.data as Data<T>).msg || '请求错误',
icon: 'none'
});
reject(res);
}
},
fail: (err) => {
uni.showToast({
title: '网络错误,请稍后再试',
icon: 'none'
});
reject(err);
}
})
})
}
import { http } from '@/utils/http.ts';
const getData = async () => {
const res = await http<string[]>({
url: '/home/banner',
method: 'GET',
})
console.log(res)
}
组件自动导入
"easycom": {
"autoscan": true,
"custom": {
...
"Xtx(.*)":"@/components/Xtx$1.vue"
}
},
XtxButton.vue
XtxButtonGroup.vue
路由
pnpm i -S vue-router@4
import XtxSwiper form './XtxSwiper.vue';
declare module '@vue/runtime-core' {
export interface GlobalComponents {
XtxSwiper: typeof XtxSwiper
}
}