Element-06.案例

一.目标

实现下面这个页面,表格中的数据使用axois异步加载数据

二.实现步骤 

首先在vue项目的views文件夹中新建一个tlias文件夹,用来存储该案例的相关组件。员工页面组件(EmpView.vue)和部门页面组件(DeptView.vue)分别在tlias文件夹中创建好。

在App.vue中的<template>标签中引入<emp-view>标签,并在<script>标签中导入EmpView.vue组件。 components中加入EmpView组件。

<!-- 模板部分,由他生成HTML代码  相当于vue当中的视图部分 -->
<template>
  <div>   <!-- div是根标签,一个<template>标签中只能有一个根标签,也即只能有一个<template>标签 -->
    <!-- <h1>{{ message }}</h1> -->
     <!-- <element-view></element-view> -->
    <emp-view></emp-view>
    <!-- <router-view></router-view> -->
  </div>
</template>

<!-- JS代码,定义vue当中的数据模型以及当中的方法 -->
<script>
/* 
import ElementView from './views/element/ElementView.vue'  
    将ElementView.vue组件文件导入并重新命名为ElementView  
    注意:<template>标签里面没有定义标签,那么import的话会报错
*/
  import EmpView from './views/tlias/EmpView.vue'
  export default {
    components: { EmpView },   // components里面也不能有<template>中未定义的标签的vue组件
    data () {
        return {
          /* message:"Hello Vue"     */
        }
    },
    methods: {
        
    }
  }
</script>

<!-- 定义CSS样式 -->
<style>

</style>

1.页面基本布局

        首先页面呈现出顶栏,左边栏,然后主区域的整体布局,因此要实现这种布局。我们在element组件中找到这一布局。

 然后找到对应的代码复制到员工页面组件的<template>标签中。

<el-container>
  <el-header>Header</el-header>
  <el-container>
    <el-aside width="200px">Aside</el-aside>
    <el-main>Main</el-main>
  </el-container>
</el-container>

浏览器页面结构如下: 

 

在实现了基本布局后,发现这三部分并没有边框线,因此要在这三部分中加上边框线。

 第一行代码改下:

<el-container style="height: 800px; border: 1px solid #eee">

下面在<el-header>标签中设置要展示的标题。

<el-header style="font-size: 40px; background-color: #6495ED;">tlias智能学习辅助系统</el-header>

header部分设计好后,接下来在<el-aside>标签中设置我们需要的样式 。首先在element组件库中寻找符合我们要求的样式。

<el-aside width="200px" style="background-color: rgb(238, 241, 246)">
    <el-menu :default-openeds="['1', '3']">
      <el-submenu index="1">
        <template slot="title"><i class="el-icon-message"></i>导航一</template>
        <el-menu-item-group>
          <template slot="title">分组一</template>
          <el-menu-item index="1-1">选项1</el-menu-item>
          <el-menu-item index="1-2">选项2</el-menu-item>
        </el-menu-item-group>
        <el-menu-item-group title="分组2">
          <el-menu-item index="1-3">选项3</el-menu-item>
        </el-menu-item-group>
        <el-submenu index="1-4">
          <template slot="title">选项4</template>
          <el-menu-item index="1-4-1">选项4-1</el-menu-item>
        </el-submenu>
      </el-submenu>
      <el-submenu index="2">
        <template slot="title"><i class="el-icon-menu"></i>导航二</template>
        <el-menu-item-group>
          <template slot="title">分组一</template>
          <el-menu-item index="2-1">选项1</el-menu-item>
          <el-menu-item index="2-2">选项2</el-menu-item>
        </el-menu-item-group>
        <el-menu-item-group title="分组2">
          <el-menu-item index="2-3">选项3</el-menu-item>
        </el-menu-item-group>
        <el-submenu index="2-4">
          <template slot="title">选项4</template>
          <el-menu-item index="2-4-1">选项4-1</el-menu-item>
        </el-submenu>
      </el-submenu>
      <el-submenu index="3">
        <template slot="title"><i class="el-icon-setting"></i>导航三</template>
        <el-menu-item-group>
          <template slot="title">分组一</template>
          <el-menu-item index="3-1">选项1</el-menu-item>
          <el-menu-item index="3-2">选项2</el-menu-item>
        </el-menu-item-group>
        <el-menu-item-group title="分组2">
          <el-menu-item index="3-3">选项3</el-menu-item>
        </el-menu-item-group>
        <el-submenu index="3-4">
          <template slot="title">选项4</template>
          <el-menu-item index="3-4-1">选项4-1</el-menu-item>
        </el-submenu>
      </el-submenu>
    </el-menu>
  </el-aside>

将代码删减成为我们所需要的样子。

<el-aside width="220px" style="background-color: rgb(238, 241, 246); border: 1px solid #eee">
                    <el-menu :default-openeds="['1', '3']">
                        <el-submenu index="1">
                            <template slot="title"><i class="el-icon-message"></i>系统信息管理</template>
                            <el-menu-item-group>
                                <el-menu-item index="1-1">
                                    <router-link to="/dept">部门管理</router-link>    
                                </el-menu-item>
                                <el-menu-item index="1-2">
                                    <router-link to="/emp">员工管理</router-link>    
                                </el-menu-item>
                            </el-menu-item-group>
                        </el-submenu>
                    </el-menu>
                </el-aside>

header和aside设计好后,下面主要设计main部分。

2.页面组件实现

在main区域中首先分为以下几个部分:

最上面是表单,中间是表格,下面是分页栏。 因此需要这三部分的组件来实现。

首先是表单,表单采用的是行内表单。

          <el-form :inline="true" :model="searchEmp" class="demo-form-inline">
                        <el-form-item label="姓名">
                            <el-input v-model="searchEmp.name" placeholder="请输入员工姓名"></el-input>
                        </el-form-item>
                        <el-form-item label="性别">
                            <el-select v-model="searchEmp.gender" placeholder="请选择">
                                <el-option label="男" value="1"></el-option>
                                <el-option label="女" value="2"></el-option>
                            </el-select>
                        </el-form-item>
                        <el-form-item label="入职时间">
                            <!-- 日期选择器 -->
                            <el-date-picker v-model="searchEmp.entryDate" type="daterange" range-separator="至"
                                start-placeholder="开始日期" end-placeholder="结束日期">
                                <!-- 绑定在searchEmp对象中的entryDate属性中去,entryDate属性是一个数组,有开始日期和结束日期 -->
                            </el-date-picker>
                        </el-form-item>
                        <el-form-item>
                            <el-button type="primary" @click="onSubmit">查询</el-button>
                        </el-form-item>
                    </el-form>

在表单中我们通过v-bind绑定了一个数据模型,是一个对象模型,命名为searchEmp,用来记住查询到的对象。所有的表单项都绑定在searchEmp这个对象当中。通过v-model实现searchEmp对象的name属性,gender属性和entryDate属性的双向绑定。

通过@click绑定一个事件onSubmit,当点击查询时会将数据提交,触发onSubmit方法。

methods: {
        onsubmit:function() {
            alert("开始查询数据~")
        },
        handleSizeChange:function(val) {
            alert("当前页面条数为:" + val)
        },
        handleCurrentChange:function(val) {
            alert("当前页为:" + val)
        }
    }

对象searchEmp要在vue对象中定义,其中的entryDate属性要定义一个日期选择器,包含开始日期和结束日期。entryDate属性是一个数组。

    data () {
        return {
            searchEmp: {
                name:"",
                gender:"",
                entryDate:[]
            },
            tableData:[]
        }
    }

接着是表格

<!-- 表格 -->
                    <el-table :data="tableData" :border="true"> <!-- tableData数据模型是一个数组,需要在Vue对象的数据模型中定义 -->
                        <el-table-column prop="name" label="姓名" width="120"></el-table-column>
                        <el-table-column label="图像" width="140">
                            <!-- 图像要指定一个scope插槽 -->
                            <template slot-scope="scope">
                                <img :src="scope.row.image" width="50px">   <!-- 这个插槽展示图片,为src属性通过v-bind动态绑定一个值,即当前列中的每一行的image属性 -->
                            </template>
                        </el-table-column>
                        <el-table-column label="性别" width="140">
                            <!-- 性别要指定一个scope插槽,通过scope插槽可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据 -->
                            <template slot-scope="scope">
                                {{ scope.row.gender==1?'男':'女' }}    <!-- 获取当前列中每一行的gender属性并判断是否==1,是为男,不是为女 -->
                            </template>
                        </el-table-column>
                        <el-table-column prop="job" label="职位" width="140"></el-table-column>
                        <el-table-column prop="entrydate" label="入职日期" width="200"></el-table-column>
                        <el-table-column prop="updatedate" label="最后操作时间" width="200"></el-table-column>
                        <el-table-column label="操作" width="200">
                            <el-button type="primary" size="mini">编辑</el-button>
                            <el-button type="danger" size="mini">删除</el-button>
                        </el-table-column>    <!-- prop要与JSON数据中的属性名保持一致 -->
                    </el-table>

表格中通过v-bind绑定了一个属性tableData,该属性用于存储表格中的数据。表格中的数据仍是以数组形式进行存储的,因此在数据模型中进行声明。(见上面代码)

在表格的图像和性别区,会展示出value值而并非内容。为了解决这一问题,需要使用到插槽。

<el-table-column label="图像" width="140">
                            <!-- 图像要指定一个scope插槽 -->
                            <template slot-scope="scope">
                                <img :src="scope.row.image" width="50px">   <!-- 这个插槽展示图片,为src属性通过v-bind动态绑定一个值,即当前列中的每一行的image属性 -->
                            </template>
                        </el-table-column>
                        <el-table-column label="性别" width="140">
                            <!-- 性别要指定一个scope插槽,通过scope插槽可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据 -->
                            <template slot-scope="scope">
                                {{ scope.row.gender==1?'男':'女' }}    <!-- 获取当前列中每一行的gender属性并判断是否==1,是为男,不是为女 -->
                            </template>
                        </el-table-column>

在图像中动态绑定src属性,使得图像这一列的每一行数据中的image属性动态绑定给src。

在性别中对这一列的每一行数据中的gender属性做判断,如果==1则性别为男,否则为女,使用三元运算符。

scope.row.image
scope.row.gender

3.分页组件实现

<el-pagination background layout="sizes, prev, pager, next, jumper"
                        @size-change="handleSizeChange" @current-change="handleCurrentChange" :total="1000">
                        <!-- :total="1000", 写全 v-bind:total="1000", ":"语法是 v-bind: 的简写,用于绑定一个动态的值到属性 -->
                        <!-- size-change	pageSize 改变时会触发	回调参数:每页条数 -->
                        <!-- current-change	currentPage 改变时会触发	回调参数:当前页 -->
                        <!-- @:v-on的简写 v-on为el-button标签绑定了一个事件click-->
                    </el-pagination>

分页组件中有两个方法,详见Element-03.组件-Pagination分页-CSDN博客。同时所定义的方法要在vue对象中加以声明。

methods: {
        onsubmit:function() {
            alert("开始查询数据~")
        },
        handleSizeChange:function(val) {
            alert("当前页面条数为:" + val)
        },
        handleCurrentChange:function(val) {
            alert("当前页为:" + val)
        }
    }

 三.axios异步加载数据

使用axios异步加载数据,达到在页面中能够动态展示的效果。在mounted方法中当模型挂载完毕后,通过get方法拿到数据并将其中的data数组赋值给vue对象的tableData数组。

mounted () {
        axios.get("https://yapi.pro/mock/401965/user/getById").then((result) => {
            this.tableData=result.data.data 
        });
    }

在<script>标签中引入axios 

<script>
import axios from 'axios';

相关具体原理参考Ajax-03.Axios-案例-CSDN博客

这样整个案例便制作完成。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值