San 是百度开源的一个MVVM框架,兼容IE6,API文档地址:https://baidu.github.io/san/doc/api/
San的生命周期:
compiled
- 组件视图模板编译完成inited
- 组件实例初始化完成created
- 组件元素创建完成attached
- 组件已被附加到页面中updated
- 组件数据更新detached
- 组件从页面中移除disposed
- 组件卸载完成
San组件的写法:
Header.html
<div class="layui-layout layui-layout-admin" layadmin-themealias="ocean"> <ui-header s-ref="header" menus="{{menus}}"></ui-header> <div class="home-main" > <div class="absolute layui-tab layui-tab-card home-tabs" lay-filter="homeMenu"> <ul class="layui-tab-title layui-tab-title-draw"> <!--li>示例</li--> </ul> <div class="layui-tab-content layui-tab-content-draw" > <!--div class="layui-tab-item">示例</div--> </div> </div> </div> </div>
Header.js部分
define(function (require) { var san = require('san'); var req = require('requests'); // 引入htm var template = require('./lib/tpl!./components/Header.html'); var msgNotify = require('msgNotify'); var _this = null; return san.defineComponent({ template: template, initData:function(){ return{ menus:[], currentMenu:null, }; },
// 组件已挂载完成 attached: function () { _this = this; layui.use('element', function(){ var element = layui.element; //导航的hover效果、二级菜单等功能,需要依赖element模块 //监听导航点击 element.on('nav(demo)', function(elem){ layer.msg(elem.text()); }); }); },
// 事件 onMenuClick:function(menu){ if(menu.component){ // 组件传值:子组件传值给父组件 this.dispatch('header:menu-click',menu); } }, logout:function () { req.get(BASE+"logout",null,function (res) { if(res.status){ layer.msg("注销成功") setTimeout(function () { window.location.href= BASE+"login.html" },500); }else{ layer.msg("注销失败") } }); }, about:function () { layer.open({ title:"关于", shadeClose: true, //开启遮罩关闭 btn:[], content:'<div align="center">license:HBYP20170086</div>' }); } }) })
San父子组件交互
父组件
// html
<ui-header s-ref="header" menus="{{menus}}"></ui-header>
// js部分
// 组件
var Header = require('Header'); return san.defineComponent({ template: template, dropListeners: {}, initData: function () { return { }; },
// 父引入的组件 components: { 'ui-header': Header, }, messages: { 'header:menu-click': function (arg) { var menu = arg.value; this.switchMenuTab(menu); }, }, });
子组件
onMenuClick:function(menu){ if(menu.component){ // 组件传值:子组件传值给父组件 this.dispatch('header:menu-click',menu); } },