其他分享
首页 > 其他分享> > SPA项目开发之动态树+数据表格+分页

SPA项目开发之动态树+数据表格+分页

作者:互联网

 目标:

  1. 动态树功能
  2. 右侧文章的分页查询功能

准备工作

开发环境下才会引入mockjs,在这里我们需要关闭mock

方法一

方法二(更简便) 

pro环境:生产环境,面向外部用户的环境,连接上互联网即可访问的正式生产环境

dev环境:开发环境,外部用户无法访问,开发人员使用

开启eclipse项目和spa项目

使用到的表及数据

 

(有一级节点和二级节点)

一,LeftNav.vue动态树功能

1,在create方法中通过Ajax进行数据读取

created() {
      // 拿到左侧树形菜单的地址
      let url = this.axios.urls.SYSTEM_MENU_TREE;
      this.axios.post(url, {}).then((resp) => {
        console.log(resp);
      }).catch(function(error) {
        console.log(error);
      });
      // 监听bus,bus是vue实例,所以有$on方法
      // 定义的方法,v就是传递来的this.collapsed变量
      this.$root.Bus.$on("collapsed-aside", (v) => {
        this.collapsed = v;
      });
    }

用正确的数据库账号和密码登录

F2查看控制台数据 ,拿到的数据呈现父子层级关系

2,template放单个左侧菜单样式

 <el-submenu index="1-4">
      <template slot="title">
        <i class="el-icon-location"></i>
        <span>一级菜单</span>
      </template>
      <el-menu-item index="1-4-1">
        <i class="el-icon-location"></i>
        <span>二级菜单</span>
      </el-menu-item>
    </el-submenu>

定义一个menus数组用来存放所有的一级菜单(数据从钩子函数中获取的data里面的result中获取,可以看到是一个数组), 并在钩子函数中对定义的menus进行修改(钩子函数可以对定义的变量进行修改)

<script>
  export default {
    data() {
      return {
        collapsed: false,
        // 定义一个数组这里存放所有的一级菜单
        menus: []

      }
    },
    // 钩子函数,主键被访问就执行
    created() {
      // 拿到左侧树形菜单的地址
      let url = this.axios.urls.SYSTEM_MENU_TREE;

      this.axios.post(url, {}).then((resp) => {
        console.log(resp);
        // 钩子函数可以对定义的变量进行修改
        this.menus = resp.data.result;

      }).catch(function(error) {
        console.log(error);
      });
      // 监听bus,bus是vue实例,所以有$on方法
      // 定义的方法,v就是传递来的this.collapsed变量
      this.$root.Bus.$on("collapsed-aside", (v) => {
        this.collapsed = v;
      });
    }
  }
</script>

3,将一级菜单和二级菜单遍历出来

:index="'id_'+m.treeNodeId" (必须这么拼接)通过treeNodeId标识菜单的唯一性

    <el-submenu :index="'id_'+m.treeNodeId" v-for="m in menus">
      <template slot="title">
        <i :class="m.icon"></i>
        <span>{{m.treeNodeName}}</span>
      </template>
      <el-menu-item :index="'id_'+m2.treeNodeId" v-for="m2 in m.children">
        <i :class="m2.icon"></i>
          <span>{{m2.treeNodeName}}</span>
      </el-menu-item>
    </el-submenu>

效果如下

4,点击文章管理进行跳转

key是id标识唯一性, index是路由跳转路径

      <el-menu-item :key="'id_'+m2.treeNodeId" :index="m2.url" v-for="m2 in m.children">
        <i :class="m2.icon"></i>
        <span>{{m2.treeNodeName}}</span>
      </el-menu-item>

标识index为跳转路径

router :default-active="$route.path"是用来指定要跳的组件,与 :index合并使用;

  <el-menu  router :default-active="$route.path" class="el-menu-vertical-demo" background-color="#334157" text-color="#fff"
    active-text-color="#ffd04b" :collapse="collapsed">

二,右侧文章的数据表格

1,新建sys目录和Article.vue文件 

2,配置路由

AppMain.vuev定义锚点

 <el-main class="main-center">
        <router-view></router-view>
      </el-main>

src/router/index.js

import Articles from '@/views/sys/Articles'

 要放在AppMain.vue的children下

{
          path: '/sys/Articles',
          name: 'Articles',
          component: Articles
        }

表格组件代码(外层记得放一个div,因为template里面只允许放一个根标签)

   <div>
    <!-- 这是文章列表组件 -->
    <!--列表-->
    <el-table size="small" :data="listData" highlight-current-row border element-loading-text="拼命加载中"
      style="width: 100%;">
      <el-table-column align="center" type="selection" width="60">
      </el-table-column>
      <el-table-column sortable prop="id" label="文章id" width="300">
      </el-table-column>
      <el-table-column sortable prop="title" label="文章标题" width="300">
      </el-table-column>
      <el-table-column sortable prop="body" label="文章内容" width="300">
      </el-table-column>
    </el-table>
  </div>

 定义一个listData数组用来存放所有的文章(数据从钩子函数中获取的data里面的result中获取,可以看到是一个数组), 并在钩子函数中对定义的listData进行修改(钩子函数可以对定义的变量进行修改)

<script>
  export default {
    name: 'Articles',
    data() {
      return {
        listData: []
      }
    },
    created() {
      // 拿到文章列表的地址
      let url = this.axios.urls.SYSTEM_ARTICLE_LIST;

      this.axios.post(url, {}).then((resp) => {
        console.log(resp);
        // 钩子函数可以对定义的变量进行修改
        this.listData = resp.data.result;

      }).catch(function(error) {
        console.log(error);
      });
      // 监听bus,bus是vue实例,所以有$on方法
      // 定义的方法,v就是传递来的this.collapsed变量
      this.$root.Bus.$on("collapsed-aside", (v) => {
        this.collapsed = v;
      });
    }
  }
</script>

 效果如下

 三,数据表格的分页

1、分页查询功能

可以从element官网中找到相关组件

 @size-change事件,每页显示的数据

@current-change事件,当前页改变的事件

分页条

    <el-pagination style="margin-top: 20px;" @size-change="handleSizeChange" @current-change="handleCurrentChange"
      :current-page="formInline.page" :page-sizes="[10, 20, 30, 50]" :page-size="100"
      layout="total, sizes, prev, pager, next, jumper" :total="formInline.total">
    </el-pagination>

2、定义组件中的数据和方法

<script>
  export default {
    name: 'Articles',
    data() {
      return {
        listData: [],
        formInline: {
          page: 1,
          rows: 10,
          total: 0,
          title: ''
        }
      }
    },
    methods: {
      handleSizeChange(rows) {
        console.log("当前页查询数据量:" + rows)
        this.formInline.page = 1;
        this.formInline.rows = rows;
        this.search();
      },
      handleCurrentChange(page) {
        console.log("当前页为:" + page)
        this.formInline.page = page;
        this.search();
      },
      doSearch(param) {
        // 拿到文章列表的地址
        let url = this.axios.urls.SYSTEM_ARTICLE_LIST;
        this.axios.post(url, param).then((resp) => {
          console.log(resp);
          // 钩子函数可以对定义的变量进行修改
          this.listData = resp.data.result;
          this.formInLine.total = resp.data.pageBean.total;
        }).catch(function(error) {
          console.log(error);
        });
        // 监听bus,bus是vue实例,所以有$on方法
        // 定义的方法,v就是传递来的this.collapsed变量
        this.$root.Bus.$on("collapsed-aside", (v) => {
          this.collapsed = v;
        });
      },
      // 搜索功能
      search() {
        this.doSearch(this.formInline);
      }
    },
    created() {
      this.doSearch({});
    }
  }
</script>

为了方便的处理传参和不传参问题,将create中的代码挪到doSearch中,成为公共方法

让create调用doSearch方法,这里不需要传参

搜索功能 

    <!-- 搜索筛选 -->
    <el-form :inline="true" :model="formInline" class="user-search">
      <el-form-item label="搜索:">
        <el-input size="small" v-model="formInline.title" placeholder="文章标题"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button size="small" type="primary" icon="el-icon-search" @click="search">搜索</el-button>
        <el-button size="small" type="primary" icon="el-icon-plus" @click="handleEdit()">添加</el-button>
      </el-form-item>
    </el-form>

标签:console,分页,表格,collapsed,page,SPA,data,resp,log
来源: https://blog.csdn.net/weixin_53436351/article/details/121267455