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 相关文章推荐
javascript innerHTML、outerHTML、innerText、outerText的区别
Nov 24 Javascript
基于jquery和svg实现超炫酷的动画特效
Dec 09 Javascript
JavaScript中的object转换成number或string规则介绍
Dec 31 Javascript
js中键盘事件实例简析
Jan 10 Javascript
浅谈javascript面向对象程序设计
Jan 21 Javascript
JavaScript中的各种操作符使用总结
May 26 Javascript
Vue概念及常见命令介绍(1)
Dec 08 Javascript
详解Vue整合axios的实例代码
Jun 21 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
vuex如何重置所有state(可定制)
Jan 17 Javascript
6种JavaScript继承方式及优缺点(小结)
Feb 06 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
Apr 27 Javascript
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开发工具ZendStudio下Xdebug工具使用说明详解
2013/11/11 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
JAVASCRIPT IE 与 FF中兼容问题小结
2009/02/18 Javascript
js 判断脚本加载完毕的代码
2011/07/13 Javascript
使用console进行性能测试
2015/04/27 Javascript
浅谈JavaScript字符串与数组
2015/06/03 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
Node.js的Web模板引擎ejs的入门使用教程
2016/06/06 Javascript
使用Node.js给图片加水印的方法
2016/11/15 Javascript
jQuery实现获取隐藏div高度的方法示例
2017/02/09 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
JS运动特效之完美运动框架实例分析
2018/01/24 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
2020/04/21 Javascript
javascript实现移动端触屏拖拽功能
2020/07/29 Javascript
[10:28]2018DOTA2国际邀请赛寻真——VGJ.S寻梦之路
2018/08/15 DOTA
python自动化测试之从命令行运行测试用例with verbosity
2014/09/28 Python
用Python编写一个国际象棋AI程序
2014/11/28 Python
python中文分词教程之前向最大正向匹配算法详解
2017/11/02 Python
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
python中如何进行连乘计算
2020/05/28 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
用sleep间隔进行python反爬虫的实例讲解
2020/11/30 Python
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
预备党员思想汇报范文
2013/12/29 职场文书
优秀毕业生自我鉴定
2014/01/19 职场文书
网站美工岗位职责
2014/04/02 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
《猴王出世》教学反思
2016/02/23 职场文书