• vue3.x+ts项目创建,配置流程


    一、创建项目 、安装组件库

    1、创建vue3.x项目

    npm init vue@latest

    2、项目中安装 element-plus

    1. # NPM
    2. npm install element-plus --save
    3. # Yarn
    4. yarn add element-plus
    5. # pnpm
    6. pnpm install element-plus

    3 、在mian.ts中引入并配置element-plus(完整引入)element-plus连接

    1. import { createApp } from "vue";
    2. import { createPinia } from "pinia";
    3. import ElementPlus from "element-plus";
    4. import "element-plus/dist/index.css";
    5. import App from "./App.vue";
    6. import router from "./router";
    7. import "./assets/main.css";
    8. const app = createApp(App);
    9. app.use(createPinia());
    10. app.use(router);
    11. app.use(ElementPlus);
    12. app.mount("#app");

    5、在组件中直接使用 element组件即可

    1. <template>
    2. <el-row class="mb-4">
    3. <el-button>Defaultel-button>
    4. <el-button type="primary">Primaryel-button>
    5. <el-button type="success">Successel-button>
    6. <el-button type="info">Infoel-button>
    7. <el-button type="warning">Warningel-button>
    8. <el-button type="danger">Dangerel-button>
    9. <el-button>中文el-button>
    10. el-row>
    11. template>
    12. <script lang="ts" setup>
    13. script>

    二、安装自动导入插件

    vue3中使用ref、reactive、生命周期函数等需要手动导入才可以使用,安装插件去做自动导入

    1. import { nextTick, onMounted, reactive, ref } from "vue";
    2. let bool = ref(false)

    1、安装插件unplugin-auto-import

    npm i -D unplugin-auto-import

    2、在vite.config.ts中配置 

    1. import { defineConfig } from "vite";
    2. import vue from "@vitejs/plugin-vue";
    3. import vueJsx from '@vitejs/plugin-vue-jsx';
    4. // 引入自动导入插件
    5. import AutoImport from 'unplugin-auto-import/vite'
    6. // https://vitejs.dev/config/
    7. export default defineConfig({
    8. plugins: [
    9. vue(),
    10. //配置jsx
    11. vueJsx(),
    12. // 配置自动导入,dts配置需要重新运行才可以在src中生成auto-import.d.ts文件
    13. AutoImport({
    14. imports: ['vue'],
    15. dts: 'src/auto-import.d.ts'
    16. })
    17. ],
    18. server: {
    19. host: "0.0.0.0",
    20. port: 8088,
    21. },
    22. });

    注意:配置dts后需要重新运行 npm run dev 才可以生成auto-import.d.ts 文件

    三、安装状态管理pinia,如何创建项目时候选择安装pinia的话可以忽略此步骤

    1、安装pinia

    npm install pinia

    2、main.ts中引用

    1. import { createApp } from "vue";
    2. import { createPinia } from "pinia";
    3. import ElementPlus from "element-plus";
    4. import "element-plus/dist/index.css";
    5. import App from "./App.vue";
    6. import router from "./router";
    7. import "./assets/main.css";
    8. const app = createApp(App);
    9. app.use(createPinia());
    10. app.use(router);
    11. app.use(ElementPlus);
    12. app.mount("#app");

    3、项目src下创建文件stores/counter.ts

    1. import { defineStore } from 'pinia'
    2. //counter 为id
    3. export const useCounterStore = defineStore('counter', {
    4. state: () => ({
    5. counter: 0
    6. }),
    7. getters: {
    8. doubleCount: (state) => state.counter * 2
    9. },
    10. actions: {
    11. increment() {
    12. this.counter++
    13. }
    14. }
    15. })

    或者这样写    name 名称 也是id,是必要的 Pania 使用它来将商店连接到 devtools。将返回的函数命名为use...是可组合项之间的约定,以使其使用习惯。

    1. import { defineStore } from 'pinia'
    2. export const useCounterStore = defineStore({
    3. id: 'counter',
    4. state: () => ({
    5. counter: 0
    6. }),
    7. getters: {
    8. doubleCount: (state) => state.counter * 2
    9. },
    10. actions: {
    11. increment() {
    12. this.counter++
    13. }
    14. }
    15. })

    4、在组件中使用

    1. <template>
    2. <h1 @click="cahnge">{{ useCounter.counter }}h1>
    3. template>
    4. <script lang="ts" setup>
    5. import { useCounterStore } from "../stores/counter"
    6. const useCounter = useCounterStore()
    7. const cahnge = () => {
    8. useCounter.increment()
    9. }
    10. useCounter.$subscribe((args, state) => {
    11. console.log("store", args, state)
    12. })
    13. script>

    5、状态管理做持久化处理,简单的可以直接用locaStorage存储,或者写个插件可以查看之前的一篇文章

    四、安装全局事件发布订阅mitt

    在vue2 中我们可以创建一个新的 const eventbus = new Vue() 实例去做事件广播,但是在vue3.x中不允许我们这样做,我们可以使用插件mitt实现

    1、安装mitt

    npm install mitt -S

    2、在 main.ts 中 全局引用

    1. import { createApp } from 'vue'
    2. import App from './App.vue'
    3. import './assets/css/reset.css'
    4. import mitt from 'mitt'
    5. const Mit = mitt()
    6. const Vue = createApp(App)
    7. // 全局声明 获取mitt所有的类型
    8. declare module 'vue' {
    9.   export interface ComponentCustomProperties {
    10.     $Bus: typeof Mit
    11.   }
    12. }
    13. //全局挂载
    14. Vue.config.globalProperties.$Bus = Mit
    15. Vue.mount('#app')

    3、组件中使用

    A.vue  发布事件

    1. <template>
    2.   <div class="header">
    3.     <button @click="sendEmit">派发事件button>
    4.   div>
    5. template>
    6.  
    7. <script setup lang="ts">
    8. import { getCurrentInstance } from 'vue';
    9.  
    10. let instance = getCurrentInstance()
    11.  
    12. let sendEmit = () => {
    13.   instance?.proxy?.$Bus.emit('on-paifa', 'mitt 全局广播事件')
    14.  
    15. }
    16. script>
    17.  
    18. <style lang="less" scoped>
    19.  
    20. style>

    B.vue 订阅事件

    1. <template>
    2.   <div class="b-div">
    3.     <h1>我是BBBBB组件h1>
    4.     <h5 style="color: #fff;">{{ name }}h5>
    5.   
    6.   div>
    7. template>
    8.  
    9. <script setup lang="ts">
    10. import { getCurrentInstance, inject, Ref, ref } from "vue";
    11.  
    12. let instace = getCurrentInstance()
    13. instace?.proxy?.$Bus.on("on-a", (res: any) => {
    14.   name.value = res
    15.   console.log("res", res)
    16. })
    17. script>
    18.  
    19. <style scoped>
    20.  
    21. style>

    派发多个事件

    1. import { getCurrentInstance } from 'vue';
    2.  
    3.  
    4. let instance = getCurrentInstance()
    5.  
    6. let sendEmit = () => {
    7.   instance?.proxy?.$Bus.emit('on-paifa', 'mitt 全局广播事件')
    8.   instance?.proxy?.$Bus.emit('on-a', 'mitt 全局广播事件AAAA')
    9.  
    10.   instance?.proxy?.$Bus.emit('on-b', 'mitt 全局广播事件BBBB')
    11.  
    12. }

    订阅多个

    1. import { getCurrentInstance } from 'vue';
    2.  
    3.  
    4. let instance = getCurrentInstance()
    5.  
    6. //type 事件名称  res传参
    7.  instance?.proxy?.$Bus.on('*', (type: any, res: any): void => {
    8.   console.log("mitt派发======", type, res)
    9. })

    卸载监听 $Bus.off('事件名称', fun())

    1. let fun = (res: any) => {
    2.   console.log("mitt派发======", res)
    3.   tname.value = res
    4.  
    5. }
    6.  
    7. instace?.proxy?.$Bus.on('on-paifa', fun)
    8.  
    9. setTimeout(() => {
    10.   // 卸载监听
    11.  instace?.proxy?.$Bus.off('on-paifa', fun)
    12. }, 2000)

    卸载全部监听

    1. // 卸载全部监听
    2. instace?.proxy?.$Bus.all.clear()

     全局挂载方法

    Vue.config.globalProperties.$Bus = Mit

    获取全局方法(多种)

    具体可以参考这篇博客

    五、路由方面:路由全局守卫、动态路由等

    项目中使用vue-router@4.x 可以参考之前写的文档

    1、router跳转传参/嵌套路由/路由重定向/别名https://blog.csdn.net/csl125/article/details/125862159?spm=1001.2014.3001.5501

    2、前置守卫、后置守卫、路由元信息、过渡动效、滚动行为https://blog.csdn.net/csl125/article/details/125958252?spm=1001.2014.3001.5501

    3、 动态路由https://blog.csdn.net/csl125/article/details/125960809?spm=1001.2014.3001.5501

  • 相关阅读:
    MySQL主从复制原理和使用
    分享一种非隔离控制三象限双向可控硅的产品级电路
    js ---- 高级
    深入理解Python协程:从基础到实战
    QT 使用mysql
    一个开源且全面的C#算法实战教程
    The Kernel Symbol Table
    深入解析具名导入es6规范中的具名导入是在做解构吗
    Windows平台下私有云盘搭建
    必备基础算法
  • 原文地址:https://blog.csdn.net/csl125/article/details/126000350