本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15
MVC(model, view, controller),用一种将业务逻辑、数据、视图分离的方式组织代码。
(function() {
var MVC = MVC || {};
var formatString = function (str, data) {
return str.replace(/{#(\w+)#}/g, function(match, key) {
return typeof data[key] === undefined ? '' : data[key]
})
}
// 数据层模型
// 自执行函数 返回一个数据模型层对象操作方法
MVC.model = (function() {
var M = {};
M.data = {
// 左侧导航栏展示相关的数据
slideBar: [
{
text: '动漫',
title: '动漫title',
content: '动漫content',
href: 'https://www.baidu.com'
},
{
text: '电竞',
title: '电竞title',
content: '电竞content',
href: 'https://www.baidu.com'
},
{
text: '新闻',
title: '新闻title',
content: '新闻content',
href: 'https://www.baidu.com'
},
],
};
return {
getData: function(key) {
return M.data[key];
},
setData: function(key, value) {
M.data[key] = value;
return this;
},
}
}());
// 视图层模型
// 自执行函数 返回一个根据视图名称返回视图的函数
MVC.view = (function() {
var model = MVC.model;
// 视图对象
var views = {
createSlideBar: function() {
var html = '';
var data = model.getData('slideBar');
if (!data || !data.length) {
return;
}
var dom = document.createElement('div');
var tpl = {
container: [
'<div><ul>{#content#}</ul></div>',
].join(''),
item: [
'<li style="display: flex; height: 100px;">',
'<a class="icon" href="{#href#}" style="display: inline-block">',
'<span>{#text#}</span>',
'</a>',
'<div class="box" style="display: none;">',
'<p>',
'{#title#}',
'</p>',
'<p>',
'{#content#}',
'</p>',
'</div>',
'</li>'
].join('')
};
for (var i = 0, len = data.length; i < len; i++) {
html += formatString(tpl.item, data[i]);
}
dom.innerHTML = formatString(tpl.container, { content: html })
document.body.appendChild(dom);
}
};
return function(name) {
views[name]();
}
}());
// 控制器层
MVC.ctrl = (function() {
var view = MVC.view;
var controller = {
initSlideBar: function() {
// 渲染视图
view('createSlideBar');
var ul = document.getElementsByTagName('ul')[0];
ul.addEventListener('mouseover', function(e) {
console.log(e.target);
if (e.target.nodeName === 'LI') {
var box = e.target.getElementsByClassName('box')[0];
box.style.display = 'block';
}
});
ul.addEventListener('mouseout', function(e) {
if (e.target.nodeName === 'LI') {
var box = e.target.getElementsByClassName('box')[0];
box.style.display = 'none';
}
});
}
};
controller.initSlideBar();
}());
}())
MVC架构模式很好地解决了页面中数据层、视图层、业务逻辑层(控制层)之间的耦合关系,使它们得到显性的区分,这也使得层次之间的耦合度降低,使得我们在开发中可以不用顾忌所有需求而专注于某一层次开发,降低了开发与维护成本,提升了开发效率。如果页面系统足够复杂,某些视图要共享同一组数据,或者某些需求的实现引用类似视图,此时MVC模式便可提高某些视图与数据的复用率。