webpack+vue项目实战(四,前端与后端的数据交互和前端展示数据)

举报
lxw1844912514 发表于 2022/03/27 02:35:52 2022/03/27
【摘要】 地址:https://segmentfault.com/a/1190000010063757 1.前言 今天要做的,就是在上一篇文章的基础上,进行功能页面的开发。简单点说呢,就是与后端的数据交互和怎么把数据展示出来,用到的资源主要是element-ui和vue-resource,其它参考(vue-resource...

地址:https://segmentfault.com/a/1190000010063757

1.前言

今天要做的,就是在上一篇文章的基础上,进行功能页面的开发。简单点说呢,就是与后端的数据交互和怎么把数据展示出来,用到的资源主要是element-ui和vue-resource,其它参考(vue-resource插件使用)。今天讲到的一些功能开发,主要就是请求列表数据,详情数据,分页功能操作,搜索,搜索标签等的开发。今天这个,按照下面步骤,一步一步来。一个一个功能的做!

2.数据接口

我以‘回款管理’(cashList.vue)为开发的demo,下文讲到的各种增删改查都是在这个文件上操作,大家注意喔!这虽然是做5个功能,其实就只有两个接口。(按照我开发项目,后端提供的接口说明)

2-1分析接口

下面分析下我们公司后端给我提供的其中两个接口。而且两个接口都是get请求。


    
  1. let http_url={
  2. list:'http://xxx.xxx.com/xxx/cash/list',
  3. detail:'http://xxx.xxx.com/xxx/cash/detail'
  4. }
  5. /**
  6. http_url.list接口接受参数
  7. ordId //String,订单号
  8. cashId //String.回款编号
  9. custoName //String,客户名称,模糊查询
  10. cashType //int,回款类型
  11. cashStatus //int,回款状态
  12. userName//String,采购人,模糊查询
  13. userMobile //String,采购人电话,模糊查询
  14. //上面是搜索查询的字段,下面是数据的页码和每页的条数
  15. pogeNo //int,页码(必填)
  16. pageSize //int,每页显示条数(必填)
  17. http_url.detail接口接受参数(按照我开发项目)
  18. cashId //String.回款编号(必填)
  19. **/

2-2整理数据

首先,由于接口http_url.list接口可以接受一些搜索,先把整个准备了!

然后再到页码的一些东西,主要是三个,当前页码,每页条数。(自己随便设的默认值)
数据就变成了


    
  1. data(){
  2. return {
  3. pageSize:10,//每页条数
  4. allCount:0,//记录总数
  5. currentPage:1,//当前页码
  6. cashList: [], //列表数组(现在是准备请求接口,不需要模拟的数据,所以设置一个空数组)
  7. keyFrom: {....}//搜索字段
  8. }
  9. }

大家可能不明白,同样是请求的参数,页码这些为什么要和搜索字段分开放?之所以分开放是因为页码这些,到下面分页的时候要单独使用,而且做搜索的时候,页码又不是搜索字段,所以就分开放,下面会详情的说明!

准备就准备这么多了,之后还要用到什么数据,以后再添加!

3.请求列表数据

先别急着写,大家可以想下,搜索字段那里,比如我只想根据回款ID(cashId)查询呢?
难道这样发送请求?http://xxx.xxx.com/xxx/cash/l...''&cashId=xxx&custoName=''&cashType=''&cashStatus=''&userName=''&userMobile=''
真没必要,我们想要的是这样http://xxx.xxx.com/xxx/cash/l...
所以,请求之前,先写一个方法,就是过滤搜索字段(keyFrom)里面,值为空的属性。


    
  1. /**
  2. * 清除对象中值为空的属性
  3. */
  4. filterParams(obj){
  5. let _form = obj, _newPar = {}, testStr;
  6. //遍历对象
  7. for (let key in _form) {
  8. testStr = null;
  9. //如果属性的值不为空。
  10. //注意,不要这样判断if (_form[key])。因为有些属性的值可能为0,到时候就会被过滤掉
  11. if (_form[key] !== null && _form[key] !== "") {
  12. //把值添加进新对象里面
  13. _newPar[key]=_form[key].toString()
  14. }
  15. }
  16. //返回对象
  17. return _newPar;
  18. }

3-1请求列表数据


    
  1. getList(){
  2. //过滤搜索字段值为空的属性,然后对象合并,合并上页码。
  3. let _par = Object.assign(this.filterParams(this.keyFrom), {
  4. pageNo: this.currentPage,
  5. pageSize: this.pageSize
  6. });
  7. this.$http.get(http_url.list, {
  8. params: _par
  9. }).then(function (res) {
  10. });
  11. }

3-2写完之后,在mounted运行这方法。


    
  1. mounted(){
  2. this.getList();
  3. },

为了能更直观看到结果,我在浏览器直接打开这个接口

需要的有的字段都有了
那么接下来就接收返回的字段


    
  1. getList(){
  2. //过滤搜索字段值为空的属性,然后对象合并,合并上页码。
  3. let _par = Object.assign(this.filterParams(this.keyFrom), {
  4. pageNo: this.currentPage,
  5. pageSize: this.pageSize
  6. });
  7. this.$http.get(http_url.list, {
  8. params: _par
  9. }).then(function (res) {
  10. res=res.body;
  11. //如果请求成功了,这接口code为0代表请求成功。具体怎样判断还需要看接口
  12. if(res.code===0){
  13. //设置列表数据
  14. this.cashList = res.datas.entityList;
  15. }
  16. else{
  17. this.$message.error(res.msg);
  18. }
  19. });
  20. }

3-3在html页面铺数据

怎么铺,随机应变呗!
来到el-table这个标签这里。不知道排版布局的话,参考上一篇文章喔!不要不知道我在说什么!


然后开始写<el-table-column></el-table-column>

下面简单写几个栗子

3-3-1回款id

点击回款id,会出来详情页面(详情页面的方法getDetail我们到下面写,现在)


    
  1. <el-table-column label="编号" width="180">
  2. <template scope="scope">
  3. <a href="javascript:;">{{scope.row.cashId}}</a>
  4. </template>
  5. </el-table-column>

3-3-2订单id

订单id只需要显示,就简单了


    
  1. <el-table-column label="订单编号" width="160">
  2. <template scope="scope">
  3. <span>{{ scope.row.ordId }}</span>
  4. </template>
  5. </el-table-column>

3-3-3回款时间

回款时间需要把时间戳转成yyyy-mm-dd hh:mm:ss


    
  1. <el-table-column label="回款时间" min-width="180">
  2. <template scope="scope">
  3. <span>{{new Date(scope.row.cashDate).toLocaleDateString().replace(/\//g, '-')}}&nbsp;{{new Date(scope.row.cashDate).toTimeString().split(' ')[0]}}</span>
  4. </div>
  5. </template>
  6. </el-table-column>

3-3-4回款状态

回款状态需要把状态码转换成文字


    
  1. <el-table-column>
  2. <template scope="scope">
  3. <span v-if="scope.row.cashStatus === 0">待回款</span>
  4. <span v-if="scope.row.cashStatus === 1">部分回款</span>
  5. <span v-if="scope.row.cashStatus === 2" style="color: green">已回款</span>
  6. <span v-if="scope.row.cashStatus === 3" style="color: red">已取消</span>
  7. </template>
  8. </el-table-column>

3-3-5回款金额

金额在数据库以分为单位,现在需要转换成元


    
  1. <el-table-column label="回款金额(元)" width="150">
  2. <template scope="scope">
  3. <span>{{ (scope.row.cashAmount / 100).toFixed(2) }}</span>
  4. </template>
  5. </el-table-column>

3-3-6细节优化

好了,典型的几种数据,以及处理的方法,就是在这里了。当然这个只是做展示作用,怎么展示是看项目的需求的!
小伙伴们运行起来的时候,可能会发现两个问题。

1.比如网速比较慢的时候,请求没完成的时候,就会看到这个(这个提醒是element-ui提供的,只要发现cashList是空的,就会出现这个提醒)

如果我们想体验好一点,做一个提示加载中的提示呢

这个简单的。首先在el-table上,设置v-loading="loading"。

然后在data设置loading这个属性

然后就是在请求那里
进入方法的时候,设置loading=true,请求完了再设置成false。(当loading=true时,加载中的提示就会出现。


    
  1. getList(){
  2. //显示加载中提示
  3. this.loading=true;
  4. //过滤搜索字段值为空的属性,然后对象合并,合并上页码。
  5. let _par = Object.assign(this.filterParams(this.keyFrom), {
  6. pageNo: this.currentPage,
  7. pageSize: this.pageSize
  8. });
  9. this.$http.get(http_url.list, {
  10. params: _par
  11. }).then(function (res) {
  12. res=res.body;
  13. //如果请求成功了,这接口code为0代表请求成功。具体怎样判断还需要看接口
  14. if(res.code===0){
  15. //设置列表数据
  16. this.cashList = res.datas.entityList;
  17. //关闭加载中提示
  18. this.loading=false;
  19. }
  20. else{
  21. this.$message.error(res.msg);
  22. }
  23. });
  24. }

2.再有就是,如果展示的数据,有些是空的字符串,或者是null的话,在列表上就会看到。

这样提示不太友好,因为只显示空白一片,用的人可能不知道怎么回事。这时候加个判断,如果某一个属性的值,为空字符串或者null,就替换成‘--’。
getList(){


    
  1. //显示加载中提示
  2. this.loading=true;
  3. //过滤搜索字段值为空的属性,然后对象合并,合并上页码。
  4. let _par = Object.assign(this.filterParams(this.keyFrom), {
  5. pageNo: this.currentPage,
  6. pageSize: this.pageSize
  7. });
  8. this.$http.get(http_url.list, {
  9. params: _par
  10. }).then(function (res) {
  11. res=res.body;
  12. //如果请求成功了,这接口code为0代表请求成功。具体怎样判断还需要看接口
  13. if(res.code===0){
  14. //设置列表数据
  15. this.cashList = res.datas.entityList;
  16. this.cashList.map(function (value) {
  17. for (let key in value) {
  18. //不要if(value[key])判断,有的值可能是0,会把0过滤
  19. if (value[key] === null || value[key] === '') {
  20. value[key] = '--'
  21. }
  22. }
  23. });
  24. //关闭加载中提示
  25. this.loading=false;
  26. }
  27. else{
  28. this.$message.error(res.msg);
  29. }
  30. });
  31. }

然后我们就会看到这样的结果,就明确的说明了,这里的值为空

4.请求详情数据

详情的数据,就是点击列表的任何一条数据,出来一个详情页面。

先在浏览器请求一下(看下有身什么字段,可以方便在html里面铺数据),看到有很多字段。

详情的html

现在项目上,用的是这个效果,我们现在也用这个吧!

代码如下,castInfo是在data声明的的变量,作用是储存请求回来的字段,包含字段如上图!


    
  1. <!-- 详情弹窗 -->
  2. <div class="cash-content-box" v-if="contentShow" :class="{'show-box':contentClass}">
  3. <div class="cash-main">
  4. <p class="content-close"><a href="javascript:;" @click="hideContentDo">X</a></p>
  5. <div class="content-top">
  6. <h2>回款金额:{{(castInfo.cashAmount / 100).toFixed(2)}}元</h2>
  7. <p>
  8. 回款编号:{{castInfo.cashId}}<span>|</span>回款日期:{{new Date(castInfo.cashDate).toLocaleDateString().replace(/\//g, '-')
  9. }}</p>
  10. </div>
  11. <div class="content-type">
  12. <ul class="flli">
  13. <li v-if="castInfo.cashStatus===0">回款状态:待回款</li>
  14. <li v-else-if="castInfo.cashStatus===1">回款状态:部分回款</li>
  15. <li v-else-if="castInfo.cashStatus===3">回款状态:已取消</li>
  16. <li v-else>回款状态:已回款</li>
  17. </ul>
  18. <div class="clear"></div>
  19. </div>
  20. <div class="content-tab">
  21. <ul class="flli">
  22. <li class="cur">概要</li>
  23. </ul>
  24. <div class="clear"></div>
  25. </div>
  26. <div class="content-info">
  27. <h3 class="content-title">基本信息</h3>
  28. <table class="content-table">
  29. <tr>
  30. <td>回款编号</td>
  31. <td><span>{{castInfo.cashId}}</span></td>
  32. </tr>
  33. <tr>
  34. <td>回款金额</td>
  35. <td>{{(castInfo.cashAmount / 100).toFixed(2)}}元</td>
  36. </tr>
  37. <tr>
  38. <td>账户类型</td>
  39. <td v-if="castInfo.cashAccountType">
  40. {{castInfo.cashAccountType===1?'公账':'其他账户'}}
  41. </td>
  42. <td v-else-if="castInfo.cashAccountType===0">其他账户</td>
  43. <td v-else>--</td>
  44. </tr>
  45. <tr>
  46. <td>回款类型</td>
  47. <td v-if="castInfo.cashType===0">立即回款</td>
  48. <td v-if="castInfo.cashType===1">定期回款</td>
  49. <td v-if="castInfo.cashType === '--'">--</td>
  50. </tr>
  51. <tr>
  52. <td>回款日期</td>
  53. <td>{{new Date(castInfo.cashDate).toLocaleDateString().replace(/\//g, '-') }}</td>
  54. </tr>
  55. <tr>
  56. <td>回款状态</td>
  57. <td v-if="castInfo.cashStatus===0">待回款</td>
  58. <td v-if="castInfo.cashStatus===1">部分回款</td>
  59. <td v-if="castInfo.cashStatus===2">已回款</td>
  60. <td v-if="castInfo.cashStatus===3">已取消</td>
  61. <td v-if="castInfo.cashStatus === '--'">--</td>
  62. </tr>
  63. <tr>
  64. <td>回款渠道</td>
  65. <td v-if="castInfo.payChannel === 'zfb'">支付宝</td>
  66. <td v-if="castInfo.payChannel === 'wx_pay'">微信支付</td>
  67. <td v-if="castInfo.payChannel === 'bank_trans'">银行转账</td>
  68. <td v-if="castInfo.payChannel === 'easy_pay'">苏宁易付宝</td>
  69. <td v-if="castInfo.payChannel === 'yi_ji_fu'">易极付</td>
  70. <td v-if="castInfo.payChannel === 'ljl_pay'">蓝金灵支付</td>
  71. <td v-if="castInfo.payChannel === '--'">--</td>
  72. </tr>
  73. <tr>
  74. <td>备注</td>
  75. <td>{{castInfo.remark}}</td>
  76. </tr>
  77. </table>
  78. </div>
  79. </div>
  80. </div>
  81. <!--遮罩层-->
  82. <div class="cash-content" v-show="contentShow" @click="hideContentDo"></div>

遮罩层和详情div里面的样式我不说了。最外层的样式是下面这样


    
  1. {
  2. width: 700px;
  3. z-index: 1006;
  4. position: fixed;
  5. top: 0;
  6. right: 0;
  7. transform: translate3d(700px, 0, 0);
  8. height: 100%;
  9. background: #535968;
  10. transition: transform 1s;
  11. }

transform: translate3d(700px, 0, 0);是为了一开始吧它隐藏起来,相信大家都看得懂!怎么让它显示出来呢,把样式改成transform: translate3d(0, 0, 0);这个就行了,动画效果自动会有,因为加了transition: transform 1s;

请求详情的方法


    
  1. getDetali: function (id) {
  2. //contentShow控制详情页和遮罩层的显示,contentClass控制详情页的动画,castInfo为记录请求回来的数据。大家要在data上面声明哦!
  3. //也是同样的处理方式,区别就是this.$loading是element提供的全局组件,效果就是整个屏幕显示加载中。
  4. let loadingContent = this.$loading({
  5. text: '正在加载中...'
  6. });
  7. //显示详情
  8. this.$http.get(http_url.detail, {
  9. params: {
  10. cashId: id
  11. }
  12. }).then(function (res) {
  13. res = res.body;
  14. if (res.code === 0) {
  15. this.castInfo = res.datas.castInfo;
  16. //关闭加载中提示
  17. loadingContent.close();
  18. //显示详情的div
  19. this.contentShow = true;
  20. //为了确保看到动画效果,所以让遮罩层和详情的DIV先显示,再执行this.contentClass = true;让详情DIV从右至左的出现
  21. setTimeout(() => {
  22. this.contentClass = true;
  23. })
  24. }
  25. else {
  26. this.$message.error(res.msg);
  27. }
  28. });
  29. }

隐藏详情

既然是详情,又出现,就有隐藏


    
  1. /**
  2. * @description 隐藏详情
  3. */
  4. hideContentDo(){
  5. //先执行this.contentClass = false。让详情DIV从左至右回去,等回去了之后,再执行this.contentShow = false;在隐藏div,否则会看不到动画效果。设置的时间,就是当时动画的时间!transition: transform 1s
  6. this.contentClass = false;
  7. setTimeout(() => {
  8. this.contentShow = false;
  9. }, 1000)
  10. },

5.分页

分页这个功能,大家可能都接触过,写得也是很复杂。但是今天用了element-ui提供的分页组件,就简单多了!

引入分页组件

.cash-table这个DIV下面,直接引入下面的代码


    
  1. <div class="cash-page">
  2. <el-pagination @current-change="handleCurrentChange"
  3. :page-size="pageSize"
  4. :current-page="currentPage"
  5. layout="total, prev, pager, next, jumper" :total="allCount">
  6. </el-pagination>
  7. </div>

handleCurrentChange这个方法待会写,allCount,pageSize,currentPage这三个变量,都是之前已经声明了的,大家往上翻下就知道了!参数大家看官网-分页

编写分页方法


    
  1. /**
  2. * @description 分页处理
  3. * @param val
  4. */
  5. handleCurrentChange(val) {
  6. //val是组件的返回值,返回当前是第几页
  7. //然后把值赋值给currentPage。
  8. this.currentPage = val;
  9. //然后再次调用getList。更新cashList
  10. this.getList();
  11. }

这个的代码看着很简单。大家可能会不太理解原理。下面我简单分析下。
1.首先执行this.currentPage = val;获取当前是第几页,比如我点击第二页。this.currentPage的值就是2。
2.然后执行this.getList();。这个时候,在方法里面。


相当于发送了这个请求http://xxx.xxx.com/xxx/cash/l...
然后在执行下去,cashList这个数组就更新了。我们分页就开发完了。

6.搜索功能

搜索功能这个太常见了,我现在做的项目,搜索需求就是。

然后输入再点击

交互很容易理解。就是输入,然后再输出结果,如上图,我在回款ID下面的文本框输入‘M2017070400060002’。然后点击搜索。就会出现输出结果。
下面,我们一步步来

6-1点击,出现搜索框。

6-1-1,找到这个按钮,在这个按钮上绑定一个方法

6-1-2.编写filterSearch这个方法,代码如下


    
  1. /**
  2. * 显示与隐藏搜索
  3. */
  4. filterSearch(){
  5. //filterModel小伙伴们要在data上声明哦,初始值为false。这个值是记录当前是不是要显示搜索框,进行搜索的。
  6. //当前是否需要搜索状态
  7. if (this.filterModel) {
  8. this.cashList.splice(0, 1);
  9. } else {
  10. this.cashList.unshift({
  11. "cashId": "#",
  12. })
  13. }
  14. //显示或隐藏搜索
  15. this.filterModel = !this.filterModel;
  16. }

6-1-3.列表的改造

首先,清楚一个。后端返回的数据(如上图),并不是所有的字段都是可以进行搜索的字段。只有这几个字段(如下图),才可以进行搜索。

所以,这里我分三种请况。

一种情况是,比如回款编号,可以进行搜索的字段。


    
  1. //修改前
  2. <el-table-column label="回款编号" width="200">
  3. <template scope="scope">
  4. <span>{{ scope.row.cashId }}</span>
  5. </template>
  6. </el-table-column>

    
  1. //修改后
  2. <el-table-column label="回款编号" width="180">
  3. <template scope="scope">
  4. <el-input v-if="scope.row.cashId=='#'"
  5. size="small"
  6. v-model="keyFrom.cashId"
  7. placeholder="请输入内容">
  8. <el-button slot="append" icon="search"></el-button>
  9. </el-input>
  10. <a href="javascript:;" @click="getDetali(scope.row.cashId)" v-else>{{scope.row.cashId}}</a>
  11. </template>
  12. </el-table-column>

第二种情况是,比如回款状态,可以进行搜索的字段。但是是下拉搜索的


    
  1. //修改前
  2. <el-table-column label="回款状态" width="200">
  3. <template scope="scope">
  4. <span v-if="scope.row.cashStatus === 0" class="color-red">待回款</span>
  5. <span v-if="scope.row.cashStatus === 1">部分回款</span>
  6. <span v-if="scope.row.cashStatus === 2" class="color-green">已回款</span>
  7. <span v-if="scope.row.cashStatus === 3" style="color: red">已取消</span>
  8. </template>
  9. </el-table-column>
  10. //修改后
  11. <el-table-column label="回款状态" width="100">
  12. <template scope="scope">
  13. <el-select v-model="keyFrom.cashStatus" size="small" placeholder="请选择"
  14. v-if="scope.row.cashId=='#'" @change="search" :disabled="pageStatus!==null">
  15. <el-option value="" label="全选"></el-option>
  16. <el-option value="0" label="待回款"></el-option>
  17. <el-option value="1" label="部分回款"></el-option>
  18. <el-option value="2" label="已回款"></el-option>
  19. <el-option value="3" label="已取消"></el-option>
  20. </el-select>
  21. <div v-else>
  22. <span v-if="scope.row.cashStatus === 0" class="color-red">待回款</span>
  23. <span v-if="scope.row.cashStatus === 1">部分回款</span>
  24. <span v-if="scope.row.cashStatus === 2" class="color-green">已回款</span>
  25. <span v-if="scope.row.cashStatus === 3" style="color: red">已取消</span>
  26. </div>
  27. </template>
  28. </el-table-column>

另一种情况是,比如回款流水号,不可以进行搜索的字段。修改情况是


    
  1. //修改前
  2. <el-table-column label="回款流水号" width="150">
  3. <template scope="scope">
  4. <span>{{scope.row.payNo}}</span>
  5. </template>
  6. </el-table-column>
  7. //修改后
  8. <el-table-column label="回款流水号" width="150">
  9. <template scope="scope">
  10. <span v-if="scope.row.cashId!='#'">{{scope.row.payNo}}</span>
  11. </template>
  12. </el-table-column>

6-1-4流程说明

下面,我简单说明下执行的流程。
1.filterModel这个值,一开始设为false
2.点击按钮,执行filterSearch,由于filterModel=false;所以最后执行this.cashList.unshift({"cashId": "#"})
3.this.cashList这个数组,前面就添加了{"cashId": "#"}
点击前

点击后

4.this.cashList第一条就变成了{"cashId": "#"},表格在遍历到第一条的时候

el-table-column里面,由于**v-if**的关系。排版就改变了!这就是数据驱动的魅力!
是搜索字段的第一行就变成了文本框

不是搜索字段的第一行就变成了空白的

5.交互就实现了!但是有一点要注意,就是搜索框v-model的值一定要绑定正确!

6-2实现搜索功能

6-2-1.首先,在每个按钮里面,都绑定一个点击事件,绑定search方法,用来启动搜索!


这个按钮,大季家都知道是哪个吧!就是这里

6-2-2.然后,编写search方法


    
  1. /**
  2. * 开始搜索
  3. */
  4. search(){
  5. this.getList();
  6. },

没看错,就是这一行,代码,因为每一个文本框v-model了keyFrom相对应的值。所以,只要在文本输入,keyFrom对应的值自动改!然后执行getList,keyFrom中,只要不是空字符或者null。就不会被过滤!这样就相当于执行http://xxx.xxx.com/xxx/cash/l...的请求。至于为什么要令写一个方法,不直接绑定getList呢,因为这里还要触发下面的搜索标签。接下来会下面要说的!

6-3实现重置搜索功能

看了搜搜索之后,我想大家都知道重置搜索怎么做了!就是先把keyFrom搜索的属性的值清空,再执行getList。


    
  1. /**
  2. * @description 重置筛选条件
  3. */
  4. resetSearch(){
  5. for (let key in this.keyFrom) {
  6. this.keyFrom[key] = null
  7. }
  8. this.getList();
  9. }

7.搜索标签

搜索标签,在很多地方都会见到过,就是给用户看到,执行了什么条件的搜索。
下面就实现下这个功能!

7-1.编写方法

先实现,这个方法,这个方法,我想大家也已经知道了,就是遍历keyFrom,然后把属性和值遍历道一个数组里面,最后在html里面v-for循环一下!

7-2-1添加标签


    
  1. addTags(){
  2. //tagsArr就是存放筛选标签的数组,大家要在data里面设置哦,初始值为[];
  3. let _this = this,_label,_value;
  4. //用一个变量,获取清空keyFrom里面值为空的属性!
  5. let _params = Object.assign(this.filterParams(this.keyFrom);
  6. //用一个变量,获取_params属性的集合!
  7. let _paramKeys = Object.keys(_params);
  8. //先清空tagsArr,
  9. this.tagsArr = [];
  10. _paramKeys.forEach((val) => {
  11. //根据val,设置_label标签名
  12. swicth(val){
  13. case 'cashId':_label='回款编号';break;
  14. case 'ordId':_label='订单编号';break;
  15. case 'custoName':_label='客户名称';break;
  16. case 'cashType':_label='回款类型';break;
  17. case 'cashStatus':_label='回款状态';break;
  18. case 'userName':_label='采购人';break;
  19. case 'userMobile':_label='采购人电话';break;
  20. }
  21. //然后上面有提到到,比如回款状态,这个的值是下拉搜索的。传过来的值是状态码,并不是文字。我们主要手动把状态码转译成文字
  22. //比如状态吗是0,我们需要转成‘待回款’
  23. //如果val等于cashStatus,就是回款状态,我们需要转译
  24. if (_key === 'cashStatus') {
  25. //判断状态码
  26. switch (_keyFrom3[_key]) {
  27. case '0':
  28. _value = "待回款";
  29. break;
  30. case '1':
  31. _value = "部分回款";
  32. break;
  33. case '2':
  34. _value = "已回款";
  35. break;
  36. case '2':
  37. _value = "已取消";
  38. break;
  39. }
  40. }
  41. //tagsArr添加元素!
  42. //_value如果为真,就代表是把状态码转成文字的,就添加_value,否则就直接添加_params[val]
  43. _this.tagsArr.push({
  44. key: val,
  45. label: _label,
  46. value: _value||_params[val]
  47. });
  48. });
  49. },

这个方法什么时候触发呢,就是在搜索和重置搜索的时候触发 。这也解释了为什么搜索要令写一个方法!


    
  1. search(){
  2. this.getList();
  3. this.addTags();
  4. },
  5. resetSearch(){
  6. for (let key in this.keyFrom) {
  7. this.keyFrom[key] = null
  8. }
  9. this.getList();
  10. this.addTags();
  11. }

但是大家应该还有注意到一个,就是比如‘回款状态’,是下拉搜索的,所以,在下拉框,就要绑定search方法。

7-2-2html页面遍历

然后在html页面遍历这个tagsArr。

7-2-3删除标签

眼尖的小伙伴又发现了,tagClose这个方法对吧!
接下来就实现这个!


    
  1. tagClose(key, _index){
  2. //根据下标,鼠标tagsArr数组某一项
  3. this.tagsArr.splice(_index, 1);
  4. //根据key,把keyFrom某一项设为空值
  5. this.keyFrom[key] = null;
  6. //重新请求,更新cashList
  7. this.getList();
  8. }

8.未完待续

好了,今天就到这里了,这篇文章也写了将近10个小时了!如果你有耐心读到这里,你也是很有耐心的勇士!当然,当面的代码和交互还是有细节是需要优化的,这个就比较简单,小伙伴们,随机应变下就知道怎么做了!也写累了!不想说太多了!下一篇文章,预热就是利用监听路由(vue-router)。来实现同一个页面,不同状态的处理。就比如:同样是回款管理,我要求新建一个待回款的页面,但是这个页面只有待回款的数据。回款状态也不能修改!这个小伙伴们也可以试着做下,怎么实现。这个相对简单!

9.往期占坑

webpack+vue项目实战(一,搭建运行环境和相关配置)
webpack+vue项目实战(二,开发管理系统主页面)
webpack+vue项目实战(三,配置功能操作页和组件的按需加载)

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100028938

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。