• Vue 的动态菜单表格数据展示以及分页查询实现


    前言:

    在上一篇博客中实现了左侧菜单栏,今天我就来实现与后台的交互即动态的展示数据库的数据,还有数据表格的实现以及分页。

    一,导航菜单交互后台

    要确定静态树形菜单的排版 再通过后台获取树形节点的数据  通过拿到的数据,渲染树形节点 v-for 渲染节点  定义渲染节点的变量

    ElementUI官网:

    Element - The world's most popular Vue UI frameworkicon-default.png?t=N7T8https://element.eleme.cn/#/zh-CN/component/pagination

     LeftNav.vue:

    1. <template>
    2. <el-menu router :default-active="$route.path" default-active="2" class="el-menu-vertical-demo" background-color="#334157" text-color="#fff"
    3. active-text-color="#ffd04b" :collapse="collapsed">
    4. <!-- <el-menu default-active="2" :collapse="collapsed" collapse-transition router :default-active="$route.path" unique-opened class="el-menu-vertical-demo" background-color="#334157" text-color="#fff" active-text-color="#ffd04b"> -->
    5. <div class="logobox">
    6. <img class="logoimg" src="../assets/img/logo.png" alt="">
    7. </div>
    8. <el-submenu v-for="m in menus" :index="'idx'+m.id" :key="'key'+m.id">
    9. <template slot="title">
    10. <i class="m.icon"></i>
    11. <span>{{m.text}}</span>
    12. </template>
    13. <el-menu-item v-for="m2 in m.modules" :index="m2.url" :key="'key'+m2.id">
    14. <i class="m2.icon"></i>
    15. <span>{{m2.text}}</span>
    16. </el-menu-item>
    17. </el-submenu>
    18. </el-menu>
    19. </template>
    20. <script>
    21. // 从axios中导出数据☞
    22. export default {
    23. data() {
    24. return {
    25. // 展开
    26. collapsed: false,
    27. // 保存了左侧值
    28. menus: []
    29. }
    30. },
    31. created() {
    32. this.$root.bus.$on('shrink', t => {
    33. this.collapsed = t;
    34. });
    35. // 获取到左侧菜单的url
    36. let url = this.axios.urls.SYSTEM_MENUS;
    37. // 参数传递可以不传
    38. this.axios.get(url, {}).then(r => {
    39. this.menus = r.data.rows;
    40. }).catch(e => {
    41. });
    42. }
    43. }
    44. </script>
    45. <style>
    46. .el-menu-vertical-demo:not(.el-menu--collapse) {
    47. width: 240px;
    48. min-height: 400px;
    49. }
    50. .el-menu-vertical-demo:not(.el-menu--collapse) {
    51. border: none;
    52. text-align: left;
    53. }
    54. .el-menu-item-group__title {
    55. padding: 0px;
    56. }
    57. .el-menu-bg {
    58. background-color: #1f2d3d !important;
    59. }
    60. .el-menu {
    61. border: none;
    62. }
    63. .logobox {
    64. height: 40px;
    65. line-height: 40px;
    66. color: #9d9d9d;
    67. font-size: 20px;
    68. text-align: center;
    69. padding: 20px 0px;
    70. }
    71. .logoimg {
    72. height: 40px;
    73. }
    74. </style>

    关于default-active="$route.path"介绍

    在Vue中,default-active是一个用于设置导航栏默认激活项的属性。它的值可以通过$route.path来动态获取当前路由的路径。

    通常,在使用Vue的路由器(Vue Router)时,可以通过设置default-active来根据当前路由来设置导航栏的默认激活项。

    具体用法如下:

    1. 首先,确保已经安装并配置了Vue Router。

    2. 在导航栏组件中,找到对应的菜单项,并使用v-bind指令绑定default-active属性,例如:

    <router-link to="/home" v-bind:default-active="$route.path === '/home'">主页</router-link>
    

    以上代码中的default-active属性使用了$route.path === '/home’表达式来判断当前路由是否是主页,如果是则会给该菜单项添加一个默认激活的样式。

    1. 当路由切换时,default-active会根据$route.path的变化自动更新,确保当前路由所对应的菜单项保持激活状态。

    总结起来,default-active="$route.path"的含义是将导航栏的默认激活项与当前路由的路径进行绑定,实现动态设置导航栏的激活状态。这样可以根据当前路由的变化,自动更新导航栏的样式,提升用户体验

    定义组件的和路由的关系

    index.js

    1. import Vue from 'vue'
    2. import Router from 'vue-router'
    3. import HelloWorld from '@/components/HelloWorld'
    4. import AppMain from '@/components/AppMain'
    5. import LeftNav from '@/components/LeftNav'
    6. import TopNav from '@/components/TopNav'
    7. // 导入Login登录组件
    8. import Login from '@/views/Login'
    9. // 导入Login登录组件
    10. import Register from '@/views/Register'
    11. import AddBook from '@/views/book/AddBook'
    12. import BookList from '@/views/book/BookList'
    13. Vue.use(Router)
    14. export default new Router({
    15. routes: [{
    16. path: '/',
    17. name: 'Login',
    18. component: Login
    19. },
    20. {
    21. path: '/Register',
    22. name: 'Register',
    23. component: Register
    24. },
    25. {
    26. path: '/HelloWorld',
    27. name: 'HelloWorld',
    28. component: HelloWorld
    29. },
    30. {
    31. path: '/AppMain',
    32. name: 'AppMain',
    33. component: AppMain,
    34. children:[{
    35. path: '/TopNav',
    36. name: 'TopNav',
    37. component: TopNav
    38. }, {
    39. path: '/LeftNav',
    40. name: 'LeftNav',
    41. component: LeftNav
    42. },
    43. {
    44. path: '/book/AddBook',
    45. name: 'AddBook',
    46. component: AddBook
    47. }, {
    48. path: '/book/BookList',
    49. name: 'BookList',
    50. component: BookList
    51. }]
    52. }
    53. ]
    54. })

    action.js

    1. /**
    2. * 对后台请求的地址的封装,URL格式如下:
    3. * 模块名_实体名_操作
    4. */
    5. export default {
    6. 'SERVER': 'http://localhost:8080', //服务器
    7. 'SYSTEM_USER_DOLOGIN': '/user/userLogin', //登陆
    8. 'SYSTEM_USER_DOREG': '/user/Register', //注册
    9. 'SYSTEM_MENUS': '/module/queryRootNode', //左侧菜单树
    10. 'BOOK_LIST': '/book/queryBookPager', //书籍列表
    11. 'getFullPath': k => { //获得请求的完整地址,用于mockjs测试时使用
    12. return this.SERVER + this[k];
    13. }
    14. }

    二,数据表格

    BookList.vue

    1. <template>
    2. <div class="books" style="padding: 20px;">
    3. <!-- 搜索框 -->
    4. <el-form :inline="true" class="demo-form-inline">
    5. <el-form-item label="书籍名称">
    6. <el-input size="small" v-model="bookname" placeholder="书籍名称"></el-input>
    7. </el-form-item>
    8. <el-form-item>
    9. <el-button size="small" type="primary" @click="onSubmit">查询</el-button>
    10. </el-form-item>
    11. </el-form>
    12. <!-- 数据表格 -->
    13. <template>
    14. <el-table :data="tableData" border style="width: 100%">
    15. <el-table-column align="center" type="selection" min-width="1">
    16. </el-table-column>
    17. <el-table-column sortable prop="id" label="编号ID" min-width="2">
    18. </el-table-column>
    19. <el-table-column sortable prop="bookname" label="书籍名称" min-width="2">
    20. </el-table-column>
    21. <el-table-column sortable prop="price" label="书籍价格" min-width="2">
    22. </el-table-column>
    23. <el-table-column sortable prop="booktype" label="书籍类别" min-width="2">
    24. </el-table-column>
    25. </el-table>
    26. </template>
    27. <!-- 分页 -->
    28. <div class="block">
    29. <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="page"
    30. :page-sizes="[10, 20, 30, 40]" :page-size="rows" layout="total, sizes, prev, pager, next, jumper"
    31. :total="total">
    32. </el-pagination>
    33. </div>
    34. </div>
    35. </template>
    36. <script>
    37. export default {
    38. data() {
    39. return {
    40. bookname: '',
    41. tableData: [],
    42. page: 1,
    43. rows: 10,
    44. total: 0
    45. }
    46. },
    47. methods: {
    48. // 当前页大小
    49. handleSizeChange(r) {
    50. let params = {
    51. bookname: this.bookname,
    52. rows: r,
    53. page: this.page
    54. }
    55. this.query(params);
    56. // 当前页码
    57. },
    58. handleCurrentChange(p) {
    59. let params = {
    60. bookname: this.bookname,
    61. rows: this.rows,
    62. page: p
    63. }
    64. this.query(params);
    65. },
    66. query(params) {
    67. let url = this.axios.urls.BOOK_LIST;
    68. this.axios.get(url, {
    69. params: params
    70. }).then(r => {
    71. console.log(r);
    72. this.tableData = r.data.rows;
    73. this.total = r.data.total;
    74. }).catch(e => {
    75. });
    76. },
    77. onSubmit() {
    78. let params = {
    79. bookname: this.bookname
    80. }
    81. this.query(params);
    82. }
    83. },
    84. created() {
    85. this.query({});
    86. }
    87. }
    88. </script>
    89. <style>
    90. </style>

    效果展示:

  • 相关阅读:
    一文读懂VMware虚拟化技术(含超融合)
    腾讯强推的599页Netty进阶神技,完美诠释Netty
    特征降维学习笔记(pca和lda)(1)
    公开课|“技术+法律”隐私计算如何助力数据合规
    含文档+PPT+源码等]精品基于Uniapp+SSM实现的酒品移动电商平台app[包运行成功]Android毕业设计Java项目源码论文
    从零学算法(LCR 170)
    AI图片生成 discord 使用midjourney
    Android开发笔记(一百八十九)利用LAME录制MP3音频
    2023-10-09 LeetCode每日一题(最小和分割)
    Android学习笔记 42. RxJava基本使用
  • 原文地址:https://blog.csdn.net/m0_73647713/article/details/133319139