接上一批,小结(二)。
三、导航内容(含左侧导航及顶部面包屑导航)
其实导航条主要根据element-ui的教程进行编写,官网:http://element-ui.cn/#/zh-CN/component。左侧导航为NaveMenu导航菜单,地址:http://element-ui.cn/#/zh-CN/component/menu,顶部为面包屑导航,地址:http://element-ui.cn/#/zh-CN/component/breadcrumb。多掌握组件的写法吧,简单上手,但是真的精通还是需要下很多功夫研究的,根据示例写好后,主要就是改样式到符合要求的格式。这里可以选择很多新的CSS预处理器,sass、less还有stylus这几种,其实主要就是方便编写CSS样式,用最基础的CSS也可。布局可以通过el-col的方式布局,完成后为响应式布局,根据窗口缩放。
左侧导航如果完全根据ui组件来做,实际上不难。但是如果不根据ui组件来做,就需要自己采用v-for循环将导航内容全部显示出来,上面可以定义二级菜单展开关闭及路由跳转等事件,ui组件其实封装了这一块,所以如果导航菜单不是很多的时候建议可以采用ui组件来做的,代码也显得清楚易懂些。
面包屑导航,主要是el-breadcrumb-item,里面的内容第一条to表示可以点击跳转到该路由,第二条为面包屑导航的后面内容。第二个div中为顶部导航栏右侧内容,根据实际需要情况改变,我这里主要是回到首页和退出登录两个事件按钮,还有一个是欢迎语。
1 <template> 2 <div class="header"> 3 <el-breadcrumb separator="/"> 4 <el-breadcrumb-item :to="{ path: '/main' }">INFO首页</el-breadcrumb-item> 5 <el-breadcrumb-item v-for="(item, index) in $route.meta" :key="index">{{item}}</el-breadcrumb-item> 6 </el-breadcrumb> 7 <div style="margin-right:20px"> 8 <span>Welcome, {{userName}}!</span> 9 <el-button type="text" @click="home">[回到首页]</el-button> 10 <el-button type="text" @click="logout">[退出登录]</el-button> 11 </div> 12 </div> 13 </template>
这里说到路由,路由就是单页面应用的前面的主网址后面添加的不同名称的地址即不同的页面。直接上代码:
1 import Vue from 'vue' 2 import Router from 'vue-router' 3 Vue.use(Router) 4 5 const login = resolve => require(["@/page/login/login"], resolve); 6 7 const main = resolve => require(["@/page/main/main"], resolve); 8 const home = resolve => require(["@/page/home/home"], resolve); 9 const weather = resolve => require(["@/page/weather/weather"], resolve); 10 const tableOperation = resolve => require(["@/page/tableManager/tableOperation"], resolve); 11 const quillEditor = resolve => require(["@/page/tableManager/quillEditor"], resolve); 12 const starNews = resolve => require(["@/page/allNews/starNews"], resolve); 13 const explain = resolve => require(["@/page/explain/explain"], resolve); 14 15 16 export default new Router({ 17 routes: [ 18 { 19 path: '/', 20 component: login 21 }, 22 { 23 path: '/main', 24 component: main, 25 children: [{ 26 path: '', 27 component: home, 28 meta: [], 29 }, { 30 path: '/weather', 31 component: weather, 32 meta: ['天气预报', '实时天气'], 33 }, 34 { 35 path: '/tableOperation', 36 component: tableOperation, 37 meta: ['数据管理', '表格操作'], 38 }, 39 { 40 path: '/quillEditor', 41 component: quillEditor, 42 meta: ['数据管理', '文本编辑'], 43 }, 44 { 45 path: '/starNews', 46 component: starNews, 47 meta: ['新闻资讯', '明星八卦'], 48 }, 49 { 50 path: '/explain', 51 component: explain, 52 meta: ['说明', '说明'], 53 }, 54 55 ] 56 } 57 ] 58 })
要引入并使用vue-router模块,然后是根据路径来定义路径的组件名const main = resolve => require(["@/page/main/main"], resolve),最后在routes里面添加组件名,其中meta为面包屑导航需要的字段,代表了一种层级关系,children为在主视图下的二级路由视图,这点其实蛮有用的,路由视图就是<router-view></router-view>标签代表的内容。第一个路由视图在APP.vue里面,代表后面所有的内容,第二个在主文件里再次二次视图,代表左侧导航和顶部导航都不用重新加载。
四、其他。
其实写了这些有点不知道些什么下去了,过程中遇到的问题肯定是很多,学习是一个痛苦和快乐的过程,查不到解决方法时候的痛苦,做出来之后的喜悦。项目里难度最大的应该属于表格操作页了,增删改查,提交更改上传文件等等功能都有实现,借助了很多ui组件封装好的功能,部分也需要自己写逻辑。最困难的地方就是多条件查询了吧,实在是琢磨了好久,在网上找了好久,最后是用filter方法进行过滤表格数据完成的,需要弄清楚的是filter方法返回的是参数里值为真的数据,抓住这个重点就好了。
1 search(searchForm) { 2 this.results = this.list.filter(item => { 3 let MatchBusiness = true; 4 let MatchDep = true; 5 let MatchMajor = true; 6 let MatchSystemType = true; 7 let MatchStatus = true; 8 9 if (searchForm.depName) { 10 MatchDep = item.depName == searchForm.depName; 11 } 12 if (searchForm.majorName) { 13 MatchMajor = item.majorName == searchForm.majorName; 14 } 15 if (searchForm.status) { 16 MatchStatus = item.status == searchForm.status; 17 } 18 19 if (searchForm.busiSystem) { 20 // 模糊搜索; 21 let key = searchForm.busiSystem.trim(); 22 MatchBusiness = item.busiSystem.indexOf(key.trim()) != -1; 23 } 24 if (searchForm.systemType) { 25 // 模糊搜索; 26 let key = searchForm.systemType.trim(); 27 MatchSystemType = item.systemType.indexOf(key.trim()) != -1; 28 } 29 return ( 30 MatchBusiness && 31 MatchDep && 32 MatchMajor && 33 MatchSystemType && 34 MatchStatus 35 ); 36 }); 37 },
然后其他增删改就简单很多,利用js的push和splice方法完成,splice可删可改,删除就是讲当前索引下的数据替换为无this.tableData.splice(i, 1),修改则是新的数据替换