vue-element-admin 综合开发三:header组件的实现、vuex的使用、main组件(home页面)的实现

简介: 这篇文章介绍了如何实现一个Vue.js项目中的header组件,使用Vuex进行状态管理,以及创建一个main组件(home页面),并讨论了一些开发中遇到的bug。

导言

一、header组件的实现

引入 几个less。

1. 引入自定义样式(四个 less)

  1. common.less
  2. home.less
  3. reset.less
  4. index.less 中引入了其他三个,在 main.js 中引入这一个即可
    在这里插入图片描述

2. 自定义Header组件

a、创建:commenHeaderMenu.vue

icon官网

<template>
  <header>
    <div class="l-content">
      <el-button plain icon="el-icon-menu" size="mini"></el-button>
    </div>
  </header>
</template>

b、main.vue中引入

在这里插入图片描述

c、页面

在这里插入图片描述

2. 引入下拉菜单

a、编辑:commenHeaderMenu.vue

<template>
  <header>
    <div class="l-content">
      <el-button plain icon="el-icon-menu" size="mini"></el-button>
      <h3 style="color: #fff">首页</h3>
    </div>
    <div class="r-content">
      <el-dropdown trigger="click" szie="mini">
        <span>
          <img class="user" :src="userImg" />
        </span>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item>个人中心</el-dropdown-item>
          <el-dropdown-item>退出</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
  </header>
</template>
<script>
export default {
  name: "commenHeaderMenu",
  data() {
    return {
      userImg: require("../assets/images/user.png"),
    };
  },
};
</script>

b、main.js按需引入

在这里插入图片描述

c、页面

在这里插入图片描述

3. header 最终样式

<style lang="less" scoped>
header {
  display: flex; // 使用flex布局
  height: 100%;
  justify-content: space-between;
  align-items: center; // 水平居中
}
.l-content {
  display: flex;
  align-items: center;
  .el-button {
    margin-right: 20px;
  }
}
.r-content {
  .user {
    width: 40px;
    height: 40px;
    border-radius: 50%;
  }
}
</style>

在这里插入图片描述

在这里插入图片描述

二、vuex的使用、安装、配置

1. 需求描述

现在要实现点击首页左边的icon 来实现侧边栏的收起和展开。但是
icon在组件commenHeaderMenu.vue中
在这里插入图片描述
控制侧边栏的属性在组件commenAsideMenu.vue中
在这里插入图片描述
这两个组件是兄弟组件
在这里插入图片描述
所以设计到 组件间通信的问题。
方法1:使用组件间通信。
方法2:使用vuex进行管理。
这里为了方便,使用vuex进行管理。

2. 安装vuex

npm i vuex or yarn add vuex (npm 会报错,用yarn 即可)
这里报错了,用了很长时间发现了是版本问题,问题描述和解决,在最下面的开发中bug里面。

3. 配置vuex

a、新建:store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
import tab from './tab'

Vue.use(Vuex);

export default new Vuex.Store({
  state: {},
  modules: {
    tab
  }
})

b、新建模块: stroe/tab.js

export default {
  state: {
  },
  mutations: {
  }
}

c、更改:main.js

在这里插入图片描述
到此配置结束

4. 解决 二.1 的需求

a. 编辑store/tab.js模块

将控制展开和封闭属性,封装到 tab/state/isCollapse

export default {
  state: {
    isCollapse: false
  },
  mutations: {
    collapseMenu(state){
      state.isCollapse = !state.isCollapse;
    }
  }
}

b、修改组件:commenAsideMenu.vue

  1. 创建计算函数 isCollapse
    在这里插入图片描述
  2. 删除 data 中 isCollapse
    在这里插入图片描述
  3. 观看页面展示,页面无误,说明组件中使用的关闭/展开属性使用的就是vuex中的数据,通过 this.$store.state.tab.isCollapse; 来引用,在下图的控制台中,也打印出了 this.$store 这个对象。
    ,

c、header 组件 icon 添加事件

在这里插入图片描述

d、修改 Aside 文本样式

在这里插入图片描述

e、页面展示

在这里插入图片描述
在这里插入图片描述

三、main组件的实现

  1. mian组件,也就是 home 页面的内容,更多的是 element-ui 的显示组件哈。
  2. 其中的class样式,也在之前的less中一块引进来了。
  3. 新引入的element 组件,也在 main.js 中 使用 Vue.use 按需引入了
    直接放上页面和数据了。

1. 页面代码

<template>
  <el-row class="home" :gutter="20">
    <!-- 左边部分 -->
    <el-col :span="8" style="margin-top: 20px">
      <!-- 左上 信息-->
      <el-card shadow="hover">
        <div class="user">
          <img :src="userImg" />
          <div class="userInfo">
            <p class="name">Admin</p>
            <p class="access">超级管理员</p>
          </div>
        </div>
        <div class="login-info">
          <p>上次登陆时间:<span>2021-07-19</span></p>
          <p>上次登陆地点:<span>武汉</span></p>
        </div>
      </el-card>
      <!-- 左下表格 -->
      <el-card style="margin-top: 20px; height: 460px">
        <el-table :data="tableData">
          <el-table-column
            v-for="(value, key) in tableLabel"
            :prop="key"
            :label="value"
            :key="key"
          ></el-table-column>
        </el-table>
      </el-card>
    </el-col>
    <!-- 右边部分 -->
    <el-col :span="16" style="margin-top: 20px">
      <!-- 右上 -->
      <div class="num">
        <el-card
          v-for="item in countData"
          :key="item.name"
          :body-style="{ display: 'flex', padding: 0 }"
        >
          <i
            class="icon"
            :class="`el-icon-${item.icon}`"
            :style="{ background: item.color }"
          ></i>
          <div class="detail">
            <p class="num">¥{
  { item.value }}</p>
            <p class="txt">{
  { item.name }}</p>
          </div>
        </el-card>
      </div>
      <!-- 右中 -->
      <el-card style="height: 280px"></el-card>
      <!-- 右下 -->
      <div class="graph">
        <el-card style="height: 260px"></el-card>
        <el-card style="height: 260px"></el-card>
      </div>
    </el-col>
  </el-row>
</template>

<script>

export default {
  name: "Home",
  data() {
    return {
      userImg: require("../../assets/images/user.png"),
      tableData: [
        {
          name: "oppo",
          todayBuy: 100,
          monthBuy: 300,
          totalBuy: 800,
        },
        {
          name: "vivo",
          todayBuy: 100,
          monthBuy: 300,
          totalBuy: 800,
        },
        {
          name: "苹果",
          todayBuy: 100,
          monthBuy: 300,
          totalBuy: 800,
        },
        {
          name: "小米",
          todayBuy: 100,
          monthBuy: 300,
          totalBuy: 800,
        },
        {
          name: "三星",
          todayBuy: 100,
          monthBuy: 300,
          totalBuy: 800,
        },
        {
          name: "魅族",
          todayBuy: 100,
          monthBuy: 300,
          totalBuy: 800,
        },
      ],
      countData: [
        {
          name: "今日支付订单",
          value: 1234,
          icon: "success",
          color: "#2ec7c9",
        },
        {
          name: "今日收藏订单",
          value: 210,
          icon: "star-on",
          color: "#ffb980",
        },
        {
          name: "今日未支付订单",
          value: 1234,
          icon: "s-goods",
          color: "#5ab1ef",
        },
        {
          name: "本月支付订单",
          value: 1234,
          icon: "success",
          color: "#2ec7c9",
        },
        {
          name: "本月收藏订单",
          value: 210,
          icon: "star-on",
          color: "#ffb980",
        },
        {
          name: "本月未支付订单",
          value: 1234,
          icon: "s-goods",
          color: "#5ab1ef",
        },
      ],
      tableLabel: {
        name: "课程",
        totalBuy: "今日购买",
        monthBuy: "本月购买",
      },
    };
  },
  mounted() {
  },
};
</script>

2. 开发到当前:页面展示

在这里插入图片描述

四、开发中bug

1. app.js:275 Uncaught Error: [vuex] store must be called with the new operator

原因:在使用Vuex.Store()的时候忘记加上new了

const store = Vuex.Store({    //Vuex前面少了new
    modules:{
        user
    }
})

改正:

const store = new Vuex.Store({
    modules:{
        user
    }
})

2. vuex版本引发的血案(版本对应)

a、描述

安装 vuex:npm i vuex or yarn add vuex
配置完vuex后,浏览器控制台出错

  1. 第一个红框打印的是 this.$store,说明vuex没有配置成功。
  2. 第二个红框导致出现的错误。
    在这里插入图片描述

b、解决

我看了项目的vue版本 是2.6.14版本,然后通过命令安装的是vuex是4.0.2版本。
然后看了下vuex官网
在这里插入图片描述
意思是:

  1. vue3.x 对应 vuex4.x
  2. vue2.x 对应 vuex3.x
    所以重新下载vuex,指定3版本,

c、下载对应版本

  1. npm i vuex@3.0.0 or yarn add vuex@3.0.0
  2. 重启即可
相关文章
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
这篇文章是关于如何在Vue项目中使用axios进行网络请求、二次封装axios以及使用mockjs模拟响应数据的教程。
495 1
vue-element-admin 综合开发四:axios安装和封装、mock安装/学习/使用
|
缓存
npm install 报 npm ERR! cb()never called!的错误
npm install 报 npm ERR! cb()never called!的错误
2001 0
|
5月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
6426 88
|
JavaScript 容器
vue-element-admin 综合开发二:搭建首页架子、侧边栏、修改默认样式、menu和路由跳转页面初体验
这篇文章详细介绍了如何使用Vue和Element UI搭建一个后台管理系统,包括首页布局、侧边栏、样式调整、菜单和路由配置,以及解决开发中遇到的问题。
1570 1
vue-element-admin 综合开发二:搭建首页架子、侧边栏、修改默认样式、menu和路由跳转页面初体验
|
10月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
962 1
|
JavaScript 前端开发 数据安全/隐私保护
vue3+ts+elementplus写一个登录页面教程
【6月更文挑战第3天】本文介绍了如何使用 Vue 3 和 TypeScript 创建一个登录页面。首先,需安装 Vue CLI,然后创建新项目并启用 TypeScript 支持。接着,创建 `Login.vue` 组件,设计登录表单,包括用户账号、密码和验证码字段,并实现相关验证规则。页面样式包括背景、登录框和按钮等元素的布局与样式。最后,展示了`&lt;script&gt;`部分的代码,包括表单验证逻辑、生成验证码的函数以及登录提交处理。文章还提供了一个登录页面的截图和完整代码示例。
5999 1
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发一:搭建环境:vue-cli创建项目,整合element、vue-router
这篇文章是关于如何使用vue-cli搭建vue环境,并整合Element UI和vue-router来开发一个基础的前端管理后台界面。
556 0
vue-element-admin 综合开发一:搭建环境:vue-cli创建项目,整合element、vue-router
|
人工智能 测试技术 API
Ollama本地模型部署+API接口调试超详细指南
本文介绍了如何使用Ollama工具下载并部署AI大模型(如DeepSeek-R1、Llama 3.2等)。首先,访问Ollama的官方GitHub页面下载适合系统的版本并安装。接着,在终端输入`ollama`命令验证安装是否成功。然后,通过命令如`ollama run Llama3.2`下载所需的AI模型。下载完成后,可以在控制台与AI模型进行对话,或通过快捷键`control+d`结束会话。为了更方便地与AI互动,可以安装GUI或Web界面。此外,Ollama还提供了API接口,默认支持API调用,用户可以通过Apifox等工具调试这些API。
|
SQL XML JavaScript
【若依Java】15分钟玩转若依二次开发,新手小白半小时实现前后端分离项目,springboot+vue3+Element Plus+vite实现Java项目和管理后台网站功能
摘要: 本文档详细介绍了如何使用若依框架快速搭建一个基于SpringBoot和Vue3的前后端分离的Java管理后台。教程涵盖了技术点、准备工作、启动项目、自动生成代码、数据库配置、菜单管理、代码下载和导入、自定义主题样式、代码生成、启动Vue3项目、修改代码、以及对代码进行自定义和扩展,例如单表和主子表的代码生成、树形表的实现、商品列表和分类列表的改造等。整个过程详细地指导了如何从下载项目到配置数据库,再到生成Java和Vue3代码,最后实现前后端的运行和功能定制。此外,还提供了关于软件安装、环境变量配置和代码自动生成的注意事项。
30689 73

热门文章

最新文章