Vite Vue3+Element Plus框架布局

news2024/12/25 9:12:05

App根组件:框架布局

<template>
  <el-container class="layout-container-demo" style="height: 98vh">

    <!-- 菜单栏 -->
    <el-aside width="200px">
      <el-scrollbar>
        <!-- router:是否启用 vue-router 模式。 启用该模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 -->
        <!-- default-active:页面加载时默认激活菜单的 index 也就是你当前选中的菜单页进行高亮显示 -->
        <el-menu :router="true" :default-active="route.fullPath">
          <!-- 这个index是一个唯一标识:一般我们将它设置为路由的地址即可 -->
          <el-menu-item index="/home">
            <el-icon>
              <HomeFilled />
            </el-icon>
            <span>首页</span>
          </el-menu-item>
          <el-sub-menu index="/news">
            <template #title>
              <el-icon><icon-menu /></el-icon>新闻管理
            </template>
            <el-menu-item index="/news/add">新增新闻</el-menu-item>
            <el-menu-item index="/news/list">新闻列表</el-menu-item>
          </el-sub-menu>
        </el-menu>
      </el-scrollbar>
    </el-aside>

    <!-- 内容栏 -->
    <el-container>
      <el-header style="text-align: right; font-size: 12px">
        <div>新闻管理系统</div>
        <div>欢迎Lily回来</div>
      </el-header>

      <el-main>
        <el-scrollbar>
          <!-- 这里就是我们的路由容器:我们的数据加载到这里 -->
          <RouterView></RouterView>
        </el-scrollbar>
      </el-main>
    </el-container>
  </el-container>
</template>

<script setup>
import { ref } from 'vue'
// 注册icon  :icon需要单独注册
import { Menu as IconMenu, Message, Setting, HomeFilled } from '@element-plus/icons-vue'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter();
const route = useRoute();
</script>

<style>
* {
  margin: 0;
  padding: 0;
}

.el-header {
  background: #f5f7fa;
  height: 80px;
  width: 100%;
  line-height: 80px;

  display: flex;
  justify-content: space-between;
  align-items: center;
  /*字体垂直方向居中*/
}

.el-header div {
  font-size: 16px;
}
</style>

AddNews.vue 新增新闻


<template>
    <el-form :model="news" label-width="120px">
        <el-form-item label="标题">
            <el-input v-model="news.title" />
        </el-form-item>
        <el-form-item label="类型">
            <el-select v-model="news.type" placeholder="类型">
                <el-option label="军事" value="军事" />
                <el-option label="娱乐" value="娱乐" />
                <el-option label="财经" value="财经" />
            </el-select>
        </el-form-item>
        <el-form-item label="内容">
            <el-input v-model="news.desc" type="textarea" />
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="onAddNews">创建</el-button>
            <el-button>取消</el-button>
        </el-form-item>
    </el-form>
</template>

<script lang="ts" setup>
import {ref, reactive } from 'vue'
import newsStore from '../stores/newsStore'
const store=newsStore();

const news=ref({
    title:"",
    type:"",
    desc:"",
})


const onAddNews = () => {
    store.addNews(news.value); //新增新闻
}
</script>

NewsList.vue 新闻列表


    
<template>
    <el-table :data="store.newsList" style="width: 100%">
        <el-table-column fixed prop="title" label="标题" />
        <el-table-column prop="type" label="分类" />
        <el-table-column prop="desc" label="内容" />
        <el-table-column>
            <template #default="scope">
                <el-button link type="primary" size="small" @click="handleClick(scope.row)">删除</el-button>
                <el-button link type="primary" size="small">编辑</el-button>
            </template>
        </el-table-column>
    </el-table>
</template>

<script  setup>
import newsStore from '../stores/newsStore'
const store = newsStore();
console.log(store.newsList)
const handleClick = (row) => {
    store.deleteNews(row.title)

}
</script>

/router/index 路由

import { createRouter, createWebHistory } from "vue-router"; //导入vue-router路由模块,createWebHashHistor函数
 
const routes = [
    {
        path: "/",  //路径: 
        redirect: "/Home"  //涉及到多级页面跳转需要用路径的跳转,不能用name的跳转; 浏览器进入http://localhost:5173/ 首先要跳转的路径是/Films,即:要跳转到http://localhost:5173/Films,而进入http://localhost:5173/Films后又发现/Films要重定向到/Films/NowPlaying,这样就实现了打开http://localhost:5173/就加载出来了http://localhost:5173/Films/NowPlaying内容
        // redirect: {
        //     name: "Films" //重定向到路由名称为Tabbar的路由中,这样当浏览器输入的是:http://localhost:5173/ 则会重定向跳转到 http://localhost:5173/Films
        // }
 
    },
    {
        path: "/home",  //路径:导航栏
        name: "Home",
        //当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载
        //这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。
        component: () => import("../views/Home.vue")
 
    },
    
    {
        path: "/news/add",  //路径:底部选项卡
        name: "AddNews",  //路由名称,如果不指定name 默认的name为default
 
        //当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载
        //这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。
        component: () => import("../views/AddNews.vue"),
 
    },
    {
        path: "/news/list",  //路径:底部选项卡
        name: "NewsList",  //路由名称,如果不指定name 默认的name为default
 
        //当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载
        //这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。
        component: () => import("../views/NewsList.vue"),
 
    },
    {
        path: "/:pathMatch(.*)",  //404错误
        name: "NotFound",  //路由名称,如果不指定name 默认的name为default
        component: () => import("../views/NotFound.vue")
    }
 
]
 
//创建路由对象
const router = createRouter({
    history: createWebHistory(),     //这种方式基于浏览器 history API 的路由模式,url的样式是:http://localhost:5173/list
    routes: routes,
})
 
//路由全局拦截:在进入页面之前就进行拦截。可以用于做用户登陆验证
//参数to:  表示即将进入的目标路由对象
//参数from:表示当前导航正要离开的路由
//参数next:调用该方法后才能进入下一个钩子。next() 直接进入下一个钩子,next(false) 中断当前的导航。next('/') 或者 next({ path: '/' }) 则会进入一个不同的地址。
router.beforeEach(async (to, from, next) => {
    const isAuthenticated = await localStorage.getItem('token');
 
    console.log(to.fullPath); //全路径
    console.log(to.path);     //路径
    console.log(to.name);     //路由名称
    console.log(to.params);   //路由参数:http://localhost:5173/FilmsDetail/123
    console.log(to.query);    //路由参数:http://localhost:5173/FilmsDetail?myid=123
    console.log(to.meta);     //路由自定义参数
 

    //meta.requireAuth表示当前请求的页面需要验证, 并且未登录
    if (to.meta.requireAuth && !isAuthenticated) {
        next(`/login?redirect=${to.path}`) //to.fullPath
    }
    else next() //如果不是请求的登陆界面,或者已经登陆过了,则直接跳转到用户请求的界面
})
 
//路由全局拦截:在进入页面之后才进行触发拦截。
router.afterEach(async (to, form) => {
    //用的比较少,一般用于收集一些日志信息,做用户行为分析:例如:收集页面浏览量:PV
})
 
export default router //导出router路由对象//导出router路由对象

/stores/newsStore.js  状态管理器

import { defineStore } from 'pinia'
import axios from 'axios'
import { computed, ref } from 'vue'


const newsStore = defineStore("newsStoreId", () => {
    const newsList = ref([]);
    //新增新闻
    const addNews = (news) => {
        newsList.value.push({...news}) //{...news} 展开news 将news作为一个新的对象添加到newsList中,否则只是将原先news对象的一个引用给加进去了,现在修改了原先的也将修改
    }

    const deleteNews = (title) => {
        newsList.value = newsList.value.filter(news => news.title !== title);
    }
    return {
        newsList,
        addNews,
        deleteNews
    }

})

export default newsStore;

vite.config.js 配置文件

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

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

// 自动导入Icon图标
import IconResolver from "unplugin-icons/resolver";
import Icons from "unplugin-icons/vite";

// import 'element-plus/es/components/button/style/css'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    // 按需引入Element-plus //引入icon
    AutoImport({
      resolvers: [
        ElementPlusResolver({ importStyle: false }), // 组件自动导入
        IconResolver({ prefix: "icon" }),
      ],
    }),
    Components({
      resolvers: [
        ElementPlusResolver(),// 组件自动导入
        IconResolver({
          //prefix: 'icon',          // 修改Icon组件前缀,不设置则默认为i,禁用则设置为false
          enabledCollections: ["ep"] // 指定collection,即指定为elementplus图标集ep
        }),
      ],
    }),
    Icons({ scale: 1, defaultClass: "inline-block", autoInstall: true }),
  ],
})

main.js 注册器

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

import router from "../src/router/index.js" //导入路由js 

import { createPinia} from 'pinia' //导入状态管理器js 

const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.use(router);


app.mount('#app')

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

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

相关文章

springcloud整合nacos实现服务注册

Nacos是一个开源的分布式系统服务和基础设施解决方案&#xff0c;用于实现动态服务发现、配置管理和服务治理。它可以帮助开发人员和运维团队更好地管理微服务架构中的服务实例、配置信息和服务调用。 Nacos提供了服务注册与发现、动态配置管理、服务路由和负载均衡等功能&…

02-3解析BeautifulSoup

一、基本简介 BeautifulSoup简称&#xff1a;bs4什么是BeatifulSoup&#xff1f;  BeautifulSoup&#xff0c;和lxml一样&#xff0c;是一个html的解析器&#xff0c;主要功能也是解析和提取数据优缺点&#xff1f;  缺点&#xff1a;效率没有lxml的效率高  优点&#xff1…

小游戏:贪吃蛇和俄罗斯方块(Java简单版)

贪吃蛇 package z; import java.awt.Color; import java.awt.EventQueue; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.util.ArrayList; import java.util.List; import java.util.Random;import javax.swin…

畅捷通+数环通iPaaS,实现无代码集成上千款应用

01 关于畅捷通 畅捷通信息化服务专家,为用户提供在线财务软件,云进销存管理软件,移动办公软件,帮助小微企业人、财、货、客的管理,全面服务小微企业并提供社交化、个性化、服务化、小量化的生意管理支持。 企业除了畅捷通&#xff0c;还有大大小小其他的系统&#xff0c;面临着…

听GPT 讲Rust源代码--library/core/src(6)

题目来自 A Gentle Introduction To Rust[1] File: rust/library/core/src/num/dec2flt/common.rs 在Rust源代码中&#xff0c;rust/library/core/src/num/dec2flt/common.rs的作用是定义了一些用于十进制到浮点数转化的共享逻辑。以下是对该文件内容的详细介绍&#xff1a; Bi…

Linux磁盘分区快速上手(讲解详细)

一、磁盘分区 在Linux中&#xff0c;磁盘是通过分区来使用的。分区是将一个硬盘划分成几个逻辑部分来使用&#xff0c;在每个分区中可以存储不同的文件系统。因此&#xff0c;在挂载磁盘之前&#xff0c;我们需要先对磁盘进行分区。磁盘分区的过程可以通过命令行工具或图形界面…

国家药品价格查询官网-在线网站查询方法

查询药品上市价格对于个人和机构来说都是非常有必要的&#xff0c;对个人可以很好的验证该药品是否存在虚高的情况&#xff0c;对药企来说可以根据同类药品市场价格指导自产药品的定价&#xff0c;对其它机构来说了解药品价格可以帮助选择价格合理的药品供应商&#xff0c;降低…

自费出国|药学研究人员赴澳大利亚墨尔本大学访学

澳大利亚的创新药物研发在世界上一直处于领先地位&#xff0c;考虑到签证因素&#xff0c;专职药学研究的H老师将访学目标国家定位在澳大利亚。我们为其落实了墨尔本大学的职位&#xff0c;导师的研究课题与H老师的兴趣高度契合&#xff0c;最终顺利签证并如期出国。 H老师背景…

测试人员如何提交一条高质量的bug

测试人员在测试软件过程中&#xff0c;发现bug是必然的&#xff0c;那么发现bug后就要提交bug到缺陷管理系统中&#xff0c;如何提交一条高质量的bug&#xff0c;是每一个测试人员值得深思的问题&#xff0c;如果bug提交的不规范&#xff0c;不准确会导致开发人员理解错误&…

7条软件测试的基本原则

软件测试的原则是指帮助测试团队有效地利用他们的时间和精力来发现测试项目的隐藏bug的指导方针。从实践和研究中总结得出以下 7 条软件测试的基本原则&#xff0c;以便测试人员在软件测试领域广泛应用。 一、测试证明软件存在缺陷-Testing shows presence of defects 测试只能…

在已安装Anaconda环境下配置沐神(李沐老师)动手学深度学习环境

沐神配置环境视频 B站李沐老师动手学深度学习环境配置视频 在windows中配置沐神深度学习环境 前提&#xff1a;安装了Anaconda基本环境&#xff0c;了解Jupyter NoteBook 1.打开 Anaconda Prompt 2.创建虚拟环境 create conda -n d2l-zh python3.8 pip3.激活虚拟环境 con…

菲律宾shopee怎么推广?shopee菲律宾站点什么好卖?——站斧浏览器

菲律宾shopee怎么推广 首先&#xff0c;要想在Shopee上成功推广自己的店铺&#xff0c;关键是提升店铺的曝光率。有多种方式可以增加店铺的曝光率&#xff0c;其中之一是使用Shopee提供的广告服务。 Shopee广告分为首页广告和搜索广告两种形式。商家可以根据自己的需求选择适…

vue项目中设置background: url() 是行内样式不生效,样式表是可以的

[TOC](vue项目中设置background: url() 是行内样式不生效&#xff0c;样式表是可以的) 首先&#xff1a;如果不是项目中普通的一个index.html中是可以的 一、原因 在Vue项目中&#xff0c;行内样式和样式表的编译规则是有所不同的。当你在Vue组件的行内样式中使用相对路径引用图…

介绍一款 SaaS 服务器监控工具: CloudStats

导读CloudStats 是一个简单而强大的服务器监控和网络监控工具。使用 CloudStats&#xff0c;你可以监控来自世界上任何地方的服务器和网络的所有指标。 最棒的是你不需要有任何特殊的技术技能 - CloudStats 很容易安装在任何数据中心的任何服务器上。 CloudStats 允许你使用任…

创作者焦点:Temple of Dum-Dum(试炼 3)

《Bomkus 博士的试炼》创作的幕后花絮。 《创作者焦点》系列共分为六部分&#xff0c;重点介绍《Bomkus 博士的试炼》的游戏创作过程及其独特的游戏功能。 Temple of Dum-Dum&#xff1a; Temple of Dum-Dum 是 Bomkus 博士试炼中的第三个挑战&#xff0c;该试炼由六项体验组成…

如何利用TSINGSEE青犀智能分析网关算法从人员、设备、行为三大角度进行监狱智能化升级改造

监狱作为关押犯人的重要场所&#xff0c;十分需要全天候全方位无死角的监控&#xff0c;但由于狱警人力有限&#xff0c;无法达到目前的监控需求。并且在监狱中&#xff0c;犯人众多也极易发生口角冲突&#xff0c;如若没有及时处理&#xff0c;就会发生难以挽回的意外。如何更…

实现MQTT协议的服务器端和客户端的双向交互

公司和第三方合作开发一个传感器项目&#xff0c;想要通过电脑或者手机去控制项目现场的传感器控制情况。现在的最大问题在于&#xff0c;现场的边缘终端设备接入的公网方式是无线接入&#xff0c;无法获取固定IP&#xff0c;所以常规的HTTP协议通信就没法做&#xff0c;现在打…

结合 Django 和 Vue.js 打造现代 Web 应用

概要 在 Web 开发的世界里&#xff0c;Django 和 Vue.js 分别是后端和前端两个非常流行的框架。Django 以其强大的后端能力、快速开发以及安全性而著称&#xff0c;而 Vue.js 因其简洁、灵活和易于上手在前端开发领域广受欢迎。 本篇文章将详细介绍如何将 Django 与 Vue.js 结…

AE(2)_tuning时AE的一些策略

1、设置帧率&#xff1a; 修改帧率可以通过修改V_Blank 或者frame length。配置在寄存器中生效。 一帧图像的曝光时间 帧长 * 一行时间。提高帧长&#xff0c;1帧图像的曝光时间就变大了&#xff0c;单位时间内可曝光的帧数就少了&#xff0c;也就是帧率就下降了。这就是项目…

全局异常拦截和Spring Security认证异常的拦截的顺序

&#x1f4d1;前言 本文主要全局异常拦截和Spring Security认证异常的顺序&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…