VUE笔记(八)项目实战

这篇具有很好参考价值的文章主要介绍了VUE笔记(八)项目实战。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、后台首页

1、首页布局

用于布局的容器组件,方便快速搭建页面的基本结构:

<el-container>:外层容器。当子元素中包含 <el-header><el-footer> 时,全部子元素会垂直上下排列,否则会水平左右排列。

<el-header>:顶栏容器。

<el-aside>:侧边栏容器。

<el-main>:主要区域容器。

<el-footer>:底栏容器。

<template>
   <el-container>
      <!-- 侧边栏 -->
      <el-aside width="220px">asider</el-aside>
      <el-container>
          <el-header>header</el-header>
          <el-main>main</el-main>
      </el-container>
   </el-container>
</template>
2、顶部栏
<el-row type="flex" style="align-items:center">
    <el-col :span="6">
        <el-row>
            <el-col :span="6">
                <i class="el-icon-s-fold" style="font-size:24px" v-if="!isCollpase"></i>
                <i class="el-icon-s-unfold" style="font-size:24px" v-else></i>
                <i class="el-icon-refresh-left" style="font-size:24px"></i>
           </el-col>
          <el-col :span="18">
            <el-breadcrumb separator="/" style="line-height:20px">
                <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
                <el-breadcrumb-item>控制面板</el-breadcrumb-item>
                <el-breadcrumb-item>工作台</el-breadcrumb-item>
            </el-breadcrumb>
          </el-col>
       </el-row>
    </el-col>
    <el-col :span="4" :offset="14">
         <el-row type="flex" style="align-items:center">
              <el-col :span="8">
                  <el-avatar :size="45" src="https://woniuimage.oss-cn-                                                                  hangzhou.aliyuncs.com/woniuimage/teacher/20220222/abc7a6e787be41d0b12aa41e429b71d2.png" 
                             class="avatar"></el-avatar>
              </el-col>
              <el-col :span="8">个人中心</el-col>
                 <el-col :span="8">退出系统</el-col>
              </el-row>
      </el-col>
</el-row>

二、菜单栏

1、静态菜单
2、动态菜单
  • 更改request.js文件

需要在请求拦截器中为头信息中添加Authorization,它的值是从localStorage中获取的token的信息

axios.interceptors.request.use(config => {
    config.headers.Authorization=localStorage.getItem('token')
    return config
})
  • 在api/modules/users.js文件中编写获取权限菜单的方法

export default{
    getAuthMenus:()=>request.get('/menus/getAuthMenus')
}
  • 在Home页面中,在created生命周期函数中调用获取权限菜单的方法

export default {
  data(){
    return{
      menudata:[]
    }
  },
  methods:{
    async getAuthMenus(){
      let result=await this.$api.users.getAuthMenus() 
      console.log(result);
      this.menudata=result.data
    }
  },
  created(){
    this.getAuthMenus()
  }
}
  • 在页面中进行渲染

<el-menu 
    background-color="#202743" 
    text-color="#fff" 
    active-text-color="orange"
    :unique-opened="true">
    <!-- 使用v-for嵌套完成一二级菜单的渲染 -->
    <el-submenu :index="item._id" v-for="item in menudata" :key="item._id">
        <template slot="title">
            <i :class="item.icon"></i>
            <span>{{item.title}}</span>
        </template>
        <el-menu-item :index="subitem._id" v-for="subitem in item.children" :key="subitem._id">
            <i :class="subitem.icon"></i>
            <span slot="title">{{subitem.title}}</span>
        </el-menu-item>
    </el-submenu>            
 </el-menu>
3、路由鉴权
  • 在api/modules/users.js文件中编写获取用户信息的api方法

import request from '@/api/request'
​
export default{
    getUserInfo:()=>request.get('/users/getUserInfo')
}
  • 在router/index.js中通过导航独享守卫完成路由鉴权

{
        path:'/home',
        component:()=>import('@/views/Home.vue'),
        beforeEnter:async(to,from,next)=>{
          //从localstroage获取token信息
          let token=localStorage.getItem('token')
          if(!token){
            // Message.error('您还没有登录,请先登录')
            Vue.prototype.$message.error('您还没有登录,请先登录')
            router.replace('/login')
          }else{
            let result=await Vue.prototype.$api.users.getUserInfo()
            if(result.code){
                next()
            }
          }
        }
 }
  • 在request.js文件中对于401错误进行处理

axios.interceptors.response.use(response => {
    return response.data
}, ({ response }) => {
    if (response) {
        switch (response.status) {
            case 401:
                Message.error('您的token已失效,请重新登录') 
                router.replace('/login')
                break
            case 404:
                break
            case 500:
                break
        }
    }
})
4、菜单的路由跳转
  • 在Home.vue组件的el-menu中设置router="true"

<el-menu 
     background-color="#202743" 
     text-color="#fff" 
     active-text-color="orange"
     :unique-opened="true"
     :router="true">
</el-menu>
  • 在el-menu下的el-menu-item中将index的值改为subItem.path

 <el-menu-item :index="subitem.path" v-for="subitem in item.children" :key="subitem._id">
         <i :class="subitem.icon"></i>
         <span slot="title">{{subitem.title}}</span>
  </el-menu-item>
  • 在el-main中配置二级路由出口

<el-main>
     <router-view></router-view>
 </el-main>
  • 在router/index.js中配置动态路由操作

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '@/views/Home.vue'
Vue.use(VueRouter)
​
const addRoutes=async(data)=>{
  router.addRoute({
    path:'/home',
    component:Home,
    children:data.map(item=>{
      return{
        path:item.path.substring(item.path.lastIndexOf("/")+1),
        component:()=>import(`@/views${item.permission}.vue`)
      }
    })
  })
}
​
const routes = [
  {
    path: '/login',
    component: () => import('@/views/Login.vue')
  }
]
const router = new VueRouter({
  routes
})
router.beforeEach(async(to,from,next)=>{
  console.log('********全局守卫**********');
  if(to.path=="/login"){
    next()
  }else{
    let token=localStorage.getItem('token')
    if(!token){
      Vue.prototype.$message.error('您还没有登录,请先登录')
      router.replace('/login')
    }else{
      let result=await Vue.prototype.$api.users.getUserInfo()
      console.log('result',result);
      if(result.code){
        next()
        if(Vue.prototype.$code!=1){
          addRoutes(result.data.permissionList)
          Vue.prototype.$code=1
        }
      }
    }
  }
})
​
export default router
5、菜单折叠
  • 在Home.vue文件中定义数据isCollpase

export default {
  data(){
    return{
      isCollapse:false,
    }
  }
}
  • <el-header>区域添加折叠和展开按钮,并根据isCollapse的值控制这两个按钮的显示或隐藏

<el-aside>
     <i v-if="!isCollapse" class="el-icon-s-fold" style="margin-left:190px"></i>
     <i v-else class="el-icon-s-unfold" style="margin-left:40px"></i>
    <!--...其余代码省略-->   
</el-aside>
  • 为展开和折叠按钮添加绑定单击事件

<el-aside>
     <i v-if="!isCollapse" class="el-icon-s-fold" @click="toggleCollpase" style="margin-left:190px"></i>
     <i v-else class="el-icon-s-unfold" @click="toggleCollpase" style="margin-left:40px"></i>
    <!--...其余代码省略-->   
</el-aside>
methods: {
    toggleCollpase(){
      this.isCollapse=!this.isCollapse;
    }
}
  • <el-menu>标签中添加collpase属性来控制菜单的折叠或展开

<el-menu :collapse="isCollapse">
  • <el-aside>中动态设置菜单栏的宽度,同时删除掉之前style="width: 200px"

<el-aside :width="isCollapse?'68px':'220px'">
  • 取消切换动画

<el-menu :collapse-transition="false">

三、样式穿透

1、组件之间的样式冲突问题

默认情况下,写在.vue组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题

导致组件之间样式冲突的根本原因是

  • 单页面应用程序中,所有组件的DOM结构,都是基于唯一的index.html页面进行呈现的。

  • 每个组件的样式,都会影响整个index.html页面中的DOM元素。

2、scoped的底层实现原理

解决样式冲突问题的办法是在<style>标签之间添加一个scoped属性

<style scoped>
 
</style>

其实scoped的底层原理是使用了css的属性选择器来完成的。

<template>
    <h2 data-v-001>班级列表</h2>
</template>
<style>
  h2[data-v-001]{
    color: red;
  }
</style>
3、样式穿透

复制elementui案例中的样式,复制后边框出不来,要想解决样式穿透问题

样式穿透只存在于局部样式中,即<style>中添加了scoped属性

  • >>>/deep/:作用于CSS

  • ::v-deep:作用于SASS文章来源地址https://www.toymoban.com/news/detail-676758.html

<style lang="scss" scoped>
.avatar-uploader ::v-deep .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar-uploader ::v-deep .el-upload:hover {
  border-color: #409eff;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>v

到了这里,关于VUE笔记(八)项目实战的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 迈向三维:vue3+Cesium.js三维WebGIS项目实战

    写在前面:随着市场对数字孪生的需求日益增多,对于前端从业者的能力从对框架vue、react的要求,逐步扩展到2D、3D空间的交互,为用户提供更紧密的立体交互。近年来前端对GIS的需求日益增多。本文将记录WebGIS的学习之旅,从实战项目入门,挖掘Cesium.js API,并逐步丰富项目

    2024年04月24日
    浏览(68)
  • 【前端vue升级】vue2+js+elementUI升级为vue3+ts+elementUI plus

    gogo code 是一个基于 AST (源代码的抽象语法结构树状表现形式)的 JavaScript/Typescript/HTML 代码转换工具,可以用它来构建一个代码转换程序来帮助自动化完成如框架升级、代码重构、多平台转换等工作。 当前 GoGoCode 支持解析和操作如下类型的代码: ○JavaScript(JSX) ○Typescript

    2024年02月12日
    浏览(53)
  • 【Vue】Vue2创建移动端项目实战教程,创建移动端项目保姆级教程,设置axios,utils工具包,vue.fonfig.js配置项 (下)

    这里是创建移动端项目 【Vue】Vue2.x创建项目全程讲解,保姆级教程,手把手教,Vue2怎么创建项目(上) 【Vue】Vue2创建移动端项目实战教程,创建移动端项目保姆级教程,接上一篇创建Vue2项目(中) 【Vue】Vue2创建移动端项目实战教程,创建移动端项目保姆级教程,设置ax

    2024年02月13日
    浏览(53)
  • 【SpringBoot+Vue】全网最简单但实用的前后端分离项目实战笔记 - 项目概述

    配套视频地址:https://www.bilibili.com/video/BV1dG4y1T7yp/ 如果您需要原版笔记,请up喝口水,可以上我的淘宝小店 青菜开发资料 购买,或点击下方链接直接购买: 源码+PDF版本笔记 源码+原始MD版本笔记 感谢支持! 通过学习本项目,深刻理解前后端分离的思想,具备独立搭建前后端

    2024年02月12日
    浏览(55)
  • 【SpringBoot+Vue】全网最简单但实用的前后端分离项目实战笔记 - 后端

    配套视频地址:https://www.bilibili.com/video/BV1dG4y1T7yp/ 如果您需要原版笔记,请up喝口水,可以上我的淘宝小店 青菜开发资料 购买,或点击下方链接直接购买: 源码+PDF版本笔记 源码+原始MD版本笔记 感谢支持! 创建springboot项目:2.7.8 pom依赖 yml 测试 编写代码生成器 启动类加注

    2024年02月04日
    浏览(57)
  • 【SpringBoot+Vue】全网最简单但实用的前后端分离项目实战笔记 - 前端

    配套视频地址:https://www.bilibili.com/video/BV1dG4y1T7yp/ 如果您需要原版笔记,请up喝口水,可以上我的淘宝小店 青菜开发资料 购买,或点击下方链接直接购买: 源码+PDF版本笔记 源码+原始MD版本笔记 感谢支持! 官网:https://nodejs.org 注意,node可以比我稍低,但不要更高 https://p

    2024年01月17日
    浏览(44)
  • Vue项目中实现ElementUI按需引入

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料可以找我免

    2024年02月04日
    浏览(43)
  • Vue&elementui动态渲染Radio,Checkbox,笔记

    2024年02月11日
    浏览(39)
  • Vue3项目中引入ElementUI使用详解

    ElementUI 是一个强大的PC端UI组件框架,它不依赖于vue,但是却是当前和vue配合做项目开发的一个比较好的ui框架,其包含了布局( layout ),容器( container )等各类组件,基本上能满足日常网站的搭建开发。针对vue2和vue3都有对应的组件版本,本文主要介绍在vue3中如何引入使用

    2024年02月10日
    浏览(51)
  • 【Vue H5项目实战】从0到1的自助点餐系统—— 搭建脚手架(Vue3.2 + Vite + TS + Vant + Pinia + Node.js)

    H5 项目基于 Web 技术,可以在智能手机、平板电脑等移动设备上的浏览器中运行,无需下载和安装任何应用程序,且H5 项目的代码和资源可以集中在服务器端进行管理,只需更新服务器上的代码,即可让所有顾客访问到最新的系统版本。 本系列将以肯德基自助点餐页面为模板

    2024年02月13日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包