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与google map api结合使用 控件,监听器
Mar 04 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
Dec 11 Javascript
Js 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
jQuery中prevAll()方法用法实例
Jan 08 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
Apr 07 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
Aug 30 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
关于TypeScript模块导入的那些事
Jun 12 Javascript
vue.js引入外部CSS样式和外部JS文件的方法
Jan 06 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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写MySQL数据 实现代码
2009/06/15 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
深入学习AngularJS中数据的双向绑定机制
2016/03/04 Javascript
JS实现探测网站链接的方法【测试可用】
2016/11/08 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
Python实现的密码强度检测器示例
2017/08/23 Python
利用python实现简单的邮件发送客户端示例
2017/12/23 Python
python去掉空白行的多种实现代码
2018/03/19 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
用django-allauth实现第三方登录的示例代码
2019/06/24 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
python基于socket函数实现端口扫描
2020/05/28 Python
python操作ini类型配置文件的实例教程
2020/10/30 Python
python 从list中随机取值的方法
2020/11/16 Python
德国网上宠物店:Zoobio
2018/05/23 全球购物
马德里著名的运动鞋商店:NOIRFONCE
2019/04/12 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
教师实习自我鉴定
2013/12/14 职场文书
高中生物教学反思
2014/02/05 职场文书
运动会演讲稿50字
2014/08/25 职场文书
夫妻双方自愿离婚协议书怎么写
2014/12/01 职场文书
大学生助学金感谢信
2015/01/21 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
暖春观后感
2015/06/08 职场文书
关于python pygame游戏进行声音添加的技巧
2021/10/24 Python
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python