Element-UI+Vue模式使用总结


Posted in Javascript onJanuary 02, 2020

项目框架

Element-ui+Vue+jQuery+Bootstrap+Echarts。

嵌入vue使用的是<script>,没有使用vue-cli,请自行将<template>内代码贴入html,<style>内代码贴入样式表。

checkbox全选和全不选

<template>
  <el-form-item label="地电阻率选项:">
    <el-checkbox class="search_item" v-model="eidAll" @change="handleEidAllChange">全选</el-checkbox>
    <el-checkbox-group v-model="searchItem.eid">
      <el-checkbox class="search_item" v-for="item of eidList" :label="item.value">{{ item.name }}</el-checkbox>
    </el-checkbox-group>
  </el-form-item>
</template>

<script>
var app = new Vue({
  el: '#app',
  data: {
    // 全选变量
    eidAll: false
    // checkbox单项
    searchItem: {
      eid: [],
    },
    // checkbox数据循环
    eidList: [{
      name: '缺数',
      value: 'DZ1'
      // ...
    }]
  },
  methods: {
    // 处理全选
    handleEidAllChange() {
      if (this.eidAll) {
        this.searchItem.eid = [];
        var arr = [];
        for (let i in this.eidList) {
          arr.push(this.eidList[i].value);
        }
        this.searchItem.eid = arr;
      } else {
        this.searchItem.eid = [];
      }
    },
  },
  watch: {
    // 监听checkbox是否全部选择
    "searchItem.eid": function() {
      if (this.searchItem.eid.length == this.eidList.length) {
        this.eidAll = true
      } else {
        this.eidAll = false
      }
    }
  }
});
</script>

表头固定,表身滚动

方案①:el-table,卡死,据说和vue版本有关系,但是升级了仍然卡死,抛弃。
方案②:table,要设置display:table; table-layout: fixed;,布局有局限性。
方案③:div+el-col模拟table。

<template>
  <div class="table">
    <div class="thead">
      <div class="tr">
        <el-row>
          <el-col v-for="item of tableHeadList" :span="item.col">
            <div class="th">
              {{ item.text }}
            </div>
          </el-col>
        </el-row>
      </div>
    </div>
    <div class="tbody">
      <div class="tr" v-for="(item, index) of tableData">
        <el-row>
          <el-col v-for="bodyItem of tableBodyList" :span="bodyItem.col">
            <div class="td">
              {{ item[bodyItem.field] }}
            </div>
          </el-col>
        </el-row>
      </div>
    </div>
  </div>
</template>

<style>
.table .tbody {
  width: 100%;
  height: 278px;
  overflow-y: scroll;
}
</style>

<script>
var app = new Vue({
  el: '#app',
  data: {
    // th数据循环
    tableHeadList: [{
      // 根据type来v-if th的标题内容,根据需求放文本或checkbox
      type: 'text',
      // 每格占用栅格,element-ui总栅格数是24
      col: '1',
      // th标题
      text: 'ID'
    }],
    // td数据循环
    tableBodyList: [{
      type: 'text',
      col: '1',
      // 接口返回字段
      field: 'id'
    }],
    // 表格数据
    tableData: [...]
  }
});
</script>

表格滚动无限加载

可以用插件,但为了轻量就自己写吧,此处用jQuery。

<script>
var app = new Vue({
  el: '#app',
  mounted: function() {
    // 监听滚动
    this.handleScrollLoad();
  },
  data: {
    // 加载完全部数据,更换查询条件时请先初始化为false
    loadAll: false,
    // 页码,更换查询条件时请先初始化为1
    offset: 1,
    // 表格数据,更换查询条件时请先清空
    tableData: []
  },
  methods: {
    // 处理滚动加载
    handleScrollLoad() {
      var $this = this

      var nScrollHight = 0;
      var nScrollTop = 0;
      var nDivHight = $(".table .tbody").height();
      $(".table .tbody").scroll(function() {
        if ($this.loadAll) {
          // 全部加载完不进行操作
          return;
        }
        nScrollHight = $(this)[0].scrollHeight;
        nScrollTop = $(this)[0].scrollTop;
        if (nScrollTop + nDivHight >= nScrollHight) {
          // 滑到底部,offset递增
          // 因为我们后端定义的offset其实是page,代表第几页,而不是真正意义上的offset
          // 有需要的人可以转为$this.offset += $this.limit;
          $this.offset += 1;
          $this.searchData()
        }
      });
    },
    // 查询表格数据
    searchData() {
      ...
      var $this = this
      axios.get(str)
      .then(res => {
        if (res.status === 200) {
          // 请求正常,判断是否加载完全部
          if (res.data.rows.length === 0) {
            $this.loadAll = true;
            return;
          }
          for (let i of res.data.rows) {
            $this.tableData.push(i);
          }
        } else {
          // 请求错误
          alert('请求错误,错误码:' + res.status);
        }
      }, e => {
        this.loading = false;
        throw new Error('请求失败:' + e);
      })
    }
  }
});
</script>

多个echarts

既然使用了vue,嵌入echarts最好的方式当然是组件,将echarts封装成组件,再通过v-for循环,每次数据更新再setOption。

<template>
  <div class="echarts_box">
    <charts v-for="(item, index) of echartsData" :item="item"></charts>
  </div>
</template>

<script>
var app = new Vue({
  el: '#app',
  data: {
    // 曲线数据
    echartsData: []
  }
});

/*****************************曲线实例****************************/
Vue.component('charts', {
  props: {
    item: Object
  },
  methods: {
    // 初始化曲线
    initChart() {
      this['echart' + (this.item.id)] = echarts.init(document.getElementById('echart' + this.item.id));
      this.setChart();
    },
    setChart() {
     var $this = this
     let option = {
        ...
      };
      this['echart' + this.item.id].setOption(option);
    }
  },
  mounted() {
    this.initChart();
  },
  watch: {
   item: {
     handler: function () {
      this.setChart();
     },
     deep: true
   }
  },
  template: `<div class="echart_item" :id="'echart'+item.id" style="height:260px;"></div>`
});
</script>

后记

使用这个框架做项目断断续续也做了很久了,一直都没有特意去总结,导致每次都要翻从前的代码,回忆良久,例如el-checkbox,不同于其他表单项,它的label才是真正的value,每次都要重新查阅文档+回忆,其实是很费时的。

总结项目套路是很有必要的,我觉得随着工作时间增长,一个人是进步,还是重复工作,和会不会总结有本质联系。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery animate图片模向滑动示例代码
Jan 26 Javascript
JS实现超炫网页烟花动画效果的方法
Mar 02 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
javascript HTML+CSS实现经典橙色导航菜单
Feb 16 Javascript
jQuery过滤特殊字符及JS字符串转为数字
May 26 Javascript
jQuery检查元素存在性(推荐)
Sep 17 Javascript
Angularjs中的页面访问权限怎么设置
Nov 11 Javascript
easyui datebox 时间限制,datebox开始时间限制结束时间,datebox截止日期比起始日期大的实现代码
Jan 12 Javascript
分享十三个最佳JavaScript数据网格库
Apr 07 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
jquery.pager.js分页实现详解
Jul 29 jQuery
JS代码触发事件代码实例
Jan 02 #Javascript
微信小程序使用自定义组件导航实现当前页面高亮
Jan 02 #Javascript
Vue 实现分页与输入框关键字筛选功能
Jan 02 #Javascript
jQuery实现的图片点击放大缩小功能案例
Jan 02 #jQuery
Vue 实现简易多行滚动&quot;弹幕&quot;效果
Jan 02 #Javascript
JS实现秒杀倒计时特效
Jan 02 #Javascript
在weex中愉快的使用scss的方法步骤
Jan 02 #Javascript
You might like
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
Jvascript学习实践案例(开发常用)
2012/06/25 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
JS产生随机数的用法小结
2016/12/10 Javascript
微信小程序 定位到当前城市实现实例代码
2017/02/23 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
javascript 中iframe高度自适应(同域)实例详解
2017/05/16 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
js学习总结之DOM2兼容处理重复问题的解决方法
2017/07/27 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
Node Express用法详解【安装、使用、路由、中间件、模板引擎等】
2020/05/13 Javascript
JS实现图片幻灯片效果代码实例
2020/05/21 Javascript
python遍历类中所有成员的方法
2015/03/18 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
详解python中requirements.txt的一切
2017/03/03 Python
老生常谈Python基础之字符编码
2017/06/14 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
Django 路由系统URLconf的使用
2018/10/11 Python
解决pyCharm中 module 调用失败的问题
2020/02/12 Python
Python Django路径配置实现过程解析
2020/11/05 Python
如何提高MySql的安全性
2014/06/19 面试题
水毁工程实施方案
2014/04/01 职场文书
《青海高原一株柳》教学反思
2014/04/25 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
pytorch 如何把图像数据集进行划分成train,test和val
2021/05/31 Python