小兔鲜项目----Pinia

news2025/1/12 23:03:06

目录

Pinia快速入门

什么是Pinia

 添加Pinia到Vue项目

使用Pinia实现计数器案例

getters实现

action如何实现异步

storeToRefs

Pinia的调试

项目起步-初始化项目并使用git管理 

创建项目并精细化配置

 src目录调整

 git 管理项目

项目起步-配置别名路径联想提示

什么是别名路径联想提示

如何进行配置

项目起步-elementPlus引入 

小兔鲜项目的组件分类

 添加ElementPlus到项目(按需导入)

项目起步-elementPlus主题定制

为什么需要主题定制 

 如何定制(scss变量替换方案)

如何验证主题替换成功

项目起步-axios基础配置

axios基础配置

1. 安装axios

2. 基础配置

3. 封装请求函数并测试

项目起步-项目路由设计

设计首页和登录页的路由(一级路由)

设计分类页和默认Home页路由(二级路由)

 补充.eslintrc配置

静态资源引入和Error Lens安装

1. 静态资源引入

2. Error Lens插件安装

 项目起步-scss文件自动导入

为什么要自动导入

自动导入配置


Pinia快速入门

什么是Pinia

Pinia 是 Vue 的专属的最新状态管理库 ,是 Vuex 状态管理工具的替代品

1. 提供更加简单的API (去掉了 mutation )
2. 提供符合组合式风格的API (和 Vue3 新语法统一)
3. 去掉了 modules 的概念,每一个 store 都是一个独立的模块 4. 搭配 TypeScript 一起使用提供可靠的类型推断

 添加Pinia到Vue项目

1. 使用 create-vue 创建空的新项目

npm init vue@latest

2. 按照官方文档安装 pinia 到项目

用你最喜欢的包管理器安装 pinia

yarn add pinia
# 或者使用 npm
npm install pinia

创建一个 pinia(根存储)并将其传递给应用程序: 

import { createApp } from 'vue'
import App from './App.vue'
// 导入 createPinia
import { createPinia } from 'pinia'
// 执行方法得到实例
const pinia = createPinia()
// 将pinia加入到app应用中
createApp(App).use(pinia).mount('#app')

使用Pinia实现计数器案例

getters实现

Pinia中的 getters 直接使用 computed函数 进行模拟

action如何实现异步

action中实现异步和组件中定义数据和方法的风格完全一致

storeToRefs

使用storeToRefs函数可以辅助保持数据(state + getter)的响应式解构

Pinia的调试

Vue官方的 dev-tools 调试工具 对 Pinia直接支持,可以直接进行调试

 pinia

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import axios from 'axios'
const APIURL = 'http://geek.itheima.net/v1_0/channels'
export const useCounterStore = defineStore('counter', () => {
    // 定义state
    const state = ref(0)

    //定义修改数据的方法(action 同步+异步) 
    const increment = () => {
        state.value++
    }

    // getter定义 计算属性
    const doubleCount = computed(() => state.value * 2)

    // 定义异步action
    const list = ref([])
    const getlist = async () => {
        let res = await axios.get(APIURL)
        console.log(res);
        list.value = res.data.data.channels
    }

    // 以对象的形式返回
    return {
        state,
        increment,
        doubleCount,
        getlist,
        list
    }
})

页面

<script setup>
import { onMounted } from "vue";
import { storeToRefs } from "pinia";
onMounted(() => {
  getlist();
});
// 导入方法
import { useCounterStore } from "./store/counter";
// 执行方法得到 store 实例对象
const CounterStore = useCounterStore();
// 解构 会丢失响应式 storeToRefs方法包裹 保证响应式
const { getlist } = CounterStore;
// 只处理数据 方法 从CounterStore解构赋值
const { doubleCount, state } = storeToRefs(CounterStore);
console.log(CounterStore);
</script>

<template>
  <button @click="CounterStore.increment">{{ state }}</button>
  {{ doubleCount }}

  <ul>
    <li v-for="item in CounterStore.list" :key="item.id">{{ item.name }}</li>
  </ul>
</template>

<style scoped>
</style>

1. Pinia是用来做什么的?

集中状态管理工具,新一代的vuex

2. Pinia中还需要mutation吗?

不需要,action既支持同步也支持异步

3. Pinia如何实现getter?

computed计算属性函数

4. Pinia产生的Store如何解构赋值数据保持响应式?

storeToRefs

项目起步-初始化项目并使用git管理 

创建项目并精细化配置

 src目录调整

 git 管理项目

基于 create-vue 创建出来的项目默认没有初始化git仓库,需要我们手动初始化

执行命令并完成首次提交
1. git init
2. git add .
3. git commit -m “init”

项目起步-配置别名路径联想提示

什么是别名路径联想提示

在编写代码的过程中,一旦 输入 @/ , VSCode会立刻 联想出src下的所有子目录和文件, 统一文件路径访问不容易出错

如何进行配置

1. 在项目的根目录下新增 jsconfig.json文件

2. 添加json格式的配置项,如下:

jsconfig.json 这个配置只做联想提示

vite.config 实际的路径转换

{
    "compilerOptions": {
        "baseUrl": "./",
        "paths": {
            "@/*": [
                "src/*"
            ]
        },
    },
}

项目起步-elementPlus引入 

小兔鲜项目的组件分类

 添加ElementPlus到项目(按需导入)

# 选择一个你喜欢的包管理器



# NPM
$ npm install element-plus --save

 自动导入推荐

首先你需要安装unplugin-vue-components 和 unplugin-auto-import这两款插件

npm install -D unplugin-vue-components unplugin-auto-import

然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中 

// vite.config.ts
import { defineConfig } from 'vite'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

export default defineConfig({
  // ...
  plugins: [
    // ...
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
  ],
})

项目起步-elementPlus主题定制

为什么需要主题定制 

小兔鲜主题色和elementPlus默认的主题色存在冲突,通过定制主题让elementPlus的主题色和小兔鲜项目保持一致

 如何定制(scss变量替换方案)

如何验证主题替换成功

使用el-button按钮组件进行验证,type=”primary ”时显示主色,如果颜色变成了小兔鲜的主色,即为成功

 1. 安装sass

基于vite的项目默认不支持css预处理器,需要开发者单独安装



npm i sass -D

2. 准备定制化的样式文件

/* 只需要重写你需要的即可 */
@forward 'element-plus/theme-chalk/src/common/var.scss' with (
  $colors: (
    'primary': (
      // 主色
      'base': #27ba9b,
    ),
    'success': (
      // 成功色
      'base': #1dc779,
    ),
    'warning': (
      // 警告色
      'base': #ffb302,
    ),
    'danger': (
      // 危险色
      'base': #e26237,
    ),
    'error': (
      // 错误色
      'base': #cf4444,
    ),
  )
)

3. 自动导入配置

这里自动导入需要深入到elementPlus的组件中,按照官方的配置文档来

  • 配置elementPlus采用sacc样式配色系统

  • 自动导入定制化样式文件进行样式覆盖
import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// element plus 按需引入
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      // 配置elementPlus采用sacc样式配色系统
      resolvers: [ElementPlusResolver({
        importStyle: "sass",
      })],
    }),],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  },
  css: {
    preprocessorOptions: {
      scss: {
        // 自动导入定制化样式文件进行样式覆盖
        additionalData: `
          @use "@/styles/element/index.scss" as *;
        `,
      }
    }
  }
})

项目起步-axios基础配置

axios基础配置

1. 安装axios npm i axios

2. 配置基础实例(统一接口配置)

1. 安装axios

npm i axios

2. 基础配置

官方文档地址:起步 | Axios Docs
基础配置通常包括:

  1. 实例化 - baseURL + timeout
  2. 拦截器 - 携带token 401拦截等
import axios from 'axios'

// 创建axios实例
const http = axios.create({
    baseURL: 'http://pcapi-xiaotuxian-front-devtest.itheima.net',
    timeout: 5000
})

// axios请求拦截器
http.interceptors.request.use(config => {
    return config
}, e => Promise.reject(e))

// axios响应式拦截器
http.interceptors.response.use(res => res.data, e => {
    return Promise.reject(e)
})


export default http

3. 封装请求函数并测试

import http from '@/utils/https'

export function getCategoryAPI() {
    return http({
        url: 'home/category/head'
    })
}

项目起步-项目路由设计

设计首页和登录页的路由(一级路由)

路由设计原则:找内容切换的区域,如果是页面整体切换,则为一级路由

设计分类页和默认Home页路由(二级路由)

路由设计原则:找内容切换的区域,如果是在一级路由页的内部切换,则为二级路由

 补充.eslintrc配置

不在强制要求组件命名

/* eslint-env node */
module.exports = {
  root: true,
  'extends': [
    'plugin:vue/vue3-essential',
    'eslint:recommended'
  ],
  parserOptions: {
    ecmaVersion: 'latest'
  },
  rules: {
    'vue/multi-word-component-names': 0,//不在强制要求组件命名
  }
}

我们vue中常用的两种路由模式:hash路由模式和history路由模式。

hash模式:

1、hash路由模式是比较好区分的,凡是我们的url后带有“#”的都属于hash模式;

2、hash“#”后的值,不会包含在http请求中,改变hash的值不会引起页面的重新加载(他是前端路由交互处理,#后面hash值变化不会导致浏览器像服务器发送请求,浏览器不发送请求,也就不会刷新页面);

3、hash原理:onhashchange事件,可以在window对象上监听这个事件(每次hash值的变化,都会出发hashchange事件,通过这个事件我们就可以知道hash值发生了哪些变化,通过监听hashchange来实现更新页面部分内容操作)

4、hash可以兼容到ie8以上

5、会创建hashhistory对象,在访问不同的路由会发生两种事件:hashhistory.push():将新的路由添加到浏览器访问的历史栈顶,hashhistory.replace()替换到当前栈

history模式:

1、url不带参数,所以看起来比较美观;

2、history依赖于前后端交互,即将url修改的就和正常请求的后端url一样,如后端没有配置对应的/user/id的路由处理,就会返回404错误;

3、history原理:onpopstate事件,当浏览器跳转到新的状态时会触发popstate事件;

4、history可以兼容到ie10;

 

 路由文件

// createRouter:创建router实例对象
// createWebHistory:创建history模式的路由

import { createRouter, createWebHistory } from 'vue-router'
import Login from '@/views/Login/index.vue'
import Layout from '@/views/Layout/index.vue'
import Home from '@/views/Home/index.vue'
import Category from '@/views/Category/index.vue'

const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL),
  // path和component对应关系的位置
  routes: [
    {
      path: '/',
      component: Layout,
      children: [
        {
          path: '',
          component: Home
        },
        {
          path: 'category',
          component: Category
        }
      ]
    },
    {
      path: '/login',
      component: Login
    }
  ]
})

export default router

静态资源引入和Error Lens安装

1. 静态资源引入

  1. 图片资源 - 把 images 文件夹放到 assets 目录下
  2. 样式资源 - 把 common.scss 文件放到 styles 目录下

2. Error Lens插件安装

 项目起步-scss文件自动导入

为什么要自动导入

在项目里一些组件共享的色值会以scss变量的方式统一放到一个名为 var.scss 的文件中,正常组件中使用,需要先导 入scss文件,再使用内部的变量,比较繁琐,自动导入可以免去手动导入的步骤,直接使用内部的变量

 

自动导入配置

1. 新增一个 var.scss 文件,存入色值变量 2. 通过 vite.config.js 配置自动导入文件

 

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

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

相关文章

Cesium教程(四):调用地形服务

Cesium提供了多种现有地形数据服务接口&#xff0c;并且支持自定义地形数据。 CesiumTerrainProvider&#xff1a;高精度全球地形数据&#xff0c;附有光照和水面效果。地形切片使用quantized-mesh v1.0格式&#xff0c;Cesium使用CesiumTerrainProvider API调用该服务。 Goo…

git bash下载gitee项目报错:no such file found

错误再现 解决方案&#xff1a;设置SSH Key 第一步&#xff1a;右击git bash here&#xff0c;命令行输入 $ git config --global user.name “hcshow” //配置用户名 $ git config --global user.email “hcitlifehotmail.com” //配置用户邮箱地址 此时可以查看用户名等信息…

【C++ 学习 ⑦】- 模板初阶(函数模板和类模板)

目录 一、前言 二、函数模板 2.1 - 基本概念和原理 2.2 - 定义格式 2.3 - 实例化详解 2.3.1 - 隐式实例化 2.3.2 - 显示实例化 2.4 - 模板参数的匹配原则 三、类模板 3.1 - 定义格式 3.2 - 实例化 参考资料&#xff1a; C函数模板&#xff08;模板函数&#xff09;详…

chatgpt赋能Python-python_for_line_in_f

Python for Line in F: 一种高效的文件读写方法 对于Python编程工程师来说&#xff0c;文件的读写操作是一项必备技能。但是&#xff0c;如果你还在使用传统的逐行读取方法&#xff0c;那么你可能需要了解一种更加高效的文件读写方法&#xff1a;Python for Line in F。 什么…

使用亚马逊云科技Amazon VPC Lattice简化服务间的连接、安全和监控

在亚马逊云科技re:Invent 2022中&#xff0c;亚马逊云科技介绍了Amazon VPC Lattice预览版&#xff0c;这是Amazon Virtual Private Cloud&#xff08;Amazon VPC&#xff09;的一项新功能&#xff0c;可通过一致的方式连接、保护和监控服务之间的通信。借助Amazon VPC Lattice…

十八、map和set

文章目录 一、关联式容器&#xff08;一&#xff09;序列式容器&#xff1a;&#xff08;二&#xff09;关联式容器&#xff1a; 二、树形结构与哈希结构&#xff08;一&#xff09;树型结构&#xff08;二&#xff09;哈希结构 三、键值对四、set五、multiset六、map&#xff…

有没有一种支持对象建模、数据库建模和低代码能力的工具,用来解放程序员生产力呢?

1. 简介 作为一个程序员&#xff0c;很多时候在面对项目开发工期短、任务重、功能复杂、压力大&#xff0c;同时还得迎合领导或者甲方的要求提供研发设计文档时&#xff0c;往往很苦恼&#xff0c;因为随着软件项目的迭代&#xff0c;很难保持输出与代码一致的数据模型和架构模…

Configuring MySQL for a SSD based SAN

Configuring MySQL for a SSD based SAN (Doc ID 2673662.1)正在上传…重新上传取消To Bottom In this Document APPLIES TO: MySQL Server - Version 5.6 and later Information in this document applies to any platform. GOAL Considering a Virtualized environment wit…

chatgpt赋能Python-python_ip归属地

Python IP归属地查询 在网络安全领域&#xff0c;IP地址归属地查询是一项非常重要的任务。很多时候我们需要知道某个IP地址的归属地以解决一些安全问题。Python语言在这方面也发挥了巨大的作用&#xff0c;有各种成熟的IP地址归属地查询库。在本文中&#xff0c;我们将介绍如何…

CMOS摄像头驱动分析-i2c驱动

CMOS摄像头驱动分析-i2c驱动 文章目录 CMOS摄像头驱动分析-i2c驱动设备树内容module_i2c_driver宏分析ov2640_i2c_driverov2640_probe 设备树内容 ov2640: camera0x30 {compatible "ovti,ov2640";reg <0x30>;status "okay";pinctrl-names "…

三、Mybatis从入门到入土

一、什么是Mybatis 1&#xff09;MyBatis 是一款优秀的持久层&#xff08;DAO层&#xff09;框架 2&#xff09;MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 3&#xff09;MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将…

程序员做爬虫有哪些痛点

很多网站会设置反爬虫机制&#xff0c;如验证码、IP封禁、请求频率限制等&#xff0c;这些机制会增加爬虫的难度。 程序员做爬虫时&#xff0c;可能会遇到以下难点&#xff1a; 1、反爬虫机制 许多网站会设置反爬虫机制&#xff0c;如验证码、IP封禁、请求频率限制等&#x…

ICV: ADAS SoC市场规模将在2024年迎来较大突破

随着先进驾驶辅助系统&#xff08;ADAS&#xff09;的出现和对于自动驾驶的追求&#xff0c;汽车行业正在经历快速转型。这些技术进步的核心是ADAS SoC&#xff0c;它是实现多个功能集成于单一平台的关键组件。ADAS SoC已经成为智能汽车的重要驱动因素&#xff0c;彻底改变了安…

Linkage Mapper Toolkit中的 Barrier Mapper 功能解析(含实际案例分析)

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 🎉引言🌟博客介绍🌟Linkage Mapper 工具和 ArcGIS 简介🎉Barrier Mapper 和 ArcGIS 的集成</

python内置模块之logging

文章目录 1 开始使用 logging 1.1 第一个程序1.2 日志级别1.3 输出格式 2 输出日志到文件 2.1 使用 basicConfig 配置文件路径2.2 logging 模块化设计2.3 自动分割日志文件 最近因为一个小需求&#xff0c;需要保存日志到文件中。因为平时调试都只是用print&#xff0c;当不…

Cesium教程(五):加载自定义地形数据

目录 1、准备数据 2、转化数据 3、发布数据 4、加载数据 5、数据下载地址 1、准备数据 可以从NASA网站免费下载30m空间分辨率高程模型数据 在地图上选择区域之后&#xff0c;点击左侧对应区域下载即可&#xff1a; 也可以在地理空间数据云上下载所需要的地区数据地理空间数…

Zeebe系列(1)-- Zeebe官方管理台使用

Zeebe管理台创建 注册zeebe账号&#xff0c;可以获得30天的免费试用期。可以在官方提供的管理台页面进行zeebe集群的创建等操作。 Accounts | Sign Up - Camunda Zeebe管理台是进行流程管理的界面&#xff0c;主要包括5个组件。 Console Console&#xff1a;Zeebe的控制台&…

Java高并发核心编程—内置锁原理篇

注&#xff1a;本笔记是阅读《Java高并发核心编程卷2》整理的笔记&#xff01; 导致并发修改的原因 例如Java中的i等指令并非是原子操作&#xff0c;而是三条指令的集合&#xff1a;“内存取值”、“寄存器增加1”、“存值到内存” 。 因此&#xff0c;如果是多线程并发使用C…

PHP操作宝塔面板Api,宝塔服务器搭建,API接口使用教程

最近两个月都在写Bty项目&#xff0c;所以收集了很多很多宝塔常用到的一些Api接口&#xff0c;官方文档虽然写了一点&#xff0c;但是始终是不怎么全的&#xff0c;下面我们来看看宝塔面板的接口如何抓取 接口抓取 1、登录宝塔面板 2、找到自己想要的功能 3、f12打开审查元素&a…

韵达转债上市价格预测

韵达转债 基本信息 转债名称&#xff1a;韵达转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;24.5亿元。 正股名称&#xff1a;韵达股份&#xff0c;今日收盘价&#xff1a;12.23元&#xff0c;转股价格&#xff1a;12.15元。 当前转股价值 转债面值 / 转…