Vue3 + element plus 动态修改组件尺寸大小

lxf2023-05-22 01:21:36

前言

最近在使用vue3+element plus 练手,于是想参照网上element-ui demo 实现一个动态修改组件尺寸的功能,在次将功能实现方式记录于此

项目准备

搭建vue3 项目 + 引入element plus(这里就不多阐述)

功能实现

主要步骤如下:

    • 修改size的下拉实现
    • 点击回调,实现size的修改
    • 利用 $nextTick 实现 重定向刷新页面

修改size的下拉

<template>
  <el-dropdown trigger="click" @command="handleSetSize">
    <div>
      <svg-icon style="color: #FFFFFF;" class-name="size-icon" icon-class="size" />
    </div>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item v-for="(item,index) of sizeOptions" :key="index" :disabled="curSize==item.value"
          :command="item.value">
          {{ item.label }}
        </el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>
<script lang="ts">
  import { defineComponent, getCurrentInstance, ref } from 'vue'
  import { useStore } from 'vuex'
  import { useRoute, useRouter } from 'vue-router'
  export default defineComponent({
    name: 'SizeSelect',
    setup(props) {
      const instance = (getCurrentInstance() as ComponentInternalInstance)
      var _this = instance.ctx;
      const store = useStore();
      const route = useRoute();
      const router = useRouter();

      var curSize = ref(store.state.size);
      const sizeOptions = [
        { label: 'Default', value: 'default' },
        { label: 'Medium', value: 'medium' },
        { label: 'Small', value: 'small' },
        { label: 'Mini', value: 'mini' }
      ]
            
      const handleSetSize = (size) => {
        curSize.value = size;
        store.commit('SET_SIZE', size);
        console.log(store, instance);
        instance.appContext.app.config.globalProperties.$ELEMENT.size = size;
        refreshView();
      }

      const refreshView = () => {
        // In order to make the cached page re-rendered
        store.dispatch('delAllCachedViews', route)
        const { fullPath } = route;
        _this.$nextTick(() => {
          router.replace({
            path: '/redirect' + fullPath
          })
        })
      }
      return {
        sizeOptions,
        handleSetSize,
        curSize
      }
    }
  })
</script>

main.ts/main.js配置

const option = {
  size: Cookies.get('size') || 'mini',
};
app.config.globalProperties.$ELEMENT = option
components.forEach(component => {
  app.component(component.name, component);
})

store 配置

import { createStore } from 'vuex'
import tagsView from './modules/tagsView'
import Cookies from 'js-cookie'
export default createStore({
   modules: {
      tagsView
   },
   state: {
      size: Cookies.get('size') || 'mini',
      language: Cookies.get('language') || 'en',
      themeColor: Cookies.get('themeColor') || '#409EFF'
   },
   mutations: {
      SET_SIZE: (state, size) => {
         state.size = size
         Cookies.set('size', size)
      },
      SET_LANGUAGE: (state, language) => {
         state.language = language
         Cookies.set('language', language)
      },
      SET_THEME_COLOR: (state, themeColor) => {
         state.themeColor = themeColor
         Cookies.set('themeColor', themeColor)
      }
   },
   actions: {
      setSize({ commit }, size) {
         commit('SET_SIZE', size)
      },
      setLanguage({ commit }, language) {
         commit('SET_LANGUAGE', language)
      },
      setThemeColor({ commit }, themeColor) {
         commit('SET_THEME_COLOR', themeColor)
      }
   }
})

路由配置

router.ts/router.js

import Redirect from '@/views/redirect/index.vue'
{
  path: '/redirect',
  redirect: '/',
  component: Layout,
  children: [
    {
    path: '/redirect/:path*',
    component: Redirect
    }
  ]
},

redirect目录下的index.vue

<script>
  import { h } from 'vue'
  import { useRoute, useRouter } from 'vue-router'
  export default {

    setup(props) {
      const route = useRoute();
      const router = useRouter();
      const { params, query } = route;
      const { path } = params;
      router.replace({
        path: '/' + path, query
      })
    },
    render() {
      return h() // avoid warning message
    }
  }
</script>

实现效果如下

Vue3 + element plus 动态修改组件尺寸大小

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!