美文网首页
weex页面自定义导航栏组件

weex页面自定义导航栏组件

作者: zackwu | 来源:发表于2018-08-24 17:13 被阅读0次

    参考:Weex系列(1)-App端自定义导航条
    最近也在对weex项目做iOS适配工作,发现小伙伴们对于导航栏这块都放在单个页面单独写的,只要有一个小问题,适配起来就比较蛋疼,于是将所有页面的导航栏剥离处理统一处理,借鉴上述文章内容做了一点小小的改动优化。
    iOS除了新出的iPhone X导航条高度是88之外,其他设备都是64(我们的app最低支持iOS 9.0系统),而安卓的统一是45,所以先判断平台及设备。
    weex屏幕默认宽高是750 * 1334,逻辑分辨率是375 * 667,导航条在css中设置的高度要乘以2
    导航条的子控件有:左边图片、中间文字及右边图片或文字。
    左边增加属性判断是返回按钮(点击执行pop方法)或者其他按钮

    生成一个名叫 NavigationBar.vue 的文件 将下面的代码贴入

    <!--*******自定义导航条*******-->
    <template>
        <div>
            <!--iPhoneX -->
            <div class="iPhoneXDiv navbar" v-if="isiPhoneX"></div>
            <!--其他iOS设备 -->
            <div class="iOSDiv navbar" v-else-if="isiOS"></div>
            <!--安卓设备 -->
            <div class="android navbar" v-else-if="isAndroid"></div>
    
            <div class="subviews">
                <!--Title-->
                <text class="titletext">{{titleText}}</text>
                <!--左边图片-->
                <div class="left" @click="leftButtonClicked" v-if="showLeft">
                    <image :src="leftImage" class="left-button" :disabled="leftButtonDisabled"></image>
                </div>
    
                <div class="right-container" @click="rightButtonClicked" v-if="showRight">
                    <!--如果显示右边item , 图片或者文字 2选1 -->
                    <text class="right-text" v-if="rightText">{{rightText}}</text>
                    <image :src="rightImage" class="right-image" :style="{width:rightImageWidth + 'px', height:rightImageHeight + 'px'}" v-if="rightImage" :disabled="rightButtonDisabled"></image>
                </div>
            </div>
        </div>
    </template>
    
    <script>
        var device = weex.config.env;
        const Navigator = weex.requireModule('navigator');
        export default {
            /*props 属性列表*/
            props: {
                /*返回图片*/
                leftImage: {
                    type: String,
                    default: "local://icon_back.png"  //使用的本地资源图片
                },
                /*Title*/
    
                titleText: {
                    type: String,
                    default: ""
                },
                /*是否显示左边图片*/
                showLeft: {
                    type: Boolean,
                    default: true
                },
                /*showLeft=true时,左边是否是点击返回事件,否,则显示其他图片,重新给leftImage属性赋值*/
                isBack: {
                    type: Boolean,
                    default: true
                },
    
                leftButtonDisabled: {
                    type: Boolean,
                    default: true
                },
    
                /*是否显示右边item*/
                showRight: {
                    type: Boolean,
                    default: false
                },
                /*右边文字*/
                rightText: {
                    type: String,
                    default: ""
                },
    
                /*右边图片*/
                rightImage: {
                    type: String,
                    default: ""
                },
    
                rightImageWidth:{
                    type:[Number, String],
                    default:"38"
                },
    
                rightImageHeight:{
                    type:[Number, String],
                    default:"38"
                },
    
                rightButtonDisabled: {
                    type: Boolean,
                    default: true
                },
            },
    
            data() {
                return {
                    isiPhoneX: (device.platform === 'iOS') && (device.deviceWidth === 1125) && (device.deviceHeight === 2436),
                    isiOS: (device.platform === 'iOS'),
                    isAndroid: (device.platform === 'android'),
                    TitleText: "",
                }
            },
    
            methods: {
                //左边点击事件
                leftButtonClicked() {
                    if (this.showLeft) {
                        console.log('LeftItemClicked');
                        this.$emit('LeftItemClicked');
                    }
                },
    
                //右边点击事件
                rightButtonClicked() {
                    if (this.showRight) {
                        console.log('RightItemClicked');
                        this.$emit('RightItemClicked');
                    }
                },
            }
        };
    </script>
    
    <style scoped>
        /*导航条高度,预留90px,X加上86即是(88*2=176),iOS其他设备增加38即是128*/
        .iPhoneXDiv {
            height: 88px;
        }
        .iOSDiv {
            height: 40px;
        }
        .android {
            height: 0px;
        }
        .navbar {
            width: 750px;
            top: 0px;
            left: 0px;
            background-color: #FBFBFD;
        }
    
        /*************************/
        /*大佈局样式*/
        .subviews {
            height: 86px;
            width: 750px;
            left: 0px;
            background-color: #FBFBFD;
            border-bottom-color: #D9DDE3;
            border-bottom-width: 2px;
        }
        /*中间文字样式*/
        .titletext {
            font-size: 36px;
            color: #2D2F3B;
            position: relative;
            width: 750px;
            height: 88px;
            text-align: center;
            line-height: 88px;
            bottom: 0;
        }
        /*左边图片*/
        .left {
            justify-content: center;
            position: absolute;
            align-items: center;
            flex: 1;
            height: 88px;
            left: 20px;
            bottom: 0px;
            width: 50px;
        }
        /*图片按钮*/
        .left-button {
            width: 22px;
            height: 36px;
        }
        /*右边图片*/
        .right-container {
            justify-content: center;
            position: absolute;
            align-items: center;
            flex: 1;
            height: 88px;
            right: 30px;
            bottom: 0px;
        }
        .right-image {
            width: 38px;
            height: 38px;
        }
        /*右边文字*/
        .right-text {
            font-size: 32px;
            color: #1787F6;
        }
    </style>
    

    以上是内容单独卸载vue文件中如:NavigationBar.vue
    在其它vue文件中使用的方法

    <template>
        <div class="container">
            <!--导航条-->
                <div class="navbar">
                    <!--显示左边图片,右边隐藏-->
                    <NavBar
                            :show-left="true"
                            :is-back="true"
                            :title-text="title"
                            :show-right="true"
                            :right-image="rightImage"
                            :right-image-width="46"
                            :right-image-height="10"
                            @LeftItemClicked = "goback"
                            @RightItemClicked = "rightClick">
                    </NavBar>
             </div>
        </div>
    </template>
    
    <script>
        /*引用自定义的导航条控件*/
        import NavBar from '../lbase/NavigationBar.vue';
        export default {
            components:{NavBar}, //设置组件
            data(){
                return{
                    title:"设置",
                }
            },
            methods: {
               //点击左边按钮事件
                goback: function () {
                    //返回操作,我们此处调用的时iOS原生方法
                },
                rightButtonClick: function() {
                    //点击右侧按钮操作
                },
            }
        };
    </script>
    
    <style scoped>
        .navbar{
            top: 0px;
            width: 750px;
        }
        .container{
            background-color: rgba(245,245,245,1);
        }
    </style>
    
    

    相关文章

      网友评论

          本文标题:weex页面自定义导航栏组件

          本文链接:https://www.haomeiwen.com/subject/hlobiftx.html