Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
react-native-tab-view-dgjoy
Advanced tools
A cross-platform Tab View component for React Native.
This is a JavaScript-only implementation of swipeable tab views. It's super customizable, allowing you to do things like coverflow.
yarn add react-native-tab-view-dgjoy
import React, { PureComponent } from 'react';
import { View, StyleSheet } from 'react-native';
import { TabViewAnimated, TabBar, SceneMap } from 'react-native-tab-view-dgjoy';
const FirstRoute = () => <View style={[ styles.container, { backgroundColor: '#ff4081' } ]} />;
const SecondRoute = () => <View style={[ styles.container, { backgroundColor: '#673ab7' } ]} />;
export default class TabViewExample extends PureComponent {
state = {
index: 0,
routes: [
{ key: '1', title: 'First' },
{ key: '2', title: 'Second' },
],
};
_handleIndexChange = index => this.setState({ index });
_renderHeader = props => <TabBar {...props} />;
_renderScene = SceneMap({
'1': FirstRoute,
'2': SecondRoute,
});
render() {
return (
<TabViewAnimated
style={styles.container}
navigationState={this.state}
renderScene={this._renderScene}
renderHeader={this._renderHeader}
onIndexChange={this._handleIndexChange}
/>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
});
The package exposes the following components,
<TabViewAnimated />
Container component responsible for managing tab transitions.
navigationState
- the current navigation stateonIndexChange
- callback for when the current tab index changes, should do the setState
onPositionChange
- callback called with position value as it changes (e.g. - on swipe or tab change), avoid doing anything expensive herecanJumpToTab
- optional callback which accepts a route, and returns a boolean indicating whether jumping to the tab is allowedlazy
- whether to load tabs lazily when you start switchinginitialLayout
- optional object containing the initial height
and width
, can be passed to prevent the one frame delay in renderingrenderPager
- optional callback which returns a react element to handle swipe gesture and animationrenderHeader
- optional callback which returns a react element to use as top tab barrenderFooter
- optional callback which returns a react element to use as bottom tab barrenderScene
- callback which returns a react element to use as a sceneAny other props are passed to the underlying pager.
<TabViewPagerPan />
Pager component based on PanResponder
.
configureTransition
- optional callback which returns a configuration for the transitionanimationEnabled
- whether to enable page change animationswipeEnabled
- whether to enable swipe gesturesswipeDistanceThreshold
- minimum swipe distance to trigger page switchswipeVelocityThreshold
- minimum swipe velocity to trigger page switchonSwipeStart
- optional callback when a swipe gesture startsonSwipeEnd
- optional callback when a swipe gesture endschildren
- React Element(s) to render<TabViewPagerScroll />
Pager component based on ScrollView
(default on iOS).
animationEnabled
- whether to enable page change animationswipeEnabled
- whether to enable swipe gestureschildren
- React Element(s) to render<TabViewPagerAndroid />
Pager component based on ViewPagerAndroid
(default on Android).
animationEnabled
- whether to enable page change animationswipeEnabled
- whether to enable swipe gestureschildren
- React Element(s) to render<TabBar />
Material design themed tab bar. Can be used as both top and bottom tab bar.
getLabelText
- optional callback which receives the current scene and returns the tab labelrenderIcon
- optional callback which receives the current scene and returns a React Element to be used as a iconrenderLabel
- optional callback which receives the current scene and returns a React Element to be used as a labelrenderIndicator
- optional callback which receives the current scene and returns a React Element to be used as a tab indicatorrenderBadge
- optional callback which receives the current scene and returns a React Element to be used as a badgeonTabPress
- optional callback invoked on tab press which receives the scene for the pressed tab, useful for things like scroll to toppressColor
- color for material ripple (Android >= 5.0 only)pressOpacity
- opacity for pressed tab (iOS and Android < 5.0 only)scrollEnabled
- whether to enable scrollable tabstabStyle
- style object for the individual tabs in the tab barindicatorStyle
- style object for the active indicatorlabelStyle
- style object for the tab item labelstyle
- style object for the tab barCheck the type definitions for details on shape of different objects.
<TabViewAnimated />
is a PureComponent
to prevent unnecessary re-rendering. As a side-effect, the tabs won't re-render if something changes in the parent's state/props. If you need it to trigger a re-render, put it in the navigationState
.
For example, consider you have a loaded
property on state which should trigger re-render. You can have your state like the following:
state = {
index: 0,
routes: [
{ key: '1', title: 'First' },
{ key: '2', title: 'Second' },
],
loaded: false,
}
Then pass this.state
as the navigationState
prop to <TabViewAnimated />
or <TabViewTransitioner />
.
<TabViewAnimated
navigationState={this.state}
renderScene={this._renderPage}
renderHeader={this._renderHeader}
onIndexChange={this._handleIndexChange}
/>
The renderScene
function is called every time the index changes. If your renderScene
function is expensive, it's good idea move each route to a separate component if they don't depend on the index, and apply shouldComponentUpdate
to prevent unnecessary re-renders.
For example, instead of:
renderScene = ({ route }) => {
switch (route.key) {
case 'home':
return (
<View style={styles.page}>
<Avatar />
<NewsFeed />
</View>
);
default:
return null;
}
}
Do the following:
renderScene = ({ route }) => {
switch (route.key) {
case 'home':
return <HomeComponent />;
default:
return null;
}
}
Where <HomeComponent />
is a PureComponent
.
If you are using the SceneMap
helper, the scenes are already optimized with PureComponent
and won't re-render if parent's state changes.
We need to measure the width of the container and hence need to wait before rendering some elements on the screen. If you know the initial width upfront, you can pass it in and we won't need to wait for measuring it. Most of the time, it's just the window width.
For example, pass the following initialLayout
to TabViewAnimated
:
const initialLayout = {
height: 0,
width: Dimensions.get('window').width,
};
The tabview will still react to changes in the dimension and adjust accordingly to accommodate things like orientation change.
If you've a large number of routes, especially images, it can slow the animation down a lot. You can instead render a limited number of routes.
For example, do the following to render only 2 routes on each side:
renderScene = ({ route }) => {
if (Math.abs(this.state.index - this.state.routes.indexOf(route)) > 2) {
return null;
}
return <MySceneComponent route={route} />;
};
While developing, you can run the example app to test your changes.
Make sure the tests still pass, and your code passes Flow and ESLint. Run the following to verify:
yarn test
yarn run flow
yarn run lint
To fix formatting errors, run the following:
yarn run lint -- --fix
Remember to add tests for your change if possible.
FAQs
Tab view component for React Native
The npm package react-native-tab-view-dgjoy receives a total of 0 weekly downloads. As such, react-native-tab-view-dgjoy popularity was classified as not popular.
We found that react-native-tab-view-dgjoy demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.