vue项目个人配置
src/assets/base.css
:root {
--html-bg-color: #ffffff;
}
html.dark {
--html-bg-color: #242424;
}
src/assets/reset.css
/**
* Eric Meyer's Reset CSS v2.0 (http://meyerweb.com/eric/tools/css/reset/)
* http://cssreset.com
*/
html, body, div, span, applet, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, u, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td,
article, aside, canvas, details, embed,
figure, figcaption, footer, header, hgroup,
menu, nav, output, ruby, section, summary,
time, mark, audio, video{
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
font-weight: normal;
vertical-align: baseline;
}
/* HTML5 display-role reset for older browsers */
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section{
display: block;
}
ol, ul, li{
list-style: none;
}
blockquote, q{
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after{
content: '';
content: none;
}
table{
border-collapse: collapse;
border-spacing: 0;
}
/* custom */
a{
color: #7e8c8d;
text-decoration: none;
-webkit-backface-visibility: hidden;
}
::-webkit-scrollbar{
width: 5px;
height: 5px;
}
::-webkit-scrollbar-track-piece{
background-color: rgba(0, 0, 0, 0.2);
-webkit-border-radius: 6px;
}
::-webkit-scrollbar-thumb:vertical{
height: 5px;
background-color: rgba(125, 125, 125, 0.7);
-webkit-border-radius: 6px;
}
::-webkit-scrollbar-thumb:horizontal{
width: 5px;
background-color: rgba(125, 125, 125, 0.7);
-webkit-border-radius: 6px;
}
html, body{
width: 100%;
font-family: 'Microsoft YaHei';
}
body{
line-height: 1;
-webkit-text-size-adjust: none;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
html{
overflow-y: scroll;
}
hr {
width: 100%;
margin: 2px 0;
}
/*清除浮动*/
.clearfix:before,
.clearfix:after{
content: " ";
display: inline-block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix{
*zoom: 1;
}
/*隐藏*/
.dn{
display: none;
}
src/router/index.ts
import { createRouter, createWebHistory } from "vue-router";
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: "/",
name: "home",
component: () => import("@/views/home.vue"),
children: []
}
],
});
export default router;
src/stores/index.ts
import { defineStore } from 'pinia'
export const useStore = defineStore('store', {
state: () => {
return {
x: 0
}
},
getters: {
double_x(): Number {
return this.x
}
},
actions: {
increment() {
this.x ++
}
}
})
src/views/home.view
<template>
<div class="container">
</div>
</template>
<script setup lang="ts">
</script>
<style lang="scss" scoped>
.container {
height: 100%;
display: flex;
}
</style>
src/App.vue
<template>
<RouterView></RouterView>
</template>
<script setup lang="ts">
import { RouterView } from "vue-router";
</script>
<style>
html, body, #app {
height: 100%;
}
#app {
background-color: var(--html-bg-color);
}
</style>
src/main.ts
import { createApp, toRaw } from "vue";
import { createPinia, type PiniaPluginContext } from "pinia";
import App from "./App.vue";
import router from "./router";
const app = createApp(App);
// global css
import "@/assets/reset.css";
import "@/assets/base.css";
// pinia
const __piniaKey = '__PINIAKEY__'
type Options = {
key?: string
}
const setStorage = (key: string, value: any): void => {
localStorage.setItem(key, JSON.stringify(value))
}
const getStorage = (key: string) => {
return (localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key) as string) : {})
}
const piniaPlugin = (options: Options) => {
return (context: PiniaPluginContext) => {
const { store } = context;
const data = getStorage(`${options?.key ?? __piniaKey}-${store.$id}`)
store.$subscribe(() => {
setStorage(`${options?.key ?? __piniaKey}-${store.$id}`, toRaw(store.$state));
})
return {
...data
}
}
}
const store = createPinia()
store.use(piniaPlugin({
key: 'pinia'
}))
app.use(store);
app.use(router);
app.mount("#app");

浙公网安备 33010602011771号