vue3+vite+pinia项目搭建完整示例

一、创建项目

根据不同的npm版本,选择不同的命令执行,即可创建项目,创建成功后切换到项目目录下,加载依赖并运行项目即可。

# npm 6.x
npm create vite@latest my-vue-app --template vue

# npm 7+, extra double-dash is needed:
npm create vite@latest my-vue-app -- --template vue

# yarn
yarn create vite my-vue-app --template vue

# pnpm
pnpm create vite my-vue-app --template vue

 二、安装路由

1、执行以下命令加载路由模块;

npm install vue-router@4

2、在src目录下创建roter目录,并在router目录中创建index.js文件,在src目录下创建views目录,并创建a.vue、b.vue两个示例文件,项目结构如下图

 3、roter/index.js文件配置如下:

import { createRouter, createWebHistory } from 'vue-router'
const routes = [
    {
        path: "/",
        name: "a",
        component: () => import("../views/a.vue"),
    },
    {
        path: "/b",
        name: "b",
        component: () => import("../views/b.vue"),
    },
]
const router = createRouter({
        history: createWebHistory(),
        routes
    })

export default router

4、在main.js中引入路由文件:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'

//注意use要在mount之前
createApp(App).use(router).mount('#app')

 5、在App.vue中配置<router-view />

6、运行项目,即可实现简单的路由切换,后续可自由配置

三、状态管理工具pinia
1、安装pinia

npm install pinia

 2、在main.js文件里引入pinia,引入后,通过createPinia( )方法,得到pinia的实例,然后将pinia挂载到Vue根实例上

import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
import { createPinia } from 'pinia'

//注意use要在mount之前
const app = createApp(App)
const pinia = createPinia()
app.use(router).use(pinia).mount('#app')

3、创建store状态管理库:在src目录下,创建store目录,并在store目录中创建index.js文件

import { defineStore} from 'pinia'

export const mainStore = defineStore('main',{
  state:()=>{
    return {
        helloPinia:'Hello Pinia!'
    }
  },
  getters:{},
  actions:{}
})
/*
    defineStore( ) 方法的第一个参数:相当于为容器起一个名字。注意:这里的名字必须唯一,不能重复。
    defineStore( ) 方法的第二个参数:可以简单理解为一个配置对象,里边是对容器仓库的配置说明。当然这种说明是以对象的形式。
    state 属性: 用来存储全局的状态的,这里边定义的,就可以是为SPA里全局的状态了。
    getters属性: 用来监视或者说是计算状态的变化的,有缓存的功能。
    actions属性: 对state里数据变化的业务逻辑,需求不同,编写逻辑不同。说白了就是修改state全局状态数据的。
*/

4、在b.vue中引用即可

  <template>
     <div>
        <h2 class="">{{ store.helloPinia}}</h2>
    </div>
  </template>
  <script setup>
  import { mainStore } from "../store/index"
  const store = mainStore()
  </script>

 5、启动项目,切换至b.vue页面时即可显示Hello Pinia!

 四、pinia实现父子、兄弟组件之间传值

1、按下图创建对应的目录及文件

2、index.vue文件

<template>
    <div>
        <button @click="addNumber(1)">数量加</button>
        <button @click="addNumber(-1)">数量减</button>
        <Footer />
    </div>
</template>
<script setup>
import useIndexStore from './store'
import Footer from './components/footer.vue'
const indexStore = useIndexStore()
const {
    addNumber
} = indexStore
</script>

3、index.js文件

import { defineStore } from "pinia"
import { shallowReactive } from "vue"

const useIndexStore = defineStore('indexStore', () => {

    const initIndexData = () => ({
        number:0
    })
    const indexData = shallowReactive(initIndexData())

    function addNumber(e) {
        indexData.number += e
    }

    return {
        indexData,
        addNumber
    }
})

export default useIndexStore

4、footer.vue文件

<template>
    <div>
        <h1>{{indexData.number}}</h1>
    </div>
</template>
<script setup>
import useIndexStore from '../store'
const indexStore = useIndexStore()
const {
    indexData
} = indexStore
</script>

5、更新路由文件

import { createRouter, createWebHistory } from 'vue-router'
const routes = [
    {
        path: "/",
        name: "a",
        component: () => import("../views/a.vue")
    },
    {
        path: "/b",
        name: "b",
        component: () => import("../views/b.vue")
    },
    {
        path: "/index",
        name: "index",
        component: () => import("../views/index/index.vue")
    }
]
const router = createRouter({
        history: createWebHistory(),
        routes
    })

export default router

6、更新a页面代码

<template>
  <div>
    <button @click="addNumber">A+</button>
    <hr>
    <router-link to="/b">b</router-link>
    <hr>
    <router-link to="/index">index</router-link>
  </div>
</template>
<script setup>
  import { mainStore } from "../store/index"
  const store = mainStore()
  function addNumber(){
    store.number++
  }
</script>
<style scoped>

</style>

7、启动项目,从A页面跳转到index页面后,点击数量加减,即可看到其子组件中的数据同步更改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值