APICloud+Vue.js商城实战-1.脚首架开发(启动页)

1、openFrameGroup APICloud参考文档

https://docs.apicloud.com/Client-API/api#28
打开一组窗口,首页和子页面的容器

(1)定义容器
{
    x:0,             //左上角x坐标
    y:0,             //左上角y坐标
    w:320,           //宽度,若传'auto',页面从x位置开始自动充满父页面宽度
    h:480,          //高度,若传'auto',页面从y位置开始自动充满父页面高度

    marginLeft:0,    //相对父window左外边距的距离
    marginTop:0,     //相对父window上外边距的距离
    marginBottom:0,  //相对父window下外边距的距离
    marginRight:0    //相对父window右外边距的距离
}
(2)相关参数:
[{
    name:'',                                //frame名字,字符串类型,不能为空字符串
    url:'',                                 //页面地址,可以为本地文件路径,支持相对路径和绝对路径,以及 widget://、fs://等协议路径,也可以为远程地址。 当data参数不为空时,url将做为baseUrl,data中的html引用的资源文件根路径以该url为基础。字符串类型
    data:'',                                //(可选项)页面加载的数据内容,可以为html片段或者整张html文件的数据
    headers:{},                             //(可选项)请求头
    useWKWebView:false,                     //(可选项)是否使用WKWebView来加载页面。WKWebView具有Safari相同的JavaScript引擎,支持更多的HTML5特性,相比于UIWebView,在性能和功能方面都有很大提升。只支持iOS8.0及以上系统。注意使用WKWebView的页面localStorage有兼容性问题,建议使用Prefs代替。
    historyGestureEnabled:false,            //(可选项)是否可以通过手势来进行历史记录前进后退,只在useWKWebView参数为true时有效。
    pageParam:{},                           //(可选项)页面参数,页面中可以通过api.pageParam获取,JSON对象
    bounces:true,                           //(可选项)是否弹动,布尔型,默认值:若在 config.xml 里面配置了pageBounce,则默认值为配置的值,否则为true。注意如果页面使用了上拉、下拉刷新等功能,该属性可能会被刷新组件重新设置。
    bgColor:'#fff',                         //(可选项)背景色,支持图片和颜色,格式为#fff、#ffffff、rgba(r,g,b,a)等,图片路径支持fs://、widget://等APICloud自定义文件路径协议,同时支持相对路径
    scrollToTop:true                        //(可选项)当点击状态栏,页面是否滚动到顶部。若当前屏幕上不止一个页面的scrollToTop属性为true,则所有的都不会起作用。默认值:true。只iOS有效
    scrollEnabled:true                      //(可选项)页面内容超出后是否可以滚动,默认为true,只支持iOS
    vScrollBarEnabled:true,                 //(可选项)是否显示垂直滚动条,布尔型,默认值:true
    hScrollBarEnabled:false,                //(可选项)是否显示水平滚动条,布尔型,默认值:false
    scaleEnabled:true,                      //(可选项)页面是否可以缩放,布尔型,默认值:false
    allowEdit:false,                        //(可选项)是否允许长按页面时弹出选择菜单
    softInputMode:'auto'                    //(可选项)当键盘弹出时,输入框被盖住时,当前页面的调整方式,只iOS有效。
                                            //取值范围:
                                            //resize    //若键盘盖住输入框,页面会自动上移
                                            //pan       //若键盘盖住输入框,页面不会自动上移
                                            //auto      //默认值,由系统决定如何处理,iOS平台该字段等同于resize
    softInputBarEnabled:false,              //(可选项)是否显示键盘上方的工具条,布尔型,默认值:true,只iOS有效
    overScrollMode,                         //(可选项)设置页面滚动到头部或尾部时,显示回弹阴影效果的模式,仅Android有效。取值范围:never,always,scrolls
    customRefreshHeader:''                  //(可选项)设置使用自定义下拉刷新模块的名称,设置后可以使用api.setCustomRefreshHeaderInfo方法来使用自定义下拉刷新组件
}]
(3)示例代码
api.openFrameGroup({
    name: 'group1',
    rect: {
        x: 0,
        y: 0,
        w: 'auto',
        h: 'auto'
    },
    frames: [{
        name: 'frame1',
        url: 'frame1.html',
        bgColor: '#fff'
    }, {
        name: 'frame2',
        url: 'frame2.html',
        bgColor: '#fff'
    }]
}, function(ret, err) {
    var index = ret.index;
});

2、脚手架首页代码index.html

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>
    <meta name="format-detection" content="telephone=no,email=no,date=no,address=no">
    <title>商城APP</title>
    <link rel="stylesheet" type="text/css" href="css/ali-icon/iconfont.css"/>
    <link rel="stylesheet" type="text/css" href="css/aui.css"/>
    <link rel="stylesheet" type="text/css" href="css/public.css"/>
    <style>
        .disnone {
            display: none;
        }

        .disblock {
            display: block;
        }
        .active-danger span {
            color: #c0392b;
        }

        .iconfont {
            font-size: 22px;
            color: #8f8f94;
            padding-top: 5px;
            height: 30px;
            line-height: 30px;
            display: inline-block;
            position: relative;
        }
        .header-c{
            overflow: hidden;
        }
        .head-left {
            width: 90%;
            height: 30px;
            background: #E64E36;
            line-height: 30px;
            margin: 8px auto 0px auto;
            color: #fff;
            text-align: left;
            padding: 0 20px;
            border-radius: 5px;
            font-size: 14px;
        }
        .head-left .aui-iconfont {
            color: #fff;
            line-height: 30px;
            margin-right: 5px;
            font-size: 14px;;
        }
        .aui-badge {
            top: 0.1rem;
            left: 100%;
        }
        .active-danger span {
            color: #F35748;
        }
        .active-danger p {
            color: #F35748 !important;
        }
    </style>
</head>
<body>
<div id="app">
    <header class="aui-bar aui-bar-nav  disnone" style="background: #F35748;"
            v-for="(vo,index) in list"
            v-bind:class="{'disblock': cou_index== index}">
        <div class="aui-clearfix header-c" v-if="index < 2">
            <div class="aui-col-xs-10" onclick="open_search()" >
                <div class="head-left">
                    <i class="aui-iconfont aui-icon-search"></i>请输入关键字
                </div>
            </div>
            <div class="aui-col-xs-2 aui-pull-right">
                <i class="aui-iconfont aui-icon-message" onclick="openWin('member','info')" style="color:#fff"></i>
            </div>
        </div>

        <div class="aui-clearfix header-c" v-if="index>1">
            <div class="aui-title" >{{vo.title}}</div>
            <div class="aui-col-xs-2 aui-pull-right">
                <i class="aui-iconfont aui-icon-message" onclick="openWin('member','info')" style="color:#fff"></i>
            </div>
        </div>

    </header>
    <footer class="aui-nav" id="aui-footer">
        <ul class="aui-bar-tab aui-border-t">
            <li class="" v-for="(vo,index) in list" v-bind:class="{'active-danger': cou_index == index}" @click="change_menu(index)">
                <span class="iconfont icon-home7" v-if="index == 0"></span>
                <span class="iconfont icon-fenlei" v-if="index == 1"></span>
                <span class="iconfont icon-gouwuche" v-if="index == 2"><div class="aui-badge" v-if="total_goods_sum > 0">{{ total_goods_sum }}</div></span>
                <span class="iconfont icon-wode" v-if="index == 3"></span>
                <p>{{vo.title}}</p>
            </li>
        </ul>
    </footer>
</div>
</body>

</html>
<script type="text/javascript" src="script/api.js"></script>
<script type="text/javascript" src="script/common.js"></script>
<script type="text/javascript" src="script/vue.js"></script>
<script>
    var vm = new Vue({
        el: '#app',
        data: {
            total_goods_sum: 0,
            cou_index: 0,//显示当前索引
            list:[
                {title:'首页'},
                {title:'分类'},
                {title:'购物车'},
                {title:'我的'}
            ]
        },
        methods: {
            update_tatal_goods_sum: function () {
                api.ajax({
                    url: total_goods_sum_url,
                    method: 'post',
                    timeout: 30,
                    dataType: 'json',
                    returnAll: false,
                    data: {
                        values: {
                            token: $api.getStorage('token'),
                            deviceid: api.deviceId,
                        }
                    }
                }, function (ret, err) {
                    if (ret) {
                        if(ret.status == 1){
                            vm.total_goods_sum = ret.data.total_goods_sum;
                        }else{
                            vm.total_goods_sum = 0;
                        }

                    } else {
                        api.alert(JSON.stringify(err));
                    }
                });
            },
            init: function () {
                api.openFrameGroup({
                    name: 'IndexGroup',//app首页frame组预加载
                    background: 'bgcolor',
                    scrollEnabled: false,
                    rect: {
                        x: 0,
                        y: $api.dom('header').offsetHeight,
                        w: api.winWidth,
                        h: api.winHeight - $api.dom('header').offsetHeight  - $api.dom('footer').offsetHeight
                    },
                    index: vm.cou_index,
                    preload: true,
                    frames: [
                        {
                            name: 'index_index',
                            url: './html/index/index.html',
                            bgColor: 'bgcolor',
                            bounces: true,
                            reload: false
                        },
                        {
                            name: 'classify_index',
                            url: './html/classify/index.html',
                            bgColor: 'bgcolor',
                            bounces: false,
                            reload: true
                        },
                        {
                            name: 'cart_index',
                            url: './html/cart/index.html',
                            bgColor: 'bgcolor',
                            bounces: true,
                            reload: true
                        },
                        {
                            name: 'member_index',
                            url: './html/member/index.html',
                            bgColor: 'bgcolor',
                            bounces: true
                        }
                    ]
                }, function (ret, err) {

                });
            },
            change_menu: function (index) {
                if (index > 1) {
                    if (!is_login()) {
                        go_login();
                        return false;
                    }
                }
                if (vm.cou_index == index) {
                    return false;
                }
                //切换菜单
                vm.cou_index = index;
                api.setFrameGroupIndex({
                    name: 'IndexGroup',
                    index: index
                });
            }
        }
    });
    //以下是通用设置手机界面布局及兼容
    apiready = function () {
        $api.setStorage("Header-height",$api.dom('header').offsetHeight);//全局保存头部高度
        $api.setStorage("Footer-height",$api.dom('footer').offsetHeight);//全局保存底部高度
        var headerlist = $api.domAll('header');
        for (var i = 0; i < headerlist.length; i++) {
            $api.fixIos7Bar(headerlist[i]);//修复ios系统bar
        }
        //监听网络连接事件
        api.addEventListener({
            name: 'tatal_goods_sum'//添加购物车信息赋值
        }, function(ret, err) {
            vm.update_tatal_goods_sum();
        });
        vm.update_tatal_goods_sum();
        vm.init();

        api.addEventListener({
            name:'noticeclicked'
        },function(ret,err){
            var value = ret.value;
            if(ret.type == 0){
                //APICloud推送内容
            } else if(ret.type == 1){
                //开发者自定义消息
                alert(ret.value);

            }
        });

    };
</script>

总结:
(1)使用的aui.css和阿里巴巴的图标库。
(2)apiready = function () 是通用设置手机界面边角和兼容问题,暂时不研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,698评论 0 3
  • 引擎或模块问题:遇到应用层无法解决的问题,如果能确定需要引擎和模块支持的,不要自己想办法绕过去,要第一时间在开发者...
    无人像妳i阅读 3,722评论 0 2
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,486评论 1 45
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,031评论 0 2
  • “怎么?听你这意思,是想打架喽?” “是啊,你敢吗?”曾飞的语气轻蔑。 “哼,来啊,输了别哭鼻子。” 羽生夏树有些...
    君似阅读 363评论 2 6