《程序猿学会 Vue · 基础与实战篇》

news2024/11/15 8:21:11

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 写在前面的话
    • Vue 统括
      • 技术简介
      • 掌握哪些
    • Vue 项目搭建
      • 前言说明
      • 注意事项
      • 三种方式
    • Vue 基础用法
      • 项目结构
      • 示例代码
      • 模块化编程
    • Vue 实战练手
      • 整合 Axios
      • 整合 ElementUI
      • 整合 Pinia
    • 总结陈词

CSDN.gif

写在前面的话

目前大部分软件公司虽然采用前后端分离架构,但领导层为了实现降本增效的最终愿景,后端程序猿往往也被要求往全栈工程师发展。
这就使得 Java 程序猿也必须要掌握前端技术栈,这边就结合笔者的理解,谈一下具体需要掌握哪些?
这个问题其实还是要看所在公司当前采用哪些技术栈,以博主所在公司为例,后端开发前端也需要会,起码必须掌握 JavaScript、Vue、Nuxt、NodeJS 等,可以完成除复杂样式外的普通前端页面的开发。这就是所谓的后端是你、前端也是你
基于此背景,决定继续开设若干博文专栏,方便职场新人快速上手前端相关技术栈,先以最常用的 Vue 开篇,让我们开始!

Tips:各位看官,觉得内容还可以的话,点个关注不迷路,下次更新会及时收到推送哦。


Vue 统括

技术简介

Vue 的概述

Tips:简介建议直接看Vue3官网,这里的最详细。

Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。
与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
总结一下,Vue 是一款前端渐进式框架,可以提高前端开发效率。

Vue 的特点
1、Vue 通过MVVM模式,能够实现视图与模型的双向绑定。
2、简单来说,就是数据变化的时候,页面会自动刷新,页面变化的时候,数据也会自动变化。
3、Vue 不支持 IE8 及以下版本,因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性。但它支持所有兼容 ECMAScript 5 的浏览器。

Vue 的示例

import { createApp, ref } from 'vue'

createApp({
  setup() {
    return {
      count: ref(0)
    }
  }
}).mount('#app')

<div id="app">
  <button @click="count++">
    Count is: {{ count }}
  </button>
</div>

Tips:点评一下,就是可以快速把JS的属性与页面元素双向绑定。

Vue 的版本
Vue 有两个大版本,Vue2 和 Vue3,企业开发中,老项目一般采用 Vue2,新项目采用 Vue。
学习应该以 Vue3为主,因为 Vue3 涵盖了 Vue2 的知识体系,同时增加了很多新特性。
Vue 2 已于 2023 年 12 月 31 日达到终止支持时间,参考Vue 2 已经到达终止支持 (EOL) 时间。

Tips:建议学 Vue3,没什么好说的。

选项式&组合式
Vue3 新增了 setup 模式的组合式API,官方也推荐这个模式。
其实两者都可以,不用过分纠结,对于从 Vue2 转过来的开发人员,可能更习惯选项式。
不过,两种方式都应该了解一下,不然阅读到相关代码,无法理解。


掌握哪些

背景:近些年,前端技术栈正在发生翻天覆地的变化,其技术变革换代的频率已不低于后端,各类前端技术日新月异、层出不穷,发展石头如雨后春笋般。从一开始的Html + Css + JavaScript,到玩转jQuery者得天下,到后面的Vue、Angular、React三足鼎立,再到后来NodeJS横空出世,带出了大前端的概念,Express、Vite、Nuxt等前端框架相继抢占一席之地。

先谈一下为什么要学 Vue?
1、Vue是目前前端最火的框架之一,也可以去掉之一;
2、Vue是目前企业前端技术栈要求的知识点,大部分公司使用 Vue 和 React 前端技术栈居多;
3、Vue可以提升前端开发体验,学习难度较低;
4、。。。
因此,Vue 是首要需要学习的,后端人员也是优先学它就对了。

后端学前端,需要学到什么程度?
如果您对前端感兴趣,或负责前端框架搭建,那应该深入的学,那没什么好说的。不过,如果只是后端程序猿要快速上手前端开发能力。
那建议如下:

  • Html + Css + JavaScript,这三个技术要有一个基本了解,入个门;
  • Vue 基础用法掌握,包括 Vue 全家桶的常用组件/插件,特别是UI组件库、远程调用库;
  • 公司搭建的前端框架,比如 Nuxt 等,需要了解框架目录和开发规约;
  • 具备程序猿生存必备的 CV 能力,可以拷贝它人代码进行二开;

Vue 有哪些内容需要掌握的?
Vue 是一个生态,包含很多内容,关联的知识也很多,比如 npm、vuecli、router、vuex、pinia、axios、vite、nuxt 等各式各样,学习 Vue 首先要掌握 Vue 的基础用法,然后熟悉 Vue 搭建的项目,然后尝试去整合各种组件,进而再熟悉其他框架。
学习方式是建议,先创建 Vue 的 Demo 项目,然后在上面自己尝试 Vue 的基础语法,然后各种体验。


Vue 项目搭建

image.png

前言说明

Vue3 使用通常有两个方式:
1、html 页面直接通过CDN方式引入vue.js,直接就可以在当前页面直接开始使用;
2、基于npm命令行,创建一个Vue3项目,可以持续添加各类功能;
如果目的是系统性的学习Vue3,建议通过创建项目的方式,可以掌握更多用法,毕竟目前企业开始基本都是前后端分离模式开发,前端单独采用Vue的框架,很少单纯仅在页面层面引入vue

注意事项

既然确定用npm方式,那要注意一下,Node 和 Npm 操作过程,经常会遇到各种坑爹的问题,比如:依赖下载不到、运行报错等等,层出不穷,有时候真会把人搞奔溃,这边总结一下几个经验,可以少走一些弯路。
1、Node版本尽量高一些,建议安装 18.3 或更高版本的 Node.js,可以用 NVM 等工具管理 Node 版本,这样新老项目需要不同依赖,可以快速切换。
image.png
2、设置一下淘宝镜像,如果公司有自己的镜像仓库,可以按需切换。

npm config set registry https://registry.npmmirror.com

3、下载依赖如果失败,可以按下面步骤来一下。

1、删除:node_modules 和 package-lock.json
2、执行:npm cache clean --force
3、下载:npm install

4、建议命令行所有操作,都在管理员模式下进行!

三种方式

【使用 create-vue 创建】
官网推荐创建工程的方式,输入指令后按步骤进行即可,详见官网
npm create vue@latest
image.png

【使用 vue-cli 创建】
Vue Cli是 Vue.js 开发的标准工具,是一个基于 Vue.js 进行快速开发的完整系统。

## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
vue --version

## 安装或者升级你的@vue/cli
npm install -g @vue/cli

## 创建项目,项目名称不要有大写
vue create vue_demo

## 进入工程目录
cd vue_demo

## 运行
npm run serve

【使用 vite 创建】

## 创建工程
npm init vite-app vite_demo

## 进入工程目录
cd vite_demo

## 安装依赖
npm install

## 运行
npm run dev

【总结陈词】
不管哪种方式,能创建出初始Demo项目即可,不用特别在意。
后续如何使用和开展Vue3的运用才是更关键的。

Tips:Vue3 无法 debugger 的问题处理


Vue 基础用法

Tips:基础语法官网之类的,比如模板语法、列表渲染、组件通信等,相关资料已经很多了,这边篇幅所限,不展开赘述。
Tips:建议按上述方式搭建完项目后,参考官网去尝试各种用法,很容易上手。

项目结构

Tips:这部分基于 vue-cli 创建的 Vue3 项目介绍,其他框架大同小异。

image.png
如图所示,VueCli创建的项目,目录说明如下:

  • node_modules目录:用来存放当前项目中使用的 js 依赖,类似于 Maven 的本地 jar 仓库
  • public:静态资源目录,包含主页入口,图标等
  • src:开发主要关注的内容,assets是静态资源、components是组件,main.js是主页入口,App是主组件
  • vue.config.js:Vue CLI配置文件(可选)
  • package.json:项目依赖配置,类似 Maven 的 pom.xml

实际开发中,主要关注 src 和 package.json即可,其他短期内暂时不需要关注。

示例代码

【main.js】
直接看示例代码,就是用来整合一大堆功能的,对标 SpringBoot,有点类似 application.yml 或者 AutoConfiguration 类。
细的就不展开介绍了,下面Vue实战练手有具体整合说明。

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

const app = createApp(App)

// 引入 Axios
import axios from './axios';

// 引入 ElementPlus
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'

// 引入 Pinia
import {createPinia} from 'pinia'

// 创建 Pinia 实例,即状态管理库store
const pinia = createPinia()

// 为 Pinia 实例添加持久化插件
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

// storage 配置选项接受一个字符串,可以是 'local'(默认值,代表 localStorage)或 'session'(代表 sessionStorage)。
pinia.use(piniaPluginPersistedstate, {
    storage: 'local',
});

// 注册 ElementPlus
app.use(ElementPlus);

// 注册 Pinia 实例
app.use(pinia);

// 全局挂载 axios 实例
app.config.globalProperties.$axios = axios;

// 挂载 app
app.mount('#app');

【App.vue】
主组件,Vue 所谓单页应用,内容都是从此处展开。
没什么特别要介绍的,学习的时候,可以参考下面代码,把不同知识放在不同组件中,分门别类,比较清晰。

<template>
  <img alt="Vue logo" style="width: 120px;height: 120px;" src="./assets/logo.png">

  <HelloWorld msg="Welcome to Your Vue.js App"/>

  <div>
    <button @click="currentComponent = 'Demo1'">ElementUI测试</button>
    <button @click="currentComponent = 'Demo2'">模块化测试</button>
    <button @click="currentComponent = 'Demo3'">pinia测试</button>
    <button @click="currentComponent = 'Demo4'">setup写法</button>
  </div>

  <component :is="currentComponent"></component>

</template>

<script>
import HelloWorld from './components/HelloWorld.vue'
import Demo1 from './components/Demo1.vue';
import Demo2 from './components/Demo2.vue';
import Demo3 from './components/Demo3.vue';
import Demo4 from './components/Demo4.vue';

export default {
  name: 'App',
  components: {
    HelloWorld,
    Demo1,
    Demo2,
    Demo3,
    Demo4,
  },
  data() {
    return {
      currentComponent: 'Demo1',
    };
  },
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

【Demo1.vue】
随便整一个示例,主要看清楚基础用法,可以基于这个页面,去把 Vue 基础语法都尝试一下。

<template>
  <div>
    <h2>ElementUI测试</h2>
    <p>{{ myData }}</p>
    <p>{{ count }}</p>
    <button @click="increment">increment</button>
    <button @click="decrement">decrement</button>
    <el-select v-model="selected" placeholder="请选择">
      <el-option label="选项1" value="1"></el-option>
      <el-option label="选项2" value="2"></el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  name: 'Demo1',
  data() {
    return {
      selected: null,
      myData: '',
      count: 0,
    };
  },
  mounted() {
    let that = this
    console.log('Component is mounted!');
    this.$axios.get('/api/hello')
        .then(function (response) {
          that.myData = response.data
          console.log(response.data);
        })
        .catch(function (error) {
          console.log(error);
        });
  },
  methods: {
    increment() {
      this.count++;
    },
    decrement() {
      this.count--;
    },
  }
};
</script>

这是选项式API,如果要对照的组合式API,参考下面版本。

<template>
  <div>
    <h2>组合式API测试(逻辑同Demo1)</h2>
    <p>{{ myData }}</p>
    <p>{{ count }}</p>
    <button @click="increment">increment</button>
    <button @click="decrement">decrement</button>
  </div>
</template>

<script>
import {onMounted, ref} from 'vue';
import axios from '@/axios';

export default {

  setup() {

    // 定义响应式数据
    const count = ref(0);

    // 定义响应式数据
    const myData = ref(null);

    // 使用onMounted生命周期钩子
    onMounted(() => {

      // 这里可以执行代码,此时组件已经挂载
      console.log('Component is mounted!');

      axios.get('/api/sleep')
          .then(function (response) {
            myData.value = response.data
            console.log(response.data);
          })
          .catch(function (error) {
            console.log(error);
          });
    });

    // 定义一个方法
    const increment = () => {
      count.value++;
    };

    // 可以定义更多方法
    const decrement = () => {
      count.value--;
    };

    // 返回响应式数据以便在模板中使用
    return {
      myData, count, increment, decrement
    };
  }
};
</script>

模块化编程

Vue 开发中,经常会遇到 import、export,也会遇到 requrie,这些就涉及到背后的模块化编程,这个也可以单独拉一个博客介绍。
这里先简单列举一下示例,方便参考练手。

/**
 * myModule.js
 * 将多个变量或函数分别导出
 */

let title = "战神刘玉栋"

let getPhone = () => "18650121777"

export { title, getPhone }

/**
 * myModuleDefault.js
 * 将一个对象作为整体导出
 */

let title = "战神刘玉栋"

let getPhone = () => "18650121777"

export default { title, getPhone }

/**
 * xxx.vue
 * 观察下面几种导入方式,程序猿应该都懂
 */
import * as myModuleAs from '../module/myModule.js'
import {getPhone, title as webTitle} from '../module/myModule.js'
import myModuleDefault from '../module/myModuleDefault.js'

Tips:好吧,可能确实不够详细,这部分内容也是体系化的,后面单独介绍。


Vue 实战练手

Tips:这部分基于 vue-cli 创建的 Vue3 项目介绍,其他框架大同小异。

整合 Axios

【技术简介】
Axios 是基于 Promise 的网络请求库, 它可以发送http请求并接收服务器返回的响应数据。
Axios 返回的是一个 Promise 对象。
Axios 不仅可以用于浏览器,也可以用于 Node.js,而 Fetch 主要用于浏览器。

Tips:早期的前端开发,可以理解为增强版的Ajax。

【补充说明】
Axios 是前端与后端交互的桥梁,前端框架搭建的时候,也会注重 Axios 的封装,例如前置拦截器、响应拦截器、超时设定等,因此,这项技术还是非常重要的,后面单独开一篇介绍Axios,这边简单介绍一下整合步骤。
在进行测试的时候,先准备好一些后端接口,这个对于后端程序猿而言,应该是手到擒来。如果是前端开发而言,也有很多方式,后续专栏补充。

【安装使用】
Step1、安装 Axios

npm install axios

Step2、引入 Axios,在 main.js 操作

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

const app = createApp(App)

// 引入 Axios
import axios from './axios';

// 全局挂载 axios 实例
app.config.globalProperties.$axios = axios;

// 挂载 app
app.mount('#app');

Step3、使用 Axios

// get请求
axios.get('http://127.0.0.1/get').then(response => {
    console.log("get.data:", response.data)
}).catch(error => {
    console.log("get.error:", error)
}).finally(() => {
    console.log("get.finally")
})

// post 的参数
let data = {
    name: '战神'
}

// post请求
axios.post('http://127.0.0.1/post', data, {
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
}).then(response => {
    console.log("post.data:", response.data)
}).catch(error => {
    console.log("post.error:", error)
}).finally(() => {
    console.log("post.finally")
})

//post请求 postJson [axios 的默认请求头是 application/json]
axios.post('http://127.0.0.1/postJson', data).then(response => {
    console.log("postJson.data:", response.data)
}).catch(error => {
    console.log("postJson.error:", error)
}).finally(() => {
    console.log("postJson.finally")
})

【对比 fetch】
fetch 是基于 Promise 的 api,它可以发送http请求并接收服务器返回的响应数据。
fetch 返回的是一个 Promise 对象。
下面的示例代码是网上提供的,可以对照 Axios 示例比较一下区别。

  • 很明显,写法上 Axios 更简便
  • Axios 可以用在浏览器和服务端,Fetch 只能用在浏览器
  • Axios 需要引入相关依赖,Fetch 是原生的写法
//get请求
fetch('http://127.0.0.1/get').then(response => {
    //返回的解析后的json数据会传递给下一个 then() 方法中的回调函数作为参数,这个参数就是 data
    return response.json() //response.json() 用于将响应数据解析为json格式的数据
}).then(data => { //data 解析后的json数据
    console.log("get.data:", data)
}).catch(error => {
    console.log("get.error:", error.message)
}).finally(() => {
    console.log("get.finally")
})

//post请求 post
fetch('http://127.0.0.1/post', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded'
    },            
    body: new URLSearchParams({//URLSearchParams 用于处理键值对类型的数据,并将其编码为url查询字符串
        name: '战神'
    }),
}).then(response => {
    return response.json()
}).then(data => {
    console.log("post.data:", data)
}).catch(error => {
    console.log("post.error:", error.message)
}).finally(() => {
    console.log("post.finally")
})

//post请求 postJson
fetch('http://127.0.0.1/postJson', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({//JSON.stringify 用于将对象转换为json字符串
        name: '战神'
    }),
}).then(response => {
    return response.json()
}).then(data => {
    console.log("postJson.data:", data)
}).catch(error => {
    console.log("postJson.error:", error.message)
}).finally(() => {
    console.log("postJson.finally")
})

整合 ElementUI

【技术简介】
ElementUI 是饿了么开源的⼀套基于 Vue2 的经典UI库,针对Vue3,升级成为了ElementPlus。熟悉 ElementPlus
库,不但可以节省⼤量前端项⽬的开发时间,同时也是深⼊了解 Vue3 复杂组件开发的很好途径。
参考:Element Plus 官网

Tips:也可以基于 ElementUI 扩展了自己公司的 UI 组件库。

【安装使用】
Step1、安装 ElementPlus

# 在 npm 5.0.0 版本及以上,即使你不加 --save 参数,安装的包也会自动保存到 package.json 文件中。
npm install element-plus --save

Step2、引入 ElementPlus,在 main.js 操作

Tips:这里是全局引入方式,也可以按页面局部引入,例如:import { ElButton }from’element-plus’;

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

// 引入 ElementPlus
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)

// 注册 ElementPlus
app.use(ElementPlus)

app.mount('#app')

Step3、页面或组件直接使用

<el-select v-model="selected" placeholder="请选择">
  <el-option label="选项1" value="1"></el-option>
  <el-option label="选项2" value="2"></el-option>
</el-select>

【总结陈词】
成功引入后,随便添加一个下拉框之类的,效果和样式有出来说明生效了。
开发的时候参考官网使用即可,需要什么组件就找对应的,没什么复杂的,开发常用的就是表单、表格、弹窗这些。
可以说 Vue 开发中,掌握了 Axios 和 ElementUI,再具备 Vue 的基础用法,恭喜,你已经具备了页面开发的资格。


整合 Pinia

【技术简介】
可以帮助 Vue 的不同页面之间实现数据的共享利用,类似 Java 使用 Redis 作为分布式存储,所有微服务都能操作到。
Vue2 中提供的集中状态存储框架是 Vuex,Vue3 中新提供了Pinia,两者作用差不多,用法稍有不同。

官网介绍:Pinia,符合直觉的 Vue.js 状态管理库,类型安全、可扩展性以及模块化设计,甚至让你忘记正在使用的是一个状态库。

参考:Pinia 官网

【安装使用】
Step1、安装 Pinia

npm install pinia

Step2、引入 Pinia,在 main.js 操作

import {createPinia} from 'pinia'
const pinia = createPinia()
app.use(pinia)

Step3、创建定义一个store,位于 stores/web.js

import {reactive, ref} from 'vue'
import {defineStore} from 'pinia'

/*
  定义一个基于 Pinia 的 Store
  第1个参数 web 是 useWebStore 在应用中的唯一标识符(ID)
  第2个参数是 Setup函数 或 Option对象
*/
export const useWebStore = defineStore('web', () => {

  //定义一个响应式对象,存储网站信息
  const web = reactive({
    title: "战神刘玉栋"
  })

  //定义一个响应式引用
  const count = ref(1000)

  //定义方法
  const countAdd = () => {
    count.value++
  }

  return {
    web, count, countAdd
  }
}, {
  //持久化存储到 localStorage 中
  persist: true
})

Step4、页面使用

<template>
  <div>
    <h2>Demo 3</h2>
    <p>{{ count }}</p>
    <button @click="countAdd">countAdd</button>
    <button @click="clear">clear storage</button>
  </div>
</template>

<script>
import {useWebStore} from '../stores/web.js'

export default {
  name: 'Demo3',
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    countAdd() {
      const webStore = useWebStore()
      webStore.countAdd()
      this.count = webStore.count
    }
  },
  mounted() {
    const webStore = useWebStore()
    console.log("webStore.web:", webStore.web)
    console.log("webStore.count:", webStore.count)
  },
};
</script>

【state、getter、action】
Store 文件可以理解为MySQL中的⼀个库,保存⼀部分数据。Pinia的Store中有三个概念: state, getter , action。
这三个概念也可以类⽐于熟悉的MVC,state相当于是数据;getter相当于是服务,⽤来获取并返回数据;action相当于是Controller,组织业务逻辑。

Tips:不规范的话,可以不区分这么多,按上一个示例操作即可。

import {defineStore} from 'pinia'

export const userStore = defineStore('userStore', {

    // action封装修改state的业务动作
    actions: {
        changeUsername(value) {
            if (value && value.length < 10) {
                this.username = value
            }
        }
    },

    // getters读取state的计算值
    getters: {
        getUsername() {
            return this.username.toUpperCase()
        }
    },

    // state定义要保存的数据结构
    state() {
        return {
            username: '--'
        }
    }
})
<template>
  <div>
    <h2>Demo 3</h2>
    <p>{{ count }}</p>
    <button @click="countAdd">countAdd</button>
    <button @click="clear">clear storage</button>
  </div>
</template>

<script>
import {useWebStore} from '../stores/web.js'
import {userStore} from '../stores/user.js'

export default {
  name: 'Demo3',
  data() {
    return {
      count: 0,
    };
  },
  methods: {
    countAdd() {
      const webStore = useWebStore()
      webStore.countAdd()
      this.count = webStore.count
    },
    clear() {
      localStorage.removeItem('web');
    },
  },
  mounted() {
    const webStore = useWebStore()
    console.log("webStore.web:", webStore.web)
    console.log("webStore.count:", webStore.count)
    const user = userStore();
    user.changeUsername('战神')
    console.log(user.username)
    console.log(user.getUsername)
    console.log('========')
  },
};
</script>

【持久化存储插件】
即把pinia的数据存储到Html的本地缓存中,主要借助插件pinia-plugin-persistedstate实现。
使用步骤:

Step1、安装 
npm i pinia-plugin-persistedstate

Step2、引入 main.js

// 为 Pinia 实例添加持久化插件
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

// storage 配置选项接受一个字符串,可以是 'local'(默认值,代表 localStorage)或 'session'(代表 sessionStorage)。
pinia.use(piniaPluginPersistedstate, {
    storage: 'local',
});

查看存储:
image.png

【pinia-plugin-persistedstate 安装的各种坑】
参考:pinia-plugin-persistedstate包安装失败解决办法
参考:解决pinia报hasInjectionContext问题

Tips:只能说,万恶的NPM,万恶的^
Tips:ERROR in ./node_modules/pinia/dist/pinia.mjs 36:29-48 export ‘hasInjectionContext’ (imported as 'has
Tips:继续报错,参考第二个链接,心累!


总结陈词

此篇博文介绍了企业开发中,Vue 的基础使用,更多相关内容,再后续章节中展开。
通过上面整合 Axios 等三个技术点,其实也可以看出来,整合步骤大同小异,可以多尝试整合各类技术,这个很像 SpringBoot 整合各项插件的思路,先引 starter,再加配置,最后用起来。
不断尝试就是最好的学习方式,“纸上得来终觉浅,绝知此事要躬行。”
💗 加油!程序猿!

CSDN_END.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1942735.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境下MongoDB安装与主从集群,高可用集群配置教程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

VMware 安装完,设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式

问题&#xff1a;VMware 安装完&#xff0c;设备管理器中没有虚拟网卡(vmnet0、wmnet1、vmnet8) / 虚拟网络编辑器中没有桥接模式 1、确认 Device Install Service 和 Device Setup Manager 没有被禁用 Device Install Service 和 Device Setup Manager是 Windows 操作系统中…

C# 2.数组

1.定义整形数组&#xff0c;指定数组长度 string[] s1 new string[3]; byte[] bs new byte[3]; 数组的索引值从0开始&#xff0c;3个元素索引值为0&#xff0c;1,2…… 2.添加元素&#xff1a;数组【索引值】值 i1[0] 3;// 给索引值位0位置添加一个3 3 i1[0] 取出指定位置的…

【LeetCode:3098. 求出所有子序列的能量和 + 记忆化缓存】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

JUC-synchorized与锁原理、锁的升级与膨胀

syn-ed 是一个可重入、不公平的重量级锁&#xff1b;synchronized使用对象锁保证了临界区代码的原子性&#xff0c;无论使用synchorized锁的是代码块还是方法&#xff0c;其本质都是锁住一个对象。 同步代码块&#xff0c;锁住的是括号里的对象同步方法 普通方法&#xff0c;…

手写文件系统一条龙篇

哈喽&#xff0c;我是子牙老师。这篇文章聊聊文件系统是怎么写出来的&#xff0c;看完&#xff0c;你就可以自己去写文件系统了。本文以Linux的EXT系列文件系统为例进行讲解&#xff0c;理解了&#xff0c;其他的文件系统你就可以自行研究了&#xff0c;差不多的东西 理解了本…

第二证券:市场估值依然处于较低区域

结合风格板块、一级工作预喜情况与工作中预喜崎岖较大的企业体现看&#xff0c;估量2024年上半年中下游工作获利改善势头向好。其中&#xff0c;获益于客运量的上升&#xff0c;交通运输工作中大型蓝筹公司盈余才干改善。TMT领域中电子及通讯工作成果上升崎岖较大&#xff0c;工…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

小白速通 Spring 之 Annotation 篇

Annotation 注解 Service public class MessageServiceImpl implements MessageService{public String getMessage() {return "Hello World!";}} 本质上来说 Annotation(注解)是 Java 推出的一种注释机制,后面我们统一叫 Annotation&#xff0c;和普通的注释有个显…

Python设计模式:巧用元类创建单例模式!

✨ 内容&#xff1a; 今天我们来探讨一个高级且实用的Python概念——元类&#xff08;Metaclasses&#xff09;。元类是创建类的类&#xff0c;它们可以用来控制类的行为。通过本次练习&#xff0c;我们将学习如何使用元类来实现单例模式&#xff0c;确保某个类在整个程序中只…

python-首字母移位(PythonTip)

[题目描述] 编写一个程序&#xff0c;将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter()&#xff0c;参数为sentence&#xff08;字符串&#xff09;。在函数内&#xff0c;将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

Hadoop架构

一、案列分析 1.1案例概述 现在已经进入了大数据(Big Data)时代&#xff0c;数以万计用户的互联网服务时时刻刻都在产生大量的交互&#xff0c;要处理的数据量实在是太大了&#xff0c;以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS顺应时代…

【机器学习】模型验证曲线(Validation Curves)解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 模型验证曲线(Validation Curves)解析什么是模型验证曲线?模型验证曲线的解读模…

Django教程(004):基于orm操作数据库的用户管理实现

文章目录 1、功能需求2、展示用户列表2.1 添加url2.2 创建视图2.3 编写html页面 3、添加用户3.1 添加url3.2 跳转到添加页面3.3 编写添加用户页面3.4 添加用户3.5 实现效果3.6 页面优化 4、删除用户4.1 添加删除用户按钮4.2 添加删除url4.3 删除用户4.4 实现效果 5、完整代码链…

vue3使用html2canvas

安装 yarn add html2canvas 代码 <template><div class"container" ref"container"><div class"left"><img :src"logo" alt"" class"logo"><h2>Contractors pass/承包商通行证&l…

StableDiffusion模型推荐系列(风格型)

今天&#xff0c;分享几个SDXL的特殊风格模型&#xff0c;这些模型在特定风格下非常出彩&#xff0c;弥补了一些“我已经看腻了AI画图”的情况。这几位作者分享的SDXL模型艺术风格上表现得尤为出色&#xff0c;而且他们都是秉持着开源精神免费分享自己的模型。训练过模型的小伙…

掌握VR全景技术,需要具备哪些条件?

VR全景技术自从进入市场以来&#xff0c;就在各个行业领域尝试落地运用&#xff0c;包括但不限于广告宣传、学校教育、医疗、工业、农业等领域。随着5G 技术的不断普及&#xff0c;VR全景技术也逐渐被应用到日常生活中的各个方面&#xff0c;从地产中介到车企销售&#xff0c;从…

单周期CPU(三)译码模块(minisys)(verilog)(vivado)

timescale 1ns / 1ps //module Idecode32 (input reset,input clock,output [31:0] read_data_1, // 输出的第一操作数output [31:0] read_data_2, // 输出的第二操作数input [31:0] Instruction, // 取指单元来的指令input [31:0] …

ubuntu配置ssh服务器详解

① 确定Ubuntu是否安装SSH服务 systemctl status ssh 一般最开始都没有ssh服务 ② 安装SSH Server sudo apt install openssh-server 执行过程如下 ③ 确定Ubuntu SSH服务状态 systemctl status ssh 现在能看到&#xff1a; 第一行加载状态&#xff0c;已加载ssh.service文件…

大语言模型-GPT-Generative Pre-Training

一、背景信息&#xff1a; GPT是2018 年 6 月由OpenAI 提出的预训练语言模型。 GPT可以应用于复杂的NLP任务中&#xff0c;例如文章生成&#xff0c;代码生成&#xff0c;机器翻译&#xff0c;问答对话等。 GPT也采用两阶段的训练过程&#xff0c;第一阶段是无监督的方式来预训…