当前位置: 首页 > news >正文

Vue3.5 企业级管理系统实战(十二):组件尺寸及多语言实现

1 组件尺寸切换

 1.1 用 Pinia 进行 Size 的持久化存储

 首先,在 src/plugins/element.ts 中增加 size 类型,代码如下:

//src/plugins/element.ts
import type { App } from "vue";

import { ElMessage, ElNotification, ElMessageBox } from "element-plus";

export default (app: App) => {
  // 都放到组件的实例上了
  app.config.globalProperties.$message = ElMessage;
  app.config.globalProperties.$notify = ElNotification;
  app.config.globalProperties.$confirm = ElMessageBox.confirm;
  app.config.globalProperties.$alert = ElMessageBox.alert;
  app.config.globalProperties.$prompt = ElMessageBox.prompt;
};

export type Size = "default" | "small" | "large";

然后,在 src/stores/app.ts 中对 Size 进行本地持久化存储处理,代码如下:

//src/stores/app.ts
import type { Size } from "@/plugins/element";

export const useAppStore = defineStore(
  "app",
  () => {
    // setup
    const state = reactive({
      sidebar: {
        opened: true
      },
      size: "default" as Size
      // ...
      // theme
    });
    const sidebar = computed(() => state.sidebar);
    const toggleSidebar = () => {
      state.sidebar.opened = !state.sidebar.opened;
    };

    const size = computed(() => state.size);
    const setSize = (size: Size) => (state.size = size);

    return { state, sidebar, toggleSidebar, size, setSize };
  },
  {
    persist: {
      storage: window.localStorage,
      pick: ["state.sidebar", "state.size"]
    }
  }
);

1.2 SizeSelect 组件开发

在 src/components 下新建 SizeSelect 文件夹,新建文件 index.vue,代码如下:

//src/components/SizeSelect/index.vue
<template>
  <el-dropdown trigger="click">
    <span class="el-dropdown-link">
      <svg-icon
        custom-class="w-2em h-2em"
        icon-name="ant-design:font-size-outlined"
      ></svg-icon>
    </span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item
          :disabled="item.value === store.size"
          v-for="item in sizeOptions"
          :key="item.label"
          @click="store.setSize(item.value as Size)"
        >
          {{ item.label }}</el-dropdown-item
        >
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

<script lang="ts" setup>
import { type Size } from "@/plugins/element";
import { useAppStore } from "@/stores/app";
const store = useAppStore();
const sizeOptions = ref([
  {
    label: "Default",
    value: "default"
  },
  {
    label: "Large",
    value: "large"
  },
  {
    label: "Small",
    value: "small"
  }
]);
</script>

 1.3 页面引用

在 src/layout/components/Navbar.vue 下引用 SizeSelect 组件,代码如下:

//src/layout/components/Navbar.vue 
<template>
  <div class="navbar" flex>
    <hamburger
      @toggleCollapse="toggleSidebar"
      :collapse="sidebar.opened"
    ></hamburger>
    <BreadCrumb></BreadCrumb>

    <div flex justify-end flex-1 items-center mr-20px>
      <screenfull mx-5px></screenfull>
      <el-tooltip content="ChangeSize" placement="bottom">
        <size-select></size-select>
      </el-tooltip>
    </div>
  </div>
</template>

<style scoped lang="scss">
.navbar {
  @apply h-[var(--navbar-height)];
}
</style>

<script lang="ts" setup>
import { useAppStore } from "@/stores/app";
// 在解构的时候要考虑值是不是对象,如果非对象解构出来就 丧失响应式了
const { toggleSidebar, sidebar } = useAppStore();
</script>

1.4 全局配置

在 src/App.vue 中使用 element 的 Config Provider 进行全局配置,代码如下:

//src/App.vue
<template>
  <el-config-provider :size="store.size">
    <router-view></router-view>
  </el-config-provider>
</template>

<script lang="ts" setup>
import { useAppStore } from "./stores/app";
const store = useAppStore();
</script>

<style scoped></style>

npm run dev 启动后,页面效果如下:

 2 多语言实现

2.1 声明模块

在 src/vite-env.d.ts 中声明语言模块,代码如下:

 //src/vite-env.d.ts
/// <reference types="vite/client" />
declare module "element-plus/dist/locale/en.mjs";
declare module "element-plus/dist/locale/zh-cn.mjs";

2.2 全局配置

 在 src/App.vue 中使用 element 的 Config Provider 进行全局配置,代码如下:

//src/App.vue
<template>
  <el-config-provider :size="store.size" :locale="locale">
    <router-view></router-view>
  </el-config-provider>
</template>

<script lang="ts" setup>
import { useAppStore } from "./stores/app";
import en from "element-plus/dist/locale/en.mjs";
import zhCn from "element-plus/dist/locale/zh-cn.mjs";

const language = ref("zh-cn");
const locale = computed(() => (language.value === "zh-cn" ? zhCn : en));

const store = useAppStore();
</script>

<style scoped></style>

这里只是简单演示了一下多语言包的引入和使用方法,可以和上面组件尺寸一样在 pinia 里面进行持久化管理,过程和原理雷同,这里不赘述。

 以上,就是全局配置组件尺寸和多语言的内容。

下一篇将继续探讨 Avatar 组件实现,敬请期待~

相关文章:

  • k8s运维面试总结(持续更新)
  • 【Harmonyos】项目开发总结--摇杆拖动侧重实现(适用游戏摇杆)
  • 数据库表的三种关系,通俗易懂的讲解
  • 【RAG 系统实战课】01 用RAG改造传统MIS系统
  • MySQL 中常用的日期和时间类型
  • Nuxt2中全局路由守卫的写法(含Nuxt3写法和变化)
  • 01背包问题二维数组和一维数组间的区别
  • RAG优化:python从零实现Proposition Chunking[命题分块]让 RAG不再“断章取义”,从此“言之有物”!
  • 基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码
  • 步进电机驱动电压对定位精度的深层影响分析
  • 机器学习的定义及分类
  • # 注意力机制
  • Spring Event 观察者模型及事件和消息队列之间的区别笔记
  • HMTL+JS+CSS实现贪吃蛇游戏,包含有一般模式,困难模式,还有无敌模式
  • 前端如何导入谷歌字体库
  • arm_mat_init_f32用法 dsp库
  • ansible-playbook 执行剧本报错: libselinux-python) aren‘t installed!
  • 智慧管理 | 共享茶室:可远程实时查看的物联网框架要怎么选?
  • Mysql-数据库、安装、登录
  • 使用string和string_view(四)——练习
  • 对谈|“大礼议”:嘉靖皇帝的礼法困境与权力博弈
  • 商务部召开全国离境退税工作推进会:提高退税商店覆盖面,扩大入境消费
  • 一图读懂丨创新创业人才最高补贴500万元!临港新片区发布创客新政“十二条”
  • 伊朗最高领袖顾问:伊朗愿承诺永不制造核武,换取美解除制裁
  • 病重老人被要求亲自取钱在农业银行门口去世?株洲警方介入
  • 汕头违建豪宅“英之园”将强拆,当地:将根据公告期内具体情况采取下一步措施