渲染出一个带过渡动画带选项卡
- 支持受控/非受控
npm install @qnpm/q-animatedTab --save --registry=http://npmrepo.corp.qunar.com
显示代码
import AnimatedTab from '@qnpm/q-animatedTab';
const renderBaseTab = (props) => {
const [
selected,
setSelected
] = useState(props.selectedIndex);
return (
<View>
<AnimatedTab
{...props}
selectedIndex={selected}
onClickItem={(index, selected) => {
setSelected(index);
}}
/>
</View>
);
};
const itemList = [
{text: '酒店'},
{text: '机票'},
{text: '门票'},
{text: '一日游'}];
return (
<View style={[styles.container]}>
<TextSplit text={"基础"}/>
{
renderBaseTab({
itemList
})
}
<TextSplit text={"宽度相等"}/>
{
renderBaseTab({
itemList,
equantLayout: 'equalWidth'
})
}
<TextSplit text={"间距相等"}/>
{
renderBaseTab({
itemList,
equantLayout: 'equalSpacing'
})
}
<TextSplit text={"自定义样式"}/>
{
renderBaseTab({
itemList,
customStyle: {
wrapperStyle: {
backgroundColor: '#eee'
},
itemStyle: {
color: '#000',
unselectedColor: '#ccc'
}
}
})
}
</View>
)
显示代码
import AnimatedTab from '@qnpm/q-animatedTab';
const renderBaseTab = (props) => {
const [
selected,
setSelected
] = useState(props.selectedIndex);
return (
<View>
<AnimatedTab
{...props}
selectedIndex={selected}
onClickItem={(index, selected) => {
setSelected(index);
}}
/>
</View>
);
};
const itemList = [
{text: '酒店'},
{text: '机票'},
{text: '门票'},
{text: '门票2'},
{text: '门票3'},
{text: '门票4'},
{text: '一日游'}];
return (
<View style={[styles.container]}>
<TextSplit text={"基础"}/>
{
renderBaseTab({
itemList
})
}
<TextSplit text={"默认展示更多-黑色遮罩"}/>
{
renderBaseTab({
itemList,
onClickMoreItem: () => {
console.log('click more');
},
darkMask: true
})
}
<TextSplit text={"默认展示更多-白色遮罩"}/>
{
renderBaseTab({
itemList,
onClickMoreItem: () => {
console.log('click more');
}
})
}
</View>
)
显示代码
import AnimatedTab from '@qnpm/q-animatedTab';
const renderBaseTab = (props) => {
const [
selected,
setSelected
] = useState(props.selectedIndex);
return (
<View>
<AnimatedTab
{...props}
selectedIndex={selected}
onClickItem={(index, selected) => {
setSelected(index);
}}
/>
</View>
);
};
const itemList = [
{text: '酒店'},
{text: '机票'},
{text: '门票'}];
return (
<View style={[styles.container]}>
<TextSplit text={"基础受控"}/>
{
renderBaseTab({
itemList,
selectedIndex: 1
})
}
<TextSplit text={"基础非受控"}/>
{/* @ts-ignore */}
<AnimatedTab
itemList={itemList}
onClickItem={(index, selected) => {
console.log(index, selected)
}}
/>
</View>
)
属性名 | 类型 | 默认值 | 是否必须 | 说明 |
---|---|---|---|---|
customStyle |
wrapperStyle |itemStyle |
undefined |
false |
部分支持自定义style |
darkMask |
boolean |
false |
false |
是否黑色遮罩颜色,默认false,为白色 |
equantLayout |
equalWidth |equalSpacing |
undefined |
false |
等分布局类型,默认不等分 |
itemList |
AnimatedTabItem[] |
- |
true |
tab名称列表 |
needScale |
boolean |
false |
false |
是否支持按照屏幕尺寸缩放 |
onClickItem |
(index: number, selected: boolean, item: AnimatedTabItem) => void |
undefined |
false |
点击item回调,index为点击索引,selected为点击时item是否选中, item为传入item |
onClickMoreItem |
() => void |
undefined |
false |
点击更多回调,只有横向放不下且此props不为undefined时才显示 |
selectedIndex |
number |
0 |
false |
外部传入选中的索引,半受控形式 |
customStyle
说明
wrapperStyle
仅可以修改以下样式:flex | width | backgroundColor | padding | marginitemStyle
属性名 | 类型 | 默认值 | 是否必须 | 说明 |
---|---|---|---|---|
color |
string |
gray1 |
false |
选中情况字色 |
unselectedColor |
string |
gary2 |
false |
未选中情况字色 |
widgetColors |
string[] |
['#99F8FF', '#00EEFF'] |
false |
滑块渐变色,仅支持两个色值 |
spacing |
number |
undefined |
false |
item之间的间距,默认30,等分下无效 |
AnimatedTabItem
说明
属性名 | 类型 | 默认值 | 是否必须 | 说明 |
---|---|---|---|---|
text |
string |
- |
true |
tab标题,必传 |
[key: string] |
any |
- |
false |
自定义字段 |
equantLayout
说明
'equalWidth' // 宽度相等
'equalSpacing' // 间距相等