# mi
**Repository Path**: kimsax/mi
## Basic Information
- **Project Name**: mi
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-05-06
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 原生js-仿小米官网首页
* 最近在学习 javaScript设计模式 ,所以打算模仿个东西实践一下自己的js。此页面使用原生js编码(**不使用jquery**)根据 `自己封装的数据` 对页面进行数据绑定(命令模式)
* 性能优化: JS代码优化/css sprite/懒加载/鼠标划过节流/滚动节流
* 工具: 前端业务逻辑工具包 outils
## 项目预览地址
[首页预览地址](https://lxs24sxl.github.io/mi/index.html)
[mix2页面预览地址](https://lxs24sxl.github.io/mi/mix2.html)
## 模块化代码实现
1. 进行数据封装(~~一点都不耗费时间~~)
```
data.js
var categoryData = {
"code": 200,
"result": "success",
"data": [
{
"index": 0,
"cateName": "phone",
"cateTitle": "手机 电话卡",
"childrenData": [
{
"imgSrc": "images/category/phone/note3-80-2.png",
"text": "小米Note 3"
},
{
"imgSrc": "images/category/phone/note3-80-2.png",
"text": "小米MIX 2"
},
...
]
}
]
}
```
2. 模块实现
```
index.js
/*模块实现模块*/
var viewCommand = (function () {
var tpl = {
// 轮播图-雨伞盒模块
carouselView: [
'
',
'',
'
',
'',
'',
'{#desc#}
',
'{#price#}
',
''
].join(''),
};
// 格式化字符串缓存字符串
var html = '';
function formateString ( str, obj ){
// 替换'{#'与'#}'之间的字符串
return str.replace(/\{#(\w+)#\}/g, function (match, key){
return obj[ key ];
})
}
// 方法集合
var Action = {
// 雨伞盒轮播图
createCarousel: function ( data, view ) {
var len = data.length;
if ( len ) {
for ( var i = 0; i < len; i++ ) {
html += formateString( tpl[ view ], data[ i ]);
}
}
},
insertCarousel: function ( container, data, view ) {
if ( data ) {
this.createCarousel( data, view );
}
document.getElementById( container ).innerHTML = html;
html = '';
},
}
// 命令接口
return function excute( msg ){
// 解析命令,如果msg.param不是数组则将其转化成数组(apply方法要求第二个参数为数组)
msg.param = Object.prototype.toString.call( msg.param ) === "[object Array]"?msg.param:[msg.param];
// Action内部调用的方法应用this,所以此处为保证作用域this执行传入Action
Action[ msg.command ].apply(Action, msg.param);
};
})();
```
3. 使用 原型模式 对代码进行重复性利用
原型模式: 用原型实例指向创建对象的类,适用于创建新的对象的类共享原型对象的属性以及方法
优点: 可重复性、可共享性、耗时少
```
// 轮播列表类
var LoopLists = function ( container, datas ) {
this.container = container;
this.datas = datas;
};
LoopLists.prototype = {
// 创建轮播列表
createList: function () {
viewCommand({
command: "insertCarousel",
param: [ 'carouselList' + this.datas.index, jsonToArr(this.datas.data), "carouselView"]
});
this.changeList();
},
// 创建动画
changeList: function () {
}
}
// 商品类
var ProduceLists = function (container, datas ) {
// 构造函数继承轮播列表类
LoopLists.call( this, container, datas );
}
ProduceLists.prototype = new LoopLists();
```
4. 创建实例并传入不同的参数,显示出2种不同的雨伞盒轮播图效果
```
// 明星商品类
var starCarousel = new ProduceLists( "starGoods", carouselData.data.starData );
starCarousel.createList();
// 为你推荐类
var recCarousel = new ProduceLists( "recommend", carouselData.data.recommend );
recCarousel.createList();
```