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 相关文章推荐
HTML node相关的一些资料整理
Jan 01 Javascript
JavaScript 学习笔记(十五)
Jan 28 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Feb 04 Javascript
以Python代码实例展示kNN算法的实际运用
Oct 26 Javascript
jquery基础知识第一讲之认识jquery
Mar 17 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
Oct 25 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
Jun 15 Javascript
jQuery实现base64前台加密解密功能详解
Aug 29 jQuery
p5.js入门教程之键盘交互
Mar 19 Javascript
vue.js轮播图组件使用方法详解
Jul 03 Javascript
JavaScript数据结构之栈实例用法
Jan 18 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执行速率优化技巧小结
2008/03/15 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
PHP return语句的另一个作用
2014/07/30 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
php连接mysql数据库
2017/03/21 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
Yii2框架控制器、路由、Url生成操作示例
2019/05/27 PHP
php简单检测404页面的方法示例
2019/08/23 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
jQuery 获取URL的GET参数值的小例子
2013/04/18 Javascript
js截取小数点后几位的写法
2013/11/14 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
jquery实现文本框textarea自适应高度
2016/03/09 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
jQuery树控件zTree使用方法详解(一)
2017/02/28 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
vue自定义指令之面板拖拽的实现
2019/04/14 Javascript
M2实现Nodejs项目自动部署的方法步骤
2019/05/05 NodeJs
python中利用zfill方法自动给数字前面补0
2018/04/10 Python
python可视化实现代码
2019/01/15 Python
详解python 模拟豆瓣登录(豆瓣6.0)
2019/04/18 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
Python 调用 Outlook 发送邮件过程解析
2019/08/08 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
艺龙旅行网酒店预订:国内、港澳台酒店
2018/06/26 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
消防工作实施方案
2014/06/09 职场文书
关于感恩的演讲稿800字
2014/08/26 职场文书
新员工入职欢迎词
2015/01/23 职场文书
公司保洁员管理制度
2015/08/04 职场文书
pandas:get_dummies()与pd.factorize()的用法及区别说明
2021/05/21 Python
Java实现添加条码或二维码到Word文档
2022/06/01 Java/Android