表头主要复杂在:
1,有三层,一层是大类,第二层是具体项,第三层是标准值/对比值
2,首列和末尾列是一层
3,整个表格的维度是根据数据的输入自己生成,也就是动态的
下面是在 vue + eleUI 中的解决方案:
{{scope.row.list[item.label][standard_name]['value']}}
{{scope.row.result ? '合格' : '不合格'}}
其对应data:
//整理出所有的label和标准对象的属性
itemList: [],
//实际数据
tableData:[]
《方法二》
npm install -g webpack
vue-cli是什么?
vue-cli 是vue.js的脚手架,用于自动生成vue.js模板工程的。
使用步骤:
安装vue-cli:
npm install -g vue-cli
使用vue-cli构建项目
vue init webpack project-name //创建一个基于webpack模板的名为project-name的项目
目前可用的模板包括:
安装项目依赖
cd project-name //进入项目目录
npm install //安装项目依赖
npm run dev //运行项目
此时在浏览器打开:localhost:8080即可看到欢迎页。
关于webpack和vue-cli的更多使用方法参见官方文档。
但是这个只能在本地跑,要如何在我们自己的服务器上访问呢?此时需要执行
npm run build
本来想用vue-cli重新创建项目,试了几次总是出现各种问题,没办法成功。最后在仔细查看
Element-UI
的官方文档的 快速上手 部分的时候发现饿了么
团队给了一个他们自己的 项目模板 。于是我就用这个模板来尝试了下,结果成功了。所以,如果你不想太折腾的话,建议还是使用官方给的项目模板,可以省很多事。
克隆/下载项目模板
将下载的模板放到你项目的根目录下
安装依赖
npm install
运行项目模板
npm run dev
此时在浏览器打开:localhost:8080即可看到欢迎页。
项目模板里已经把需要配置的文件都配置好了。
第一步,我们成功安装了项目模板,接下来,我们需要安装element-ui到项目下。
npm i element-ui@next -D
接下来我们就可以参照
Element-UI
的官方文档上手开发了。
我们参照官方的按钮组件使用说明,在项目模板的基础上做一个按钮的例子。其它文件不需要改动,只修改App.vue文件的内容。代码如下:
App.vue
<div id="app">
<img src="./assets/logo.png">
<h1>{{ msg }}h1>
<el-button @click.native="startHacking">Let's do itel-button>
<div class="block">
<span class="demonstration">显示默认颜色span>
<span class="wrapper">
<el-button type="success">成功按钮el-button>
<el-button type="warning">警告按钮el-button>
<el-button type="danger">危险按钮el-button>
<el-button type="info">信息按钮el-button>
span>
div>
<br/>
<div class="block">
<span class="demonstration">hover 显示颜色span>
<span class="wrapper">
<el-button :plain="true" type="success">成功按钮el-button>
<el-button :plain="true" type="warning">警告按钮el-button>
<el-button :plain="true" type="danger">危险按钮el-button>
<el-button :plain="true" type="info">信息按钮el-button>
span>
div>
div>
template>
<script>
export default {
data () {
return {
msg: 'Use Vue 2.0 Today!'
}
},
methods: {
startHacking () {
this.$notify({
title: 'It Works',
message: 'We have laid the groundwork for you. Now it\'s your time to build something epic!',
duration: 6000
})
}
}
}
script>
<style>
body {
font-family: Helvetica, sans-serif;
}
style>
效果如下图所示:
由于源的问题,安装phantomjs必须要“搭梯子”,使用内网无法下载。所以解决的方法有两种:
方法一:通过科学上网,然后安装。
方法二:对于不知道怎么“搭梯子”的同学,可以通过更改源来下载,操作方法如下:
npm install phantomjs --phantomjs_cdnurl=http://cnpmjs.org/downloads
通过 Element-UI
官方提供的项目模板开发,会发现在浏览器打开页面的时候,中文是乱码的。如下图所示:
但html
页面中已经设置了 。
仔细查看该页面所涉及的文件的编码格式的时候,发现引用的App.vue
文件的编码格式是GBK
,所以把该文件编码格式改为UTF-8
即可。
“ 使用VUE开发多级多选树形菜单组件 ”
要开发一个这样的多级多选菜单组件,功能是:
点击最底下那个全选框可以全选或取消全部的勾选图标
所以总结起来我们重点要利用子列表勾选了哪些项来计算出父标题与底下的全选框是自动勾选还是自动取消,并且父标题与底下的全选框在选择变化时子列表应有什么变化。要做到以上,实现过程是:
构建我们model层数据
datas : [
{
//用于判断是否展示子列表
isShowListItem : false,
//用于记录选中了哪些子项
selected : [],
//父标题
listTitle : "保利南悦湾",
//子列表
listItem : [
{
id : 1,
name : "李小龙"
},
{
id : 2,
name : "周星驰"
},
{
id : 3,
name : "周杰伦"
}
]
},
{
isShowListItem : false,
selected : [],
listTitle : "南庄万科城",
listItem : [
{
id : 4,
name : "大魔王"
},
{
id : 5,
name : "老妖怪"
}
]
}
]
记录子列表勾选了哪些项
子列表通过v-model=”data.selected”去双向绑定到selected数组中,当子列表项的checked发生变化时,就会把当前项的id记录到selected数组里去
type="checkbox"
:value="item.id"
v-model="data.selected"
>
当父标题勾选变化时的处理方法
自动处理父标题勾选图标的变化
在HTML里,通过绑定:checked=”isTitleChecked(data)”,这时,每当其他项变化时,父标题都会调用一下isTitleChecked这个方法去判断一下这时自己的checked状态是true还是false,从而达到根据子项选中数目不同,父标题自动变化的目的。
通过@change=”changeTitleChecked(data,$event)”,每当父标题主动勾选或取消时触发
父标题HTML
"data.listTitle"
class="list-input"
type="checkbox"
:checked="isTitleChecked(data)"
@change="changeTitleChecked(data,$event)"
>
父标题JS
/**
* 当父标题状态变化时的处理方法
* @param data [当前项的data]
* @param event [当前项的event]
*/
changeTitleChecked : function (data,event) {
if (event.target.checked === true) {
data.listItem.forEach(function (item) {
data.selected.indexOf(item.id) === -1 && data.selected.push(item.id);
})
}else {
data.selected = [];
}
}
/**
* 判断父标题选择状态
* @param data [当前项的data]
* @returns {boolean}
*/
isTitleChecked : function (data) {
var _selected = data.selected;
var _listItem = data.listItem;
// 验证selected中是否含有全部的item的id 如果是 证明title要选中
return _listItem.every(function (item) {
return _selected.indexOf(item.id) != -1;
});
}
当底下的全选框变化时的处理方法
自动处理底下的全选框的变化
全选框HTML:
"all-checked"
type="checkbox"
:checked="isAllChecked()"
@change="changeAllChecked($event)"
>
全选框JS:
/**
* 全选框change事件的回调处理方法
* @param event
*/
changeAllChecked : function (event) {
if (event.target.checked === true) {
this.datas.forEach(function (data) {
data.listItem.forEach(function (item) {
data.selected.indexOf(item.id) === -1 && data.selected.push(item.id);
})
})
}else {
this.datas.forEach(function (data) {
data.selected = [];
})
}
}
/**
* 判断全选框选择状态
* @returns {boolean}
*/
isAllChecked : function () {
return this.datas.every(function (data) {
return data.selected.length === data.listItem.length;
});
}
vue组件库的总结
vue的组件开发手风琴菜单实例
小图标是引入font-awesome字体图标库绘制的。效果如下图所示:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>indextitle>
<link rel="stylesheet" href="css/font-awesome.min.css">
<link rel="stylesheet" href="css/index.css">
<script type="text/javascript" src="../lib/vue.min.js">script>
<script type="text/javascript" src="../lib/jquery-1.11.3.min.js">script>
<style>
* {
margin: 0;
padding: 0;
}
body {
padding-top: 100px;
}
#tabPanel {
width: 120px;
height: auto;
margin: 0 auto;
}
#tabPanel .item .sildermun ul li {
height: 40px;
line-height: 40px;
list-style: none;
}
#tabPanel .item .sildermun ul li:hover {
background: #ccc;
}
#tabPanel .item .menutitle {
height: 40px;
line-height: 40px;
text-align: center;
background: #ccc;
}
#tabPanel .item .sildermun {
text-align: center;
background: #eee;
}
style>
head>
<body>
<div id="tabItem">
<slider-item>slider-item>
<slider-item>slider-item>
<slider-item>slider-item>
<slider-item>slider-item>
div>
<template id="tab">
<div id="tabPanel">
<div class="item">
<div class="menutitle" @click="toggle()"><i class="icon-th-list">i> {{parentItem}}div>
<div class="sildermun" v-show="status">
<ul>
<li v-for="(index,v) in childItems"><i class="icon-star">i> {{v+index}}li>
ul>
div>
div>
div>
div>
template>
body>
html>
<script>
var vue = new Vue({
el: "#tabItem",
data: {
},
components: {
'slider-item': {
template: '#tab',
data: function() {
return {
status: false,
parentItem: "父级菜单",
childItems: ["子级菜单", "子级菜单", "子级菜单", "子级菜单"]
}
},
methods: {
//切换滑块
toggle: function() {
this.status = !this.status;
}
}
}
}
});
script>