Framework7——封装

强依赖:jQuery,Framework7 3,除非不支持jQuery,不然就是不支持Framework7,不然不可能不兼容
封装原则:在未来可能使用其他框架的前提下,在保证框架的可用性的同时,尽可能地提高复用性,尽量去除Framework7的个性化代码,一个组件一个对象,根据开发逐步添加函数
相对的,如果使用Vue或者其它,最好不要一起操作同一个dom,因为封装基于jQuery的dom操作
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <!-- framework7 -->
    <link rel="stylesheet" href="framework7/dist/css/framework7.min.css">
    <link rel="stylesheet" href="framework7/dist/css/framework7.md.min.css">
</head>
<body>
<div id="container" class='main-table' id="as-main-table" style="overflow: hidden">
</div>

<br>

<div id="container2" class="list links-list">
</div>

</body>

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="framework7/dist/js/framework7.min.js"></script>
<script>
    var app = new Framework7({
        root: '#app',
        name: 'My App',
        id: 'main_app',
        panel: {
            swipe: 'left'
        },
        touch: {
            tapHold: true //enable tap hold events
        },
        dialog: {
            // set default title for all dialog shortcuts
            title: '提示框',
            // change default "OK" button text
            buttonOk: '确定',
            buttonCancel: '关闭'
        },
        // Add default routes
        routes: [
            {
                path: '/about/',
                url: 'about.html',
            }
        ]
    });

    /**
     * Framework7
     *
     * 封装原则:在未来可能使用其他框架的前提下,在保证框架的可用性的同时,尽可能地提高复用性,尽量去除Framework7的个性化代码
     **/
    function SeabootFramework7(option) {
        var root = $(document);
        if (typeof option !== 'undefined') {
            initDom(option);
            root = option.dom;
        }

        /**
         * 查找dom对象
         * */
        function initDom(option) {
            if (typeof option.elem === 'string') {
                option.dom = root.find(option.elem);
            } else if (typeof option.elem === 'object') {
                option.dom = option.elem;
            } else {
                throw 'elem is undefined!';
            }
        }

        /**
         * 绑定值
         */
        function bindValue(dom, data) {
            dom.find('*').each(function () {
                var d = $(this), id = d.attr('id');
                if (typeof id !== 'undefined') {
                    var v = data[id];
                    if (typeof v !== 'undefined') {
                        d.text(v);
                    }
                }
            })
        }

        /**
         * 内置模版渲染
         **/
        function compile(str, data) {
            return Template7.compile(str)(data);
        }

        //-----------组件--------------

        //--Accordion start----
        function Accordion(dom, option) {
            //格式:var adapter = {renderItem: '', renderContent: '', initItem:'',initContent:''};
            var adapter = option.adapter, arr = option.data;

            /**
             * 渲染html
             */
            function renderHtml() {
                var list = [arr.length];
                for (var i = 0, len = arr.length; i < len; i++) {
                    list[i] = '<li class="accordion-item "><div class="item-content item-link">' +
                            adapter.renderItem(arr[i], i) +
                            '</div><div class="accordion-item-content"></div></li>';
                }
                var html = '<div class="list accordion-list" style="margin-top: 8px;padding: 0 8px"><ul style="border:1px solid #c8c7cc">' +
                        list.join('') +
                        '</ul></div>';
                dom.html(html);
            }

            function renderChild() {
                var lis = dom.find('ul:first').children('li');
                var isInitItem = typeof adapter.initItem === 'function';
                var isInitContent = typeof adapter.initContent === 'function';
                var i = 0;
                lis.each(function () {
                    var d = arr[i]
                            , li = $(this)
                            , itemDom = li.children('.item-content')
                            , contentDom = li.children('.accordion-item-content');
                    //渲染html
                    contentDom.html(adapter.renderContent(itemDom, d, i));
                    //事件及其它
                    if (isInitItem) {
                        adapter.initItem(itemDom, d, i);
                    }
                    //事件及其它
                    if (isInitContent) {
                        adapter.initContent(contentDom, d, i);
                    }
                    i++;
                });
            }

            function create() {
                renderHtml();
                renderChild();
            }

            return {
                setAdapter: function (a) {
                    adapter = a;
                },
                create: create
            }
        }

        //--Accordion end----

        /**
         * 组件的封装原则:
         *    参照android的做法,一个组件一个对象,因为没有布局的概念,所以只有一种接口规范,
         *    全局统一样式,不提供个性化css微调,必须调整直接操作dom
         *
         *    构造函数:ListView(dom, option),
         *        dom:     dom对象
         *        option:     elem:   元素
         *                  data:   数据
         *                  adapter:适配器,个性化代码渲染
         *
         *  adapter:提供给用户创建一个组件的回调函数,至少包含下面两个函数
         *        renderItem: 第一个回调函数必定是data,返回值必须是html字符串
         *        initItem:   初始化代码,第一个回调参数必定是dom,第二个回调必定是data
         **/
        //--ListView start--
        function ListView(dom, option) {
            //格式:var adapter = {renderItem: renderItem(data),initItem:initItem(dom, data)};
            var adapter = option.adapter, arr = option.data;

            //供未来微调
            function renderHtml() {
                var list = [arr.length];
                for (var i = 0, len = arr.length; i < len; i++) {
                    list[i] = '<li>' + adapter.renderItem(arr[i], i) + '</li>';
                }
                var html = '<div class="list links-list"><ul>' +
                        list.join('') +
                        '</ul></div>';
                //完成渲染
                dom.html(html);
            }

            function renderChild() {
                var lis = dom.find('ul:first').children('li');
                var isInitItem = typeof adapter.initItem === 'function';
                if (isInitItem) {
                    var i = 0;
                    lis.each(function () {
                        var d = arr[i], li = $(this);
                        //事件及其它
                        adapter.initItem(li, d, i);
                        i++;
                    });
                }
            }

            function create() {
                renderHtml();
                renderChild();
            }

            return {
                setAdapter: function (a) {
                    adapter = a;
                },
                create: create
            }
        }

        //--ListView end--

        /**
         * 函数
         **/
        return {
            bindValue: bindValue,
            compile: compile,
            createAccordion: function (o) {
                initDom(o);
                return new Accordion(o.dom, o);
            },
            createListView: function (o) {
                initDom(o);
                return new ListView(o.dom, o);
            }
        };
    }


    var boot = SeabootFramework7();

    //test listView
    var listView = boot.createListView({
        elem: '#container2'
        , data: [{name:'xiaoming'}, {name:'xiaodong'}]
        , adapter: {
            renderItem: function (data, i) {
                return '<a href="#">' +
                        '<div style="text-indent: 10px;"><span>' +data.name+ '</span></div>' +
                        '<div>' + i + '</div>' +
                        '</a>';
            },
            initItem: function (dom, data, i) {
                dom.click(function () {
                    console.log(i);
                })
            }
        }
    });

    //创建函数,供触发加载
    listView.create();

    //test accordion
    var accordion = boot.createAccordion({
        elem: '#container'
        , data: [{name:'xiaoming'}, {name:'xiaodong'}]
        , adapter: {
            renderItem: function (data, i) {
                return '<div class="item-inner" style="font-size: 20px;">' +
                        '<div class="item-title">' + data.name + '</div>' +
                        '<div>' +i+ '</div>' +
                        '</div>';
            },
            renderContent: function (dom, data, i) {
                return '<div class="list links-list">' +
                        '<ul class="location_ui_city">' +
                        '<li value="3bb035f7-28dd-4ba0-b358-d567d62901fb"><a href="#" class="">' +
                        '<div style="text-indent: 10px;">'+data.name + '--' + '</div>' +
                        '<div>3</div>' +
                        '</a></li>' +
                        '<li value="1ccca336-d662-4ebd-a998-02dc0f626bf3"><a href="#" class="">' +
                        '<div style="text-indent: 10px;">'+i+'</div>' +
                        '<div>657</div>' +
                        '</a></li>' +
                        '</ul>' +
                        '</div>';
            },
            initItem: function (dom, data, i) {
                boot.bindValue(dom, data);
            },
            initContent: function (dom, data, i) {
                dom.click(function () {
                    console.log(i)
                });
            }
        }
    });

    accordion.create();

</script>
</html>
原文地址:https://www.cnblogs.com/chenss15060100790/p/11199848.html