# 小知识1
## 一、常见的菜单列表
![](https://oscimg.oschina.net/oscnet/aa37d1de2d854c7cc6e7f3c32986b533434.jpg)
我们以一个菜单的案例展开,先来看一个平常程序员怎么常规的vue文件如何写?
以element-ui为基础组件的部分代码
```
<el-row :span="24">
<el-col span="8" @click="event1">
<i class="icon-caidan1" :style="{backgroundColor:color1}"></i>
<p>菜单1</p>
</el-col>
<el-col span="8" @click="event2">
<i class="icon-caidan2" :style="{backgroundColor:color2}"></i>
<p>菜单2</p>
</el-col>
<el-col span="8" @click="event3">
<i class="icon-caidan3" :style="{backgroundColor:color3}"></i>
<p>菜单3</p>
</el-col>
<el-col span="8" @click="event4">
<i class="icon-caidan4" :style="{backgroundColor:color4}"></i>
<p>菜单4</p>
</el-col>
</el-row>
```
这就是大多数人们写的代码,有着大量的重复代码,而且难以高效的维护,如果让再加10个菜单,他就会ctrl+c/ctrl+v复制10个出来,代码量特别的大
## 二、数据驱动视图
>(数据+模版=视图)
我们分析代码发现有很多重复的部分,无疑是改变了几个关键的信息
- 图标
- 标题
- 背景色
- 点击事件
- 其他参数
我们把上述的参数具体为了一个对象数组,也就是我们说的(数据层)
```
[
{
title:'菜单1',
icon:'icon-caidan1',
event:'event1,
style:{
backgroundColor:'color1'
color:'color1'
}
}
...
]
```
我们想想如果用循环的方式遍历这个数组对象,把相关的关键内容填充到相应的位置,换言之就是插入到我们的卡槽中,我们接下来构建我们的卡槽(模版层)
```
<el-row :span="24" v-for="(item,index) in list" :key="index">
<el-col span="8" @click="goLink(item)">
<i :class="item.icon" :style=loadStyle(item)></i>
<p v-text="item.title"></p>
</el-col>
</el-row>
```
接下来我们写goLink和loadStyle,逻辑写起来比较简单
```
...
event1(item){
//每一个菜单对应的事件逻辑
},
...
goLink(item){
this[item.event](item);
},
loadStyle(item){
const style = item.style;
return style
}
```
- list就是我们前面构建的数组对象
- goLink我们点击事件的处理方法,并将item当前数据对象传入方法
- loadStyle我们样式加载处理方法
接下来我们将数据和模版组合到一起就呈现我们看到的视图了,从而达到了数据驱动视图的质量高、维护性高的优点
再接着我们上面的老板的需求,让我们加10个20个都不用去写重复代码,只要在数据数组中配置好要加的东西即可
## 番外
在js里面,经常需要使用js往页面中插入html内容。
比如这样:
```
var number = 123;
$('#d').append('<div class="t">'+number+'</div>');
```
- 如果html很短还好说,但是遇到描述里面的这么大段,直接用字符串存储会很困难,因为不光要处理单引号,还需要很多「+」号把字符串一个个连接起来,十分的不方便。
- 给script设置type="text/template",标签里面的内容不会被执行,也不会显示在页面上,但是可以在另一个script里面通过获取插入到页面中。这样就把大段的HTML操作从js里面分离开了。
```
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<div id="user_info"></div>
</body>
<script type="text/tmplate" id="tmplate">
<div>
<ul>
<li>姓名:{{name}}</li>
<li>年龄:{{age}}</li>
<li>电话:{{phone}}</li>
</ul>
</div>
</script>
<script type="application/javascript">
//实例参数
var user = { name: "陈立明", age: 23, phone: "15932582632"};
//模板
var template = document.getElementById("tmplate").innerHTML;
//使用mustache.js进行模板解析填充数据
var view = template.replace('{{name}}',user.name)
view = view.replace('{{age}}',user.age)
view = view.replace('{{phone}}',user.phone)
document.getElementById("user_info").innerHTML = view;
</script>
</html>
```