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. 重启即可
相关文章
|
1天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
3天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1540 5
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
7天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
577 22
|
3天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
201 3
|
10天前
|
JSON 自然语言处理 数据管理
阿里云百炼产品月刊【2024年9月】
阿里云百炼产品月刊【2024年9月】,涵盖本月产品和功能发布、活动,应用实践等内容,帮助您快速了解阿里云百炼产品的最新动态。
阿里云百炼产品月刊【2024年9月】
|
10天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
571 5
|
23天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。
|
6天前
|
XML 安全 Java
【Maven】依赖管理,Maven仓库,Maven核心功能
【Maven】依赖管理,Maven仓库,Maven核心功能
233 3
|
9天前
|
存储 人工智能 搜索推荐
数据治理,是时候打破刻板印象了
瓴羊智能数据建设与治理产品Datapin全面升级,可演进扩展的数据架构体系为企业数据治理预留发展空间,推出敏捷版用以解决企业数据量不大但需构建数据的场景问题,基于大模型打造的DataAgent更是为企业用好数据资产提供了便利。
327 2