uniapp插件-导航栏菜单设计与实现(设计)

1,596 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战」。

平台兼容性

首先我们看看考虑到的兼容的平台。

Vue2Vue3
×
App微信小程序支付宝小程序百度小程序字节小程序QQ小程序快应用
3.1.20 app-vue?????
H5-SafariAndroid Browser微信浏览器(Android)QQ浏览器(Android)ChromeIEEdgeFirefoxPC-Safari
?

功能说明

image.png 大致构思如图所示:
1、选项胶囊需要有滑动切换效果。
2、选项胶囊可自定义颜色、速度等。
3、选项内容区域dom可以通过slot暴露,增加扩展性,并且对宽度不做固定限制。
4、选项内容无数量限制,可设置不定宽或者定宽。 5、事件点击反馈事件

参数使用确定

通过组件传参的方式实现要求
2、选项胶囊可自定义颜色、速度等。

属性名类型默认值说明
optionArray<Object>[{ name: '全部'}]菜单项目,name为当前显示字段,格式如:[{ name: '全部'}, { name: '选项一' }]
scrollBooleantrue是否滑动
secNumber0.25胶囊速度
widthNumber40胶囊宽
colourStringrgba(243, 152, 0, 1)胶囊颜色

事件和插槽确定

事件 @feedback
5、事件点击反馈事件
通过v-slot实现要求三。
3、选项内容区域dom可以通过slot暴露,增加扩展性,并且对宽度不做固定限制。

属性名类型默认值说明
@feedback[Number, String]-当前选中时的事件反馈,返回值为当前下标
v-slotObject-插槽,通过v-slot:="{ item, active }"获取,item为当前项数据,active为是否选中

使用

使用方式考虑两种加载方式:
1、全局引入:遵循uniapp-easycom组件规则,让组件导入既可用。点击查看easycom组件规则
2、局部引入:遵循vue局部引入方式。例:

import duNav from '@/components/du-nav/du-nav.vue'
export default { components: { duNav } }
    <du-nav :option="Array<Object>" @feedback="feedback">
                    <template v-slot:="{ item, active }">
                        <text>{{ item.name }}</text>
                    </template>
    </du-nav>

示例

好了我们看看实例代码吧! 组要分为滑动内容导航和定宽导航

<template>
    <view>
        <view class="consent">
            <view class="common-page-head">可滑动导航(默认)</view>
            <view class="consent-item-1">
                <du-nav :option="list1" @feedback="feedback">
                    <template v-slot:="{ item, active }">
                        <text>{{ item.name }}</text>
                    </template>
                </du-nav>
            </view>
            <view class="common-page-head">固定导航</view>
            <view class="consent-item-2">
                <du-nav :option="list2" :scroll="false" width="66">
                    <template v-slot:="{ item, active }">
                        <text>{{ item.name }}</text>
                    </template>
                </du-nav>
            </view>
        </view>
    </view>
</template>

<script>
/**
 * 插槽参数 active=>false true  可自行判断修改text样式
 */
export default {
    data() {
        return {
            list1: [
                { name: '全部', type: '0' },
                { name: '选项一', type: '1' },
                { name: '选项二', type: '2' },
                { name: '选项三', type: '3' },
                { name: '选项四', type: '4' },
                { name: '选项五', type: '5' },
                { name: '选项六', type: '6' },
                { name: '选项七', type: '7' }
            ],
            list2: [{ name: '全部', type: '0' }, { name: '选项一', type: '1' }, { name: '选项二', type: '2' }, { name: '选项二', type: '3' }]
        };
    },
    methods:{
        /**
         * @param [Number, String] i 当前选中下标
         */
        feedback(i){
            console.log(i)
        }
    }
};
</script>

<style lang="less">
.consent {
    margin-bottom: 12px;
    padding: 15upx;
    .consent-item-1 {
        border: 1upx solid #f4f4f4;
    }
    .consent-item-2 {
        border: 1upx solid #f4f4f4;
        padding: 0 20upx; //可自行调整内边距
    }
}
</style>

结尾

细心的朋友可能发现前面说的 1、选项胶囊需要有滑动切换效果。和选项内容无数量限制,可设置不定宽或者定宽还没有说明。
那怎么实现滑动? 怎么不定宽实现胶囊的坐标滑动距离?
今天我们将了大致的思路和属性的确定,我们明天就具体说说怎么实现吧。