# zfshop
**Repository Path**: nbaok/zfshop
## Basic Information
- **Project Name**: zfshop
- **Description**: Vue 3 + TypeScript + Vite + Vant4 构建的移动端商城项目
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: pc_dev_241008
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2024-10-08
- **Last Updated**: 2025-05-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Vue 3 + TypeScript + Vite
This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 `
```
## 重置全局样式
在 `src/assets` 目录下创建 `styles` 文件夹,创建三个文件: 重置样式: `reset.scss` , 样式变量: `variable.scss`, 全局样式: `index.scss`, 例如在全局样式中我们可以修改 elementPlus 设置的滚动条样式. 并在 `main.ts` 文件中引入全局样式.
```javascript
// vite.config.ts
export default defineConfig({
// ...
css: {
// ...
preprocessorOptions: {
scss: {
javascriptEnabled: true,
additionalData: '@import "./src/assets/styles/variable.scss";',
},
},
},
})
// main.ts
import '@/styles/index.scss'
```
```scss
// styles/variable.scss
// 定义的样式全局变量
$base_menu_bgcolor: #001529;
// styles/index.scss
// 自定义滚动条外观,可以直接引用样式全局变量
::-webkit-scrollbar {
width: 10px;
}
::-webkit-scrollbar-track {
background-color: $base_menu_bgcolor;
}
::-webkit-scrollbar-thumb {
width: 10px;
background-color: aqua;
border-radius: 10px;
}
```
## 自动引入全局组件
在 `src/components`目录下新建 `index.ts`文件
```javascript
// 自动注册全局组件
const modules = import.meta.glob('../components/**/index.vue', {
eager: false,
import: 'default'
})
const allGlobalComponet: any = {}
Object.entries(modules).map(([filename, component]: [any, any]) => {
filename = filename.replace('./', '').replace('/index.vue', '').split('/')
filename = filename[filename.length - 1]
allGlobalComponet[filename] = component
})
export default {
install(app: any) {
Object.keys(allGlobalComponet).forEach(key => {
app.component(key, allGlobalComponet[key])
})
}
}
```
入口文件中用 **app.use** 时,会自动调用模块的 **install** 方法并注入根组件 **app**
```javascript
...
import globalComponent from '@/components'
app.use(globalComponent)
```
## Vue3 封装组件方式一
在 `components`文件夹下对应创建组件(.vue)及脚本(.ts),例如:
```javascript
// components/Toast/Tost.vue (正常创建Vue3组件)
...
// components/Toast/index.ts
// 导入创建的 Vue3 组件
import Toast from './Toast.vue'
import { createVNode, render } from 'vue'
// @params title 组件需要接收的参数
export default function $toast(title) {
// 创建虚拟 DOM 对象, 并传入组件需要的参数
let vnode = createVNode(Toast, { title })
// 虚拟 DOM 渲染为真实 DOM
// let frag = document.createDocumentFragment()
let Divbox = document.createElement('div')
render(vnode, Divbox)
// 插入到 body 中
document.body.appendChild(Divbox)
}
export default function $toast(title) {
if(Divbox) {
}
}
```
> 调用: 直接导入方法调用即可
## Pinia持久化存储
> [参考CSDN](https://blog.csdn.net/H524268015wsw/article/details/134571995)
(1)安装依赖
```sh
pnpm install -D pinia-plugin-persistedstate
```
(2)将插件添加到 pinia 实例上
```javascript
import { createPinia } from 'pinia' //引入pinia
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' //引入持久化插件
const pinia = createPinia() //创建pinia实例
pinia.use(piniaPluginPersistedstate) //将插件添加到 pinia 实例上
export default pinia //导出pinia用于main.js注册
```
(3)用法
1.基本使用
创建 Store 时,将 persist 选项设置为 true,整个 Store 将使用默认持久化配置保存。
```javascript
const useUserInfoStore = defineStore('userInfo', {
...
persist: true,
})
```
2.高级使用
```javascript
const useUserInfoStore = defineStore('userInfo', {
...
persist: {
key: 'piniaStore', //存储名称
storage: sessionStorage, // 存储方式
paths: ['username', ...], //指定 state 中哪些数据需要被持久化。[] 表示不持久化任何状态,undefined 或 null 表示持久化整个 state
},
})
```
## TS 装饰器配置问题
> SyntaxError: Invalid or unexpected token (at useLocalStorage.ts:43:3)
```javascript
// tsconfig.app.json 添加以下配置重启服务后解决
{
"compilerOptions": {
// ...
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
}
}
```