lc-tab-page

页面滑动切换组件

注意事项

  • 支持图文和纯文字,支持滚动;
  • 常用于 Tab 切换页面,目前支持icon和文字形式;
  • Android 由于点击事件和滑动手势冲突约束,需在子元素上绑定对应事件,可通过<lc-pan-item>解决此问题,同时记得在LcPanItemPan事件回调中处理 Android 事件;
  • 支持居中形式 Tab,将 tabStyles 中的 leftOffset/rightOffset 配置合适的值即可;
  • 不要将 <scroller> 作为 <lc-tab-page> 的子组件,使用 <list> 代替。

效果

使用方法

<template>
<div class="lc-demo">
<scroller class="scroller">
<title title="lc-tab-page"></title>
<category title="纯文字可滚动"></category>
<div class="demo">
<lc-tab-page
ref="lc-tab-page1"
:tab-titles="tabTitles"
:tab-styles="tabStyles"
title-type="icon"
:needSlider="needSlider"
:is-tab-view="isTabView"
:tab-page-height="tabPageHeight"
:spm-c="4307989"
@LcTabPageCurrentTabSelected="LcTabPageCurrentTabSelected">

<list v-for="(v,index) in tabList"
:key="index"
class="item-container">
<cell class="border-cell"></cell>
<cell v-for="(demo,key) in v"
class="cell"
:key="key"
:accessible="true"
aria-label="招商公路华能水电何以成为资金“新宠”">
<lc-pan-item @LcPanItemPan="LcPanItemPan(1,$event)">
<lc-item image="http://img5.imgtn.bdimg.com/it/u=2306629954,650632153&fm=27&gp=0.jpg"
:image-text="tabTitles[index].title"
title="2018港股投资:不仅看“大而美”,中小市值公司“颜值”也不低"
:desc="desc"
:tags="tags"
price-desc="每日经济新闻 12-29 08:23">
</lc-item>
</lc-pan-item>
</cell>
</list>
</lc-tab-page>
</div>

<category title="图文可滚动"></category>
<div class="demo">
<lc-tab-page ref="lc-tab-page2"
:tab-titles="tabTitles1"
:tab-styles="tabStyles1"
title-type="icon"
:needSlider="needSlider"
:is-tab-view="isTabView"
:tab-page-height="tabPageHeight"
:spm-c="4307989"
@LcTabPageCurrentTabSelected="LcTabPageCurrentTabSelected1">
<list v-for="(v,index) in tabList1"
:key="index"
class="item-container">
<cell class="border-cell"></cell>
<cell v-for="(demo,key) in v"
class="cell"
:key="key"
:accessible="true"
aria-label="招商公路华能水电何以成为资金“新宠”">
<lc-pan-item @LcPanItemPan="LcPanItemPan(2,$event)">
<lc-item image="http://img5.imgtn.bdimg.com/it/u=2306629954,650632153&fm=27&gp=0.jpg"
:image-text="tabTitles1[index].title"
title="2018港股投资:不仅看“大而美”,中小市值公司“颜值”也不低"
:desc="desc"
:tags="tags"
price-desc="每日经济新闻 12-29 08:23">
</lc-item>
</lc-pan-item>
</cell>
</list>
</lc-tab-page>
</div>

<category title="纯文字不可滚动-普通"></category>
<div class="demo">
<lc-tab-page type="normal"
ref="lc-tab-page3"
:tab-titles="tabTitles2"
title-type="text"
:tab-page-height="tabPageHeight"
:spm-c="4307989"
@LcTabPageCurrentTabSelected="LcTabPageCurrentTabSelected2">
<list v-for="(v,index) in tabList2"
:key="index"
class="item-container">
<cell class="border-cell"></cell>
<cell v-for="(demo,key) in v"
class="cell"
:key="key"
:accessible="true"
aria-label="招商公路华能水电何以成为资金“新宠”">
<lc-pan-item @LcPanItemPan="LcPanItemPan(3,$event)">
<lc-item image="http://img5.imgtn.bdimg.com/it/u=2306629954,650632153&fm=27&gp=0.jpg"
:image-text="tabTitles2[index].title"
title="2018港股投资:不仅看“大而美”,中小市值公司“颜值”也不低"
:desc="desc"
:tags="tags"
price-desc="每日经济新闻 12-29 08:23">
</lc-item>
</lc-pan-item>
</cell>
</list>
</lc-tab-page>
</div>


<category title="纯文字不可滚动-卡片"></category>
<div class="demo">
<lc-tab-page type="card"
ref="lc-tab-page4"
:tab-titles="tabTitles2"
title-type="text"
:tab-page-height="tabPageHeight"
:spm-c="4307989"
@LcTabPageCurrentTabSelected="LcTabPageCurrentTabSelected2">
<list v-for="(v,index) in tabList2"
:key="index"
class="item-container">
<cell class="border-cell"></cell>
<cell v-for="(demo,key) in v"
class="cell"
:key="key"
:accessible="true"
aria-label="招商公路华能水电何以成为资金“新宠”">
<lc-pan-item @LcPanItemPan="LcPanItemPan(4,$event)">
<lc-item image="http://img5.imgtn.bdimg.com/it/u=2306629954,650632153&fm=27&gp=0.jpg"
:image-text="tabTitles2[index].title"
title="2018港股投资:不仅看“大而美”,中小市值公司“颜值”也不低"
:desc="desc"
:tags="tags"
price-desc="每日经济新闻 12-29 08:23">
</lc-item>
</lc-pan-item>
</cell>
</list>
</lc-tab-page>
</div>
</scroller>
</div>
</template>

<style scoped>
.lc-demo {
/* position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0; */
background-color: #F9F9F9;
}

.scroller {
flex: 1;
}

.demo {
width: 750px;
height: 380px;
align-items: flex-start;
}
.item-container {
width: 750px;
height: 320px;
background-color: #F9F9F9;
}
.border-cell {
background-color: #F9F9F9;
width: 750px;
height: 24px;
align-items: center;
justify-content: center;
}

.cell {
background-color: #ffffff;
border-top-width: 1px;
border-style: solid;
border-color: #D7D7D7;
border-bottom-width: 1px;
}
</style>

<script>
import Light from "light";
const dom = Light.requireModule('dom');

import Title from 'lighting-ui/packages/_mods/title.vue';
import Category from 'lighting-ui/packages/_mods/category.vue';
import Config from './tools/tabpage-config.js'
import LcItem from './tools/lc-item.vue';
import Utils from './tools/utils.js';
import LcTabPage from 'lighting-ui/packages/lc-tab-page';
import LcPanItem from 'lighting-ui/packages/lc-pan-item';

export default {
components: { LcTabPage, LcItem, Title, Category, LcPanItem },
data: () => ({
tabTitles: Config.tabTitles,
tabTitles1: Config.tabTitles1,
tabTitles2: Config.tabTitles2,
tabTitles3: Config.tabTitles3,
tabStyles: Config.tabStyles,
tabStyles1: Config.tabStyles1,
tabStyles2: Config.tabStyles2,
tabStyles3: Config.tabStyles3,
tabList: [],
tabList1: [],
tabList2: [],
tabList3: [],
needSlider: true,
demoList: [1],
supportSlide: true,
isTabView: true,
tabPageHeight: 380,
desc: [{
type: 'text',
value: '',
theme: 'gray'
}],
tags: [{
type: 'tag',
value: '国企金融版',
theme: 'red'
}]
}),
created () {
// this.tabPageHeight = Utils.env.getPageHeight();
this.tabList = [...Array(this.tabTitles.length).keys()].map(i => []);
Light.Vue.set(this.tabList, 0, this.demoList);
this.tabList1 = [...Array(this.tabTitles1.length).keys()].map(i => []);
Light.Vue.set(this.tabList1, 0, this.demoList);
this.tabList2 = [...Array(this.tabTitles2.length).keys()].map(i => []);
Light.Vue.set(this.tabList2, 0, this.demoList);
this.tabList3 = [...Array(this.tabTitles3.length).keys()].map(i => []);
Light.Vue.set(this.tabList3, 0, this.demoList);
},
methods: {
LcPanItemPan (index,e) {
if (Utils.env.supportsEBForAndroid()) {
this.$refs['lc-tab-page'+index].bindExp(e.element)
}
},
LcTabPageCurrentTabSelected (e) {
const self = this;
const index = e.page;
/* 未加载tab模拟数据请求 */
if (!Utils.isNonEmptyArray(self.tabList[index])) {
setTimeout(() => {
Light.Vue.set(self.tabList, index, self.demoList);
}, 100);
}
},
LcTabPageCurrentTabSelected1 (e) {
const self1 = this;
const index1 = e.page;
/* 未加载tab模拟数据请求 */
if (!Utils.isNonEmptyArray(self1.tabList1[index1])) {
setTimeout(() => {
Light.Vue.set(self1.tabList1, index1, self1.demoList);
}, 100);
}
},
LcTabPageCurrentTabSelected2 (e) {
const self2 = this;
const index2 = e.page;
/* 未加载tab模拟数据请求 */
if (!Utils.isNonEmptyArray(self2.tabList2[index2])) {
setTimeout(() => {
Light.Vue.set(self2.tabList2, index2, self2.demoList);
}, 100);
}
},
lcTabPageCurrentTabSelected3 (e) {
const self3 = this;
const index3 = e.page;
/* 未加载tab模拟数据请求 */
if (!Utils.isNonEmptyArray(self3.tabList3[index3])) {
setTimeout(() => {
Light.Vue.set(self3.tabList3, index3, self3.demoList);
}, 100);
}
}
}
};
</script>

tabpage-config.js


export default {
tabTitles: [
{ title: '指数' },
{ title: '沪深' },
{ title: '板块' },
{ title: '港股' },
{ title: '美股' },
{ title: '模拟' },
{ title: '个股' },
{ title: '中小板' }
],

tabTitles1: [
{
title: '指数',
icon: 'https://gw.alicdn.com/tfs/TB1MWXdSpXXXXcmXXXXXXXXXXXX-72-72.png',
activeIcon: 'https://gw.alicdn.com/tfs/TB1kCk2SXXXXXXFXFXXXXXXXXXX-72-72.png'
},
{
title: '沪深',
icon: 'https://gw.alicdn.com/tfs/TB1ARoKSXXXXXc9XVXXXXXXXXXX-72-72.png',
activeIcon: 'https://gw.alicdn.com/tfs/TB19Z72SXXXXXamXFXXXXXXXXXX-72-72.png'
},
{
title: '板块',
icon: 'https://gw.alicdn.com/tfs/TB1VKMISXXXXXbyaXXXXXXXXXXX-72-72.png',
activeIcon: 'https://gw.alicdn.com/tfs/TB1aTgZSXXXXXazXFXXXXXXXXXX-72-72.png'
},
{
title: '港股',
icon: 'https://gw.alicdn.com/tfs/TB1Do3tSXXXXXXMaFXXXXXXXXXX-72-72.png',
activeIcon: 'https://gw.alicdn.com/tfs/TB1LiNhSpXXXXaWXXXXXXXXXXXX-72-72.png'
},
{
title: '美股',
icon: 'https://gw.alicdn.com/tfs/TB199sPSXXXXXb4XVXXXXXXXXXX-72-72.png',
activeIcon: 'https://gw.alicdn.com/tfs/TB1DR.3SXXXXXc2XpXXXXXXXXXX-72-72.png'
},
{
title: '其他',
icon: 'https://gw.alicdn.com/tfs/TB1hedfSpXXXXchXXXXXXXXXXXX-72-72.png',
activeIcon: 'https://gw.alicdn.com/tfs/TB1mrXaSpXXXXaqXpXXXXXXXXXX-72-72.png'
}

],

tabTitles2: [
{ title: '指数' },
{ title: '沪深' },
{ title: '板块' },
{ title: '港美股' }
],

tabTitles3: [
{ title: '指数' },
{ title: '沪深' },
{ title: '板块' },
{ title: '港美股' }
],

tabStyles: {
bgColor: '#FFFFFF',
titleColor: '#7A7A7A',
activeTitleColor: '#4A4A4A',
activeBgColor: '#FFFFFF',
isActiveTitleBold: true,
width: 120,
height: 60,
fontSize: 24,
hasActiveBottom: true,
bottomColor: '#0aa96b',
activeBottomColor: '#4A90E2',
activeBottomHeight: 6,
activeBottomWidth: 100,
textPaddingLeft: 10,
textPaddingRight: 10
},
tabStyles1: {
bgColor: '#FFFFFF',
titleColor: '#7A7A7A',
activeTitleColor: '#4A4A4A',
activeBgColor: '#FFFFFF',
isActiveTitleBold: true,
iconWidth: 70,
iconHeight: 70,
width: 160,
height: 120,
fontSize: 24,
hasActiveBottom: true,
activeBottomColor: '#4A90E2',
activeBottomHeight: 6,
activeBottomWidth: 120,
textPaddingLeft: 10,
textPaddingRight: 10
}
}

可配置参数

Prop Type Required Default Description
type String N scroll 顶部类型 scroll / normal / card
tab-titles Array Y [] 顶部
title-type String N icon 顶部类型 icon/text
tip-style Object N 提示信息样式(tabTitles传入tip字段生效)
tab-styles Array N [] 顶部
tab-styles-normal Array N [] 顶部(纯文字不可滚动-普通)
tab-styles-card Array N [] 顶部(纯文字不可滚动-卡片)
tab-page-height Number N 1334 Tab page 页面的高度
is-tab-view Boolean N true 当设置为false,同时 tab 配置 url 参数即可跳出
need-slider Boolean N true 是否需要滑动功能
pan-dist Number N 200 滚动多少切换上下一屏幕
duration Number N 300 页面切换动画的时间
timing-function String N - 页面切换动画函数
title-use-slot Boolean N false 使用 slot 配置头部导航 (注1)
wrap-bg-color String N #F2F3F4 页面背景颜色

注1:自定义头部导航块(type为scroll时)

  • 当使用slot的方式配置头部导航的时候,需要确保原有简单配置已经不能满足现有需求情况下再使用,可以传入参数:title-use-slot="true",同时在wxc-tab-page组件内部传入如下slot对应节点即可
  • 可以通过遍历到方式来生成,同时根据wxcTabPageCurrentTabSelected来确定当前的选择页,自己管理颜色即可。
    <div slot="tab-title-0"><text>111</text></div>
    <div slot="tab-title-1"><text>222</text></div>
    <div slot="tab-title-2"><text>333</text></div>

主动触发设置页面(type为scroll时)

// 直接在lc-tab-page上面绑定ref="lc-tab-page",然后调用即可
this.$refs['lc-tab-page'].setPage(2)

// 如果想设置无动画跳转,可以这样使用(中间参数用于设置url,设置null即可)
this.$refs['lc-tab-page'].setPage(2,null,false);

事件回调

@LcTabPageCurrentTabSelected="LcTabPageCurrentTabSelected"

lc-pan-item 的使用(type为scroll时)

参数

Prop Type Required Default Description
ext-id Number、String Y 0 滑动元素的id索引
url String N - url跳转链接,自己处理可以不传

使用

// 组件使用
<lc-pan-item
:ext-id="1"
:url="url"
@LcPanItemClick="LcPanItemClick"
@LcPanItemPan="LcPanItemPan">
<your-item>....</your-item>
</lc-pan-item>

// 引用
import { LcPanItem } from 'light-ui';

//回调
LcPanItemPan (e) {
if (Utils.env.supportsEBForAndroid()) {
this.$refs['lc-tab-page'].bindExp(e.element);
}
}