Vue3+TypeScript+Vuetify3+Pinia实例

Vue3+TypeScript+Vuetify3+Pinia实例

Vue3+TypeScript+Vuetify3+Pinia实例

使用Vite创建一个项目

yarn create vite
  • 输入项目名称
  • 选择框架vue
  • 选择TypeScript
  • 进入项目,安装依赖

安装Vuetify3

在项目根目录下面,执行:

vue add vuetify

选择预设→Vuetify 3 – Vite (preview)

解决main.ts 引入./App.vue爆红提示

vite-env.d.ts中添加一下代码。

declare module "*.vue" {
  import { DefineComponent } from "vue"
  const component: DefineComponent<{}, {}, any>
  export default component
}

在这段代码中,我们使用了TypeScript中的declare module语法,它允许我们在模块中声明全局变量、函数、类型等信息。在这里,我们声明了一个.vue文件的模块,并指定了它的默认导出类型为Vue组件(DefineComponent)。

安装Vue-Router

yarn add vue-router
  • 在 src/views/ 中创建 Home.vue:
<template>
  <HelloWorld />
</template>
<script lang="ts" setup>

import HelloWorld from "../components/HelloWorld.vue";
</script>
  • 创建src/router/index.ts
import { createRouter, createWebHistory } from 'vue-router'
import type { RouteRecordRaw } from 'vue-router'
const routes: Array<RouteRecordRaw> = [
    {
        path:"/",
        name:"Home",
        component() => import("../views/Home.vue"),
    }
];

const router = createRouter({
    history: createWebHistory(),
    routes,
});

export default router;
  • 将路由文件添加到main.ts中
import { createApp } from 'vue'
import App from './App.vue'
import vuetify from './plugins/vuetify'
import router from "./router";
import { loadFonts } from './plugins/webfontloader'


loadFonts()

createApp(App)
  .use(vuetify)
  .use(router)
  .mount('#app')

  • 修改 App.vue
<template>
  <v-app>
    <v-main>
      <router-view />
    </v-main>
  </v-app>
</template>

<script lang="ts" setup>

</script>

安装Pinia

yarn add pinia
  • pinia 添加到 main.ts
import { createApp } from 'vue'
import { createPinia } from "pinia";
import App from './App.vue'
import vuetify from './plugins/vuetify'
import router from "./router";
import { loadFonts } from './plugins/webfontloader'


loadFonts()

createApp(App)
  .use(createPinia())
  .use(vuetify)
  .use(router)
  .mount('#app')
  • 创建 src/store/counter.ts
import {defineStore} from "pinia";

export const useCounterStore = defineStore("counter",{
    state() => ({ count0 }),
    getters: {
        double(state) => state.count * 2,
    },
    actions: {
        increment() {
            this.count++
        },
    },
})

  • 使创建的计数器在 HelloWorld.vue 中可用
<template>
  <v-container>
    <p>counter:{{counter.count}}</p>
    <p>doubleCounter:{{counter.double}}</p>
    <v-btn @click="counter.increment()">+1</v-btn>
  </v-container>
</template>

<script setup lang='ts'>

import {useCounterStore} from "../store/counter.ts";

const counter = useCounterStore()
console.log(counter)
</script>

Pinia 数据持久化

yarn add pinia-plugin-persistedstate
  • 创建 src/store/index.ts
import {createPinia} from "pinia";
import piniaPluginPersistedstate from "pinia-plugin-persistedstate";

const pinia = createPinia()

pinia.use(piniaPluginPersistedstate)

export default pinia

  • 重写main.ts
import { createApp } from 'vue'
// import { createPinia } from "pinia";
import store from './store/index.js'
import App from './App.vue'
import vuetify from './plugins/vuetify'
import router from "./router";
import { loadFonts } from './plugins/webfontloader'

// const pinia = createPinia();
loadFonts()

createApp(App)
  // .use(createPinia())
   .use(store)
  .use(vuetify)
  .use(router)
  .mount('#app')

这样即使在页面转换和重新加载后,数据现在也会保留。




原文始发于微信公众号(大前端编程教学):Vue3+TypeScript+Vuetify3+Pinia实例

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/224156.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!