react-native-head-tab-view
Advanced tools
Comparing version 1.0.0 to 1.0.1
@@ -13,8 +13,8 @@ import React, { Component } from 'react'; | ||
static propTypes = { | ||
preventDoubleClick: PropTypes.bool, | ||
onPress:PropTypes.func | ||
preventDoubleClick: PropTypes.bool, | ||
onPress: PropTypes.func | ||
} | ||
static defaultProps = { | ||
preventDoubleClick: true, | ||
onPress:()=>{} | ||
onPress: () => { } | ||
} | ||
@@ -42,3 +42,3 @@ constructor(props) { | ||
const { onPress } = this.props; | ||
if (!this.props.preventDoubleClick) { //如果不需要防止重复点击 | ||
if (!this.props.preventDoubleClick) { | ||
onPress() | ||
@@ -50,8 +50,8 @@ return | ||
const diff = currentTime.getTime() - this.lastTime.getTime(); | ||
this.lastTime = currentTime; | ||
if (diff < 800) { | ||
return; | ||
} | ||
}else{ | ||
this.lastTime = currentTime; | ||
} else { | ||
this.lastTime = currentTime; | ||
} | ||
@@ -74,6 +74,6 @@ if (onPress && typeof onPress == 'function') { | ||
} | ||
else{ | ||
else { | ||
this.lastTime2 = currentTime1; | ||
} | ||
const { onPressOut } = this.props; | ||
@@ -86,6 +86,2 @@ if (onPressOut && typeof onPressOut == 'function') { | ||
componentWillUnmount() { | ||
this.timer && clearTimeout(this.timer); | ||
} | ||
render() { | ||
@@ -116,3 +112,2 @@ const { children, style = {}, pressInColor, pressInOpacity, disabledOpacity, disableColor, onPress, ...restProps } = this.props; | ||
<View | ||
ref={(o) => { this.viewCls = o }} | ||
style={[{ opacity, overflow: 'hidden', backfaceVisibility: 'hidden' }, { backgroundColor }, style]} | ||
@@ -119,0 +114,0 @@ > |
@@ -1,9 +0,5 @@ | ||
/** | ||
* 容器组件 内部的ScrollView的高阶组件 | ||
*/ | ||
import React from 'react'; | ||
import { | ||
Animated, | ||
Platform, | ||
Dimensions | ||
} from 'react-native'; | ||
@@ -13,5 +9,2 @@ import PropTypes from 'prop-types'; | ||
const faultHeight = 100 | ||
const G_WIN_HEIGHT = Dimensions.get('window').height; | ||
export default HPageViewHoc = (WrappedComponent) => { | ||
@@ -40,13 +33,11 @@ | ||
this.state = { | ||
placeHeight: 0, | ||
isResponder: false, | ||
hideContent: true | ||
placeHeight: 0, //占位高 | ||
hideContent: true //是否显示内容 | ||
} | ||
//是否didMount | ||
this.didMount = false | ||
} | ||
getOnScroll() { | ||
const { containerTrans, isActive, index } = this.props | ||
const { containerTrans, isActive } = this.props | ||
@@ -66,43 +57,34 @@ if (isActive) { | ||
tabDidClick = () => { | ||
// console.log('tabDidClick'); | ||
// console.log(this.props.index); | ||
this.stopScroll = true | ||
// if (this.props.isActive) { | ||
// this.scrollTo({ y: this.scrollTop }) | ||
// } | ||
} | ||
becomeResponder = (index) => { | ||
// console.log('becomeResponder'); | ||
// console.log(index); | ||
// console.log(this.props.index); | ||
this.stopScroll = false | ||
const isResponder = index == this.props.index | ||
// if (this.state.isResponder != isResponder) { | ||
// this.setState({ isResponder }) | ||
// } | ||
} | ||
componentDidMount() { | ||
this.didMount = true; | ||
this.addListener() | ||
} | ||
const { addListener, containerTrans, makeHeaderHeight } = this.props | ||
componentWillUnmount() { | ||
this.removeListener() | ||
} | ||
addListener() { | ||
const { addListener, containerTrans } = this.props | ||
addListener(this, TABVIEW_TABDIDCLICK, this.tabDidClick) | ||
addListener(this, TABVIEW_BECOME_RESPONDER, this.becomeResponder) | ||
this.didMount = true; | ||
this.props.containerTrans && this.props.containerTrans.addListener(this.updateView); | ||
containerTrans && containerTrans.addListener(this.updateView); | ||
} | ||
componentWillUnmount() { | ||
const { removeListener } = this.props | ||
removeListener() { | ||
const { removeListener, containerTrans } = this.props | ||
removeListener(this, TABVIEW_TABDIDCLICK, this.tabDidClick) | ||
removeListener(this, TABVIEW_BECOME_RESPONDER, this.becomeResponder) | ||
this.props.containerTrans && this.props.containerTrans.removeListener(this.updateView); | ||
containerTrans && containerTrans.removeListener(this.updateView); | ||
} | ||
onScrollBeginDrag() { | ||
const { pageDidDrag, index } = this.props; | ||
pageDidDrag(index) | ||
const { scenePageDidDrag, index } = this.props; | ||
scenePageDidDrag(index) | ||
} | ||
@@ -127,3 +109,2 @@ | ||
this.scrollTo({ y: e.value }) | ||
@@ -136,10 +117,10 @@ } | ||
if (this._scrollView && this._scrollView.getNode && this._scrollView.getNode()) { | ||
const element = this._scrollView.getNode() | ||
const elementNode = this._scrollView.getNode() | ||
if (this.canScroll('scrollTo')) { | ||
element.scrollTo({ x: 0, y: e.y, animated: false }); | ||
elementNode.scrollTo({ x: 0, y: e.y, animated: false }); | ||
} else if (this.canScroll('scrollToOffset')) { | ||
element.scrollToOffset({ offset: e.y, animated: false }); | ||
elementNode.scrollToOffset({ offset: e.y, animated: false }); | ||
} else if (this.canScroll('scrollToLocation')) { | ||
element.scrollToLocation({ itemIndex: 0, sectionIndex: 0, viewOffset: -e.y, animated: false }); | ||
elementNode.scrollToLocation({ itemIndex: 0, sectionIndex: 0, viewOffset: -e.y, animated: false }); | ||
} | ||
@@ -153,2 +134,17 @@ } | ||
tryScroll() { | ||
if (this.didMount) { | ||
this.didMount = false; | ||
const { containerTrans, makeHeaderHeight } = this.props | ||
const scrollValue = containerTrans._value > makeHeaderHeight() ? makeHeaderHeight() : containerTrans._value | ||
this.scrollTo({ y: scrollValue }) | ||
setTimeout(() => { | ||
this.setState({ hideContent: false }) | ||
}, 0) | ||
} | ||
} | ||
/** | ||
@@ -158,45 +154,22 @@ * 根据contentSize决定占位视图高度 | ||
_onContentSizeChange(contentWidth, contentHeight) { | ||
const { placeHeight } = this.state; | ||
const { makeHeaderHeight } = this.props; | ||
const headerHeight = makeHeaderHeight() | ||
const { expectHeight, faultHeight } = this.props; | ||
const containerHeight = expectHeight + faultHeight; | ||
// const fullHeight = headerHeight + G_WIN_HEIGHT - G_NAVBAR_HEIGHT - G_STATUS_HEIGHT | ||
const fullHeight = headerHeight + G_WIN_HEIGHT - 0 - 20 | ||
// console.log('_onContentSizeChange====' + contentHeight + '----fullHeight=' + fullHeight + '----placeHeight=' + placeHeight); | ||
// console.log('_onContentSizeChange----=='); | ||
if (contentHeight < containerHeight) {//添加占位高度 placeHeight | ||
const newPlaceHeight = placeHeight + containerHeight - contentHeight; | ||
this.setState({ placeHeight: newPlaceHeight }) | ||
} else { | ||
this.tryScroll(); | ||
if ((contentHeight - placeHeight) > fullHeight) { | ||
if (placeHeight > 0) {//有占位高,考虑减少占位高 | ||
if (this.didMount) { | ||
// console.log('1231231231231233333'); | ||
const { containerTrans } = this.props | ||
const scrollValue = containerTrans._value > makeHeaderHeight() ? makeHeaderHeight() : containerTrans._value | ||
this.scrollTo({ y: scrollValue }) | ||
this.didMount = false; | ||
setTimeout(() =>{ | ||
this.setState({hideContent:false}) | ||
},0) | ||
const moreHeight = contentHeight - containerHeight | ||
const newPlaceHeight = moreHeight > placeHeight ? 0 : placeHeight - moreHeight | ||
if (newPlaceHeight != placeHeight) { | ||
this.setState({ placeHeight: newPlaceHeight }) | ||
} | ||
} | ||
if (placeHeight == 0) return; | ||
this.setState({ placeHeight: 0 }) | ||
} else { | ||
if (contentHeight - fullHeight >= faultHeight) { //超过容错高度,减少占位高 | ||
const height = fullHeight - contentHeight | ||
} | ||
this.setState({ placeHeight: placeHeight + height }) | ||
} else if (contentHeight - fullHeight > 0) { //高度在容错范围内,不做处理 (目的就是改变占位高度,维持在容错范围内) | ||
console.log('容错'); | ||
this.setState({hideContent:false}) | ||
return; | ||
} else {//占位不够,增加占位高 | ||
const height = fullHeight - contentHeight | ||
this.setState({ placeHeight: placeHeight + height }) | ||
} | ||
} | ||
} | ||
@@ -211,10 +184,9 @@ | ||
this._scrollView = _ref | ||
if (forwardedRef && forwardedRef.constructor) { | ||
if (typeof forwardedRef === 'function') { | ||
forwardedRef(_ref) | ||
} else if (typeof forwardedRef === 'object') { | ||
forwardedRef.current = _ref | ||
} | ||
} | ||
}} | ||
@@ -224,3 +196,2 @@ style={{ opacity: this.state.hideContent ? 0 : 1 }} | ||
directionalLockEnabled | ||
showsVerticalScrollIndicator={false} | ||
automaticallyAdjustContentInsets={false} | ||
@@ -230,12 +201,10 @@ onScrollBeginDrag={this.onScrollBeginDrag} | ||
overScrollMode={'never'} | ||
disableScrollViewPanResponder={true} | ||
removeClippedSubviews={Platform.OS === 'ios'} | ||
contentContainerStyle={{ paddingTop: headerHeight, paddingBottom: placeHeight }} | ||
contentStyle={{ paddingTop: headerHeight, paddingBottom: placeHeight }} | ||
onContentSizeChange={this._onContentSizeChange} | ||
{...rest} > | ||
{...rest} | ||
showsVerticalScrollIndicator={false} | ||
> | ||
{children} | ||
</AnimatePageView> | ||
} | ||
@@ -242,0 +211,0 @@ }; |
@@ -10,3 +10,3 @@ | ||
/** | ||
* 数据源,每个标签页的标题 | ||
* 数据源,每个标签页的标题(可配合tabNameConvert使用) | ||
*/ | ||
@@ -21,2 +21,4 @@ tabs: string[]; | ||
* tab标签的名称转换方法 | ||
* 例: | ||
* tabNameConvert={(tabname)=>return tabname+'_aguai'} | ||
*/ | ||
@@ -39,5 +41,39 @@ tabNameConvert?: (tabname: string) => string; | ||
export interface TabViewItemInfo<TabItemT> { | ||
/** | ||
* 标签的名字(`tabs`数组的其中一个元素) | ||
*/ | ||
item: string; | ||
/** | ||
* 标签页的序号 ,从0开始排序 | ||
*/ | ||
index: number; | ||
isActive: boolean; | ||
//当使用了renderScrollHeader时会有以下参数 | ||
/** | ||
* 是否是当前活跃标签页 | ||
*/ | ||
isActive?: boolean; | ||
/** | ||
* 统管全局纵向动画对象 | ||
*/ | ||
containerTrans?: Animated.Value; | ||
/** | ||
* 获取renderScrollHeader的高度方法 | ||
*/ | ||
makeHeaderHeight?: () => number; | ||
/** | ||
* 标签页添加整个组件的事件监听方法,instance:this , eventName:事件名,callback:事件回调 | ||
*/ | ||
addListener?: (instance: any, eventName: string, callback: function) => void; | ||
/** | ||
* 标签页移除整个组件的事件监听方法 | ||
*/ | ||
removeListener?: (instance: any, eventName: string, callback: function) => void; | ||
/** | ||
* 标签页页面被拖拽时回调方法 | ||
*/ | ||
scenePageDidDrag?: (index: number) => void; | ||
/** | ||
* 整个组件上下滑动时,期望标签页所拥有的内容高度(用于`HPageViewHoc`中计算补位视图高度) | ||
*/ | ||
expectHeight?: number; | ||
} | ||
@@ -149,3 +185,5 @@ | ||
locked?: boolean; | ||
/** | ||
* tabbar的样式 | ||
*/ | ||
tabbarStyle?: StyleProp<ViewStyle>; | ||
@@ -156,2 +194,7 @@ /** | ||
extraData?: any; | ||
/** | ||
* 大部分情况用不上这个值(默认:0) | ||
* 这个值是在标签页内容不够,计算补位视图时的容错高度,后面考虑删掉该字段 | ||
*/ | ||
faultHeight?: number; | ||
} | ||
@@ -158,0 +201,0 @@ |
{ | ||
"name": "react-native-head-tab-view", | ||
"version": "1.0.0", | ||
"version": "1.0.1", | ||
"main": "index.js", | ||
@@ -8,3 +8,3 @@ "scripts": { | ||
}, | ||
"author": "rain", | ||
"author": "yu zou <zouyu123007@163.com>", | ||
"license": "ISC", | ||
@@ -25,3 +25,6 @@ "keywords": [ | ||
], | ||
"dependencies": { | ||
"@react-native-community/viewpager": "^3.3.0" | ||
}, | ||
"description": "Tab view component for React Native" | ||
} |
@@ -8,3 +8,2 @@ import React from 'react'; | ||
Animated, | ||
Image, | ||
Text, | ||
@@ -16,3 +15,2 @@ Dimensions | ||
import { TabProps } from './TabViewProps' | ||
import Button from './Button'; | ||
@@ -69,3 +67,2 @@ | ||
this.tabOnLayout = this.tabOnLayout.bind(this) | ||
this.onPressPackup = this.onPressPackup.bind(this) | ||
this.state = { | ||
@@ -76,3 +73,3 @@ leftUnderline: new Animated.Value(0), | ||
this.tabFrames = [] | ||
this.scrollX = 0 //TODO 如果出事tabindex值不少0 | ||
this.scrollX = 0 | ||
@@ -137,6 +134,3 @@ } | ||
const pageNum = this.props.tabs.length; | ||
const value = offset.value | ||
@@ -304,9 +298,2 @@ | ||
/** | ||
* 点击收起按钮 | ||
*/ | ||
onPressPackup() { | ||
this.pullDidClick(false) | ||
} | ||
/** | ||
* 获取一个tabItem的宽度 | ||
@@ -332,4 +319,2 @@ */ | ||
this.tabbarFrame = event.nativeEvent.layout | ||
console.log('tabOnLayout---'); | ||
console.log(this.tabbarFrame); | ||
if (this.state.tabbarWidth != this.tabbarFrame.width) { | ||
@@ -347,3 +332,2 @@ this.setState({ tabbarWidth: this.tabbarFrame.width }) | ||
this.tabFrames[page] = { left: x, right: x + width, width, height, }; | ||
console.log('measureTab===='); | ||
@@ -375,3 +359,2 @@ this.updateView({ value: this.props.scrollValue ? this.props.scrollValue._value ? this.props.scrollValue._value : 0 : 0, }); | ||
height: TABBAR_HEIGHT, | ||
zIndex: 100, | ||
}, | ||
@@ -378,0 +361,0 @@ leftRightView: { |
224
TabView.js
import React from 'react'; | ||
import PropTypes from 'prop-types'; | ||
import { | ||
@@ -8,7 +7,4 @@ View, | ||
Platform, | ||
TouchableWithoutFeedback, | ||
Dimensions | ||
} from 'react-native'; | ||
import { TabViewProps, TabProps, TABVIEW_TABDIDCLICK, TABVIEW_BECOME_RESPONDER } from './TabViewProps' | ||
const Scene = require('./Scene'); | ||
import Tabbar from './Tabbar' | ||
@@ -21,3 +17,2 @@ | ||
undefined; | ||
let self = null; | ||
@@ -33,2 +28,3 @@ export default class TabView extends React.PureComponent { | ||
preInitSceneNum: 0, | ||
faultHeight: 0, | ||
} | ||
@@ -41,6 +37,6 @@ | ||
this.onScroll = this.onScroll.bind(this) | ||
this.decisionShowScene = this.decisionShowScene.bind(this) | ||
this.sceneWillShow = this.sceneWillShow.bind(this) | ||
this.addListener = this.addListener.bind(this) | ||
this.removeListener = this.removeListener.bind(this) | ||
this.pageDidDrag = this.pageDidDrag.bind(this) | ||
this.scenePageDidDrag = this.scenePageDidDrag.bind(this) | ||
@@ -52,2 +48,4 @@ this.positionAndroid = new Animated.Value(props.initialPage) | ||
sceneWidth: 0, | ||
tabviewHeight: 0, | ||
tabbarHeight: 0, | ||
currentIndex: props.initialPage, | ||
@@ -57,3 +55,2 @@ displayKeys: this.getDisplayScene(props.tabs, props.initialPage), //所有页面是否需要显示和更新 | ||
tabs: props.tabs, //所有tab | ||
containerY: 0, | ||
containerTrans: new Animated.Value(0) //整体上下滑动的动画对象 | ||
@@ -65,23 +62,9 @@ } | ||
this.observers = {} //观察者 | ||
this.handleScrollValue() | ||
this.makeScrollTrans() | ||
self = this | ||
} | ||
//render之前 | ||
// static getDerivedStateFromProps(props, state) { | ||
// if (props.tabs.toString() !== state.tabs.toString()) { | ||
// const newKeys = self.getDisplayScene(props.tabs) | ||
// return { displayKeys: newKeys, tabs: props.tabs } | ||
// } | ||
// return null | ||
// } | ||
componentDidMount() { | ||
if (this.state.tabs && this.state.tabs.length) { | ||
this.pageDidShow() | ||
if (this.props.renderScrollHeader && !this.props.makeHeaderHeight) { | ||
console.warn('必须实现 makeHeaderHeight方法') | ||
} | ||
@@ -92,6 +75,5 @@ } | ||
if (prevState.tabs.toString() !== this.props.tabs.toString()) { | ||
const newKeys = this.getDisplayScene(this.props.tabs,this.state.currentIndex) | ||
this.setState({displayKeys: newKeys,tabs: this.props.tabs}) | ||
const newKeys = this.getDisplayScene(this.props.tabs, this.state.currentIndex) | ||
this.setState({ displayKeys: newKeys, tabs: this.props.tabs }) | ||
} | ||
this.pageBeginShow(prevState) | ||
} | ||
@@ -109,5 +91,3 @@ | ||
} else { | ||
this.positionAndroid.addListener(({ value }) => { | ||
// this.state.scrollValue && this.state.scrollValue.setValue(value + this.offsetAndroid._value) | ||
}) | ||
this.positionAndroid.addListener(({ value }) => { }) | ||
this.offsetAndroid.addListener(({ value }) => { | ||
@@ -122,2 +102,3 @@ this.state.scrollValue && this.state.scrollValue.setValue(value + this.positionAndroid._value) | ||
<View style={{ flex: 1 }} onLayout={this.containerOnLayout}> | ||
{this._renderScrollHead()} | ||
{this._renderTabBar()} | ||
@@ -127,7 +108,6 @@ {this._renderHeader()} | ||
{this._renderFooter()} | ||
{this._renderScrollHead()} | ||
</View> | ||
) | ||
} | ||
//渲染头部 | ||
_renderHeader() { | ||
@@ -150,3 +130,3 @@ const { renderHeader, makeHeaderHeight } = this.props | ||
} | ||
//渲染尾部 | ||
_renderFooter() { | ||
@@ -158,2 +138,3 @@ const { renderFooter } = this.props | ||
//渲染可滑动头部 | ||
_renderScrollHead() { | ||
@@ -191,11 +172,13 @@ const { renderScrollHeader, makeHeaderHeight } = this.props | ||
const tabbarProps = this.makeTabParams() | ||
if (renderTabBar) { | ||
return renderTabBar(tabbarProps) || null | ||
} else { | ||
console.log('_renderTabBar==='); | ||
console.log(tabs); | ||
const { style, ...rest } = tabbarProps; | ||
const { transform, ...restStyle } = style; | ||
const newProps = { ...rest, ...{ style: restStyle } } | ||
const tabbarContent = renderTabBar ? (renderTabBar(newProps) || null) : <Tabbar {...newProps} /> | ||
return ( | ||
<Animated.View onLayout={this.tabbarOnLayout} style={[tabbarProps.style, { zIndex: 10 }]}> | ||
{tabbarContent} | ||
</Animated.View> | ||
) | ||
} | ||
return <Tabbar {...tabbarProps} /> | ||
} | ||
} | ||
/** | ||
@@ -205,4 +188,2 @@ * 渲染内容 | ||
_renderContent() { | ||
// console.log('_renderContent====_renderContent==='); | ||
if (Platform.OS === 'ios') { | ||
@@ -236,3 +217,3 @@ | ||
initialPage={this.props.initialPage} | ||
onPageSelected={this.decisionShowScene} | ||
onPageSelected={this.sceneWillShow} | ||
keyboardDismissMode="on-drag" | ||
@@ -257,18 +238,9 @@ scrollEnabled={!this.props.locked} | ||
} | ||
/** | ||
* 渲染阴影view | ||
* 获取标签子页面 | ||
*/ | ||
renderShadowView() { | ||
return ( | ||
<TouchableWithoutFeedback onPress={this.onPressShadowView.bind(this)}> | ||
<View style={{ backgroundColor: 'rgba(0,0,0,0.3)', position: 'absolute', top: 0, left: 0, right: 0, bottom: 0 }} /> | ||
</TouchableWithoutFeedback> | ||
) | ||
} | ||
/** | ||
* 获取页面组件 | ||
*/ | ||
getScene() { | ||
const { renderScene, makeHeaderHeight, renderScrollHeader } = this.props; | ||
const { sceneWidth, displayKeys, currentIndex, tabs, containerTrans } = this.state; | ||
const { renderScene, renderScrollHeader } = this.props; | ||
const { sceneWidth, displayKeys, currentIndex, tabs } = this.state; | ||
@@ -278,8 +250,7 @@ return tabs.map((item, index) => { | ||
const display = this.sceneKeyIsDisplay(displayKeys, key) | ||
console.log('display:' + display + '---key:' + key); | ||
//如果有scrollHeader,标签页必须保持update状态 | ||
const showUpdate = renderScrollHeader ? true : this.sceneShouldPreInit(currentIndex, index) | ||
const isActive = currentIndex == index | ||
return <Scene key={this.makeSceneKey(item, index)} style={{ width: sceneWidth }} shouldUpdate={showUpdate}> | ||
{(display && renderScene) ? renderScene({ item, index, isActive, containerTrans, makeHeaderHeight, addListener: this.addListener, removeListener: this.removeListener, pageDidDrag: this.pageDidDrag }) : <View />} | ||
{(display && renderScene) ? renderScene(this.makeSceneParams(item, index)) : <View />} | ||
</Scene> | ||
@@ -296,3 +267,2 @@ | ||
const offset = this.state.sceneWidth * index; | ||
this.scrollView && this.scrollView.getNode() && this.scrollView.getNode().scrollTo({ x: offset, y: 0, animated: true }) | ||
@@ -302,4 +272,3 @@ } else { | ||
} | ||
const curIndex = this.state.currentIndex | ||
this.decisionShowScene(index, this.onChangeTab.bind(this, curIndex, index)) | ||
this.sceneWillShow(index) | ||
} | ||
@@ -320,8 +289,8 @@ /** | ||
pageHasChange(page) { | ||
this.decisionShowScene(page) | ||
this.sceneWillShow(page) | ||
} | ||
/** | ||
* 决定显示的页面 | ||
* 页面将要显示 | ||
*/ | ||
decisionShowScene(page) { | ||
sceneWillShow(page) { | ||
@@ -336,8 +305,3 @@ let zPage = page; | ||
} | ||
/** | ||
* 阴影视图被点击 | ||
*/ | ||
onPressShadowView() { | ||
} | ||
/** | ||
@@ -347,38 +311,8 @@ * tabbar切换 | ||
onChangeTab(currentIndex, page) { | ||
if (currentIndex === page) return; | ||
if (this.props.onChangeTab) { | ||
this.props.onChangeTab({ from: currentIndex, curIndex: page }) | ||
if (currentIndex != page) { | ||
this.pageDidShow(); | ||
} | ||
} | ||
} | ||
/** | ||
* @description: tabs变化后,判断页面是否show | ||
* @param {page} 上一次的状态 | ||
* @return: 页面是否show | ||
*/ | ||
pageBeginShow(prevState) { | ||
if (prevState.tabs != this.state.tabs) { | ||
const { currentIndex } = this.state | ||
const { prevIndex } = prevState | ||
if (!prevState.tabs.length) this.pageDidShow() | ||
if (prevIndex < prevState.tabs.length | ||
&& currentIndex < this.state.tabs.length | ||
&& prevState.tabs[prevIndex] != this.state.tabs[currentIndex]) { | ||
this.pageDidShow() | ||
} | ||
} | ||
} | ||
/** | ||
* 当前展示那个页面 | ||
*/ | ||
pageDidShow() { | ||
if (this.props.pageDidShow) { | ||
const { tabs, currentIndex } = this.state; | ||
this.props.pageDidShow(tabs[currentIndex], currentIndex) | ||
} | ||
} | ||
onScroll(e) { | ||
@@ -437,3 +371,2 @@ if (Platform.OS === 'ios') { | ||
const { preInitSceneNum } = this.props | ||
return ((sceneIndex >= page - preInitSceneNum) || (page - preInitSceneNum <= 0)) && sceneIndex <= page + preInitSceneNum | ||
@@ -450,13 +383,2 @@ } | ||
/** | ||
* 回调时的参数装配 | ||
*/ | ||
makeParams() { | ||
const { tabs, currentIndex } = this.state; | ||
if (tabs && tabs.length > currentIndex) { | ||
return { item: tabs[currentIndex], index: currentIndex } | ||
} | ||
return { item: '', index: 0 } | ||
} | ||
makeSceneKey(name, index) { | ||
@@ -466,2 +388,5 @@ return name + '_' + index | ||
tabbarOnLayout = (event) => { | ||
this.setState({ tabbarHeight: event.nativeEvent.layout.height }) | ||
} | ||
/** | ||
@@ -471,3 +396,3 @@ * 整体的layout方法 | ||
containerOnLayout = (event) => { | ||
this.setState({ containerY: event.nativeEvent.layout.y, sceneWidth: event.nativeEvent.layout.width }) | ||
this.setState({ sceneWidth: event.nativeEvent.layout.width, tabviewHeight: event.nativeEvent.layout.height }) | ||
} | ||
@@ -481,12 +406,10 @@ | ||
} | ||
addListenerTab(target, eventName, callback) { | ||
if (this.observers.find((el) => { el == target })) return; | ||
this.observers.push(target); | ||
/** | ||
* 标签页被拉拽 | ||
* @param {number} index 标签页的序号 | ||
*/ | ||
scenePageDidDrag(index) { | ||
this.emitListener(TABVIEW_BECOME_RESPONDER, index) | ||
} | ||
// removeListenerTab(target) { | ||
// this.observers.splice(this.observers.findIndex(e => e == target), 1) | ||
// } | ||
emitListener(eventName, params) { | ||
@@ -497,3 +420,2 @@ | ||
allObservers.forEach(observer => { | ||
@@ -512,6 +434,2 @@ const { instance, callback } = observer; | ||
pageDidDrag(index) { | ||
this.emitListener(TABVIEW_BECOME_RESPONDER, index) | ||
} | ||
removeListener(instance, eventName, callback) { | ||
@@ -539,4 +457,33 @@ if (this.observers.hasOwnProperty(eventName)) { | ||
} | ||
/** | ||
* renderHeader和renderFooter的参数装配 | ||
*/ | ||
makeParams() { | ||
const { tabs, currentIndex } = this.state; | ||
if (tabs && tabs.length > currentIndex) { | ||
return { item: tabs[currentIndex], index: currentIndex } | ||
} | ||
return { item: '', index: 0 } | ||
} | ||
/** | ||
* 组装子页面的参数 | ||
*/ | ||
makeSceneParams(item, index) { | ||
const { makeHeaderHeight, faultHeight, renderScrollHeader } = this.props; | ||
if (!renderScrollHeader) { | ||
return { item, index } | ||
} | ||
const { currentIndex, containerTrans, tabviewHeight, tabbarHeight } = this.state; | ||
const params = { item, index, isActive: currentIndex == index, containerTrans, makeHeaderHeight, faultHeight }; | ||
params.addListener = this.addListener; | ||
params.removeListener = this.removeListener; | ||
params.scenePageDidDrag = this.scenePageDidDrag; | ||
params.expectHeight = makeHeaderHeight() + tabviewHeight - tabbarHeight; | ||
return params; | ||
} | ||
/** | ||
* 组装给tabbar的参数 | ||
@@ -575,2 +522,23 @@ */ | ||
} | ||
} | ||
class SceneView extends React.Component { | ||
shouldComponentUpdate(nextProps) { | ||
return !!nextProps.shouldUpdate; | ||
} | ||
render() { | ||
return React.Children.only(this.props.children) | ||
} | ||
} | ||
const Scene = (props) => { | ||
return <View {...props}> | ||
<SceneView shouldUpdate={props.shouldUpdate}> | ||
{props.children} | ||
</SceneView> | ||
</View> | ||
} |
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
52221
0
183
1
1280
+ Added@ampproject/remapping@2.3.0(transitive)
+ Added@babel/code-frame@7.24.7(transitive)
+ Added@babel/compat-data@7.24.7(transitive)
+ Added@babel/core@7.24.7(transitive)
+ Added@babel/generator@7.24.7(transitive)
+ Added@babel/helper-annotate-as-pure@7.24.7(transitive)
+ Added@babel/helper-builder-binary-assignment-operator-visitor@7.24.7(transitive)
+ Added@babel/helper-compilation-targets@7.24.7(transitive)
+ Added@babel/helper-create-class-features-plugin@7.24.7(transitive)
+ Added@babel/helper-create-regexp-features-plugin@7.24.7(transitive)
+ Added@babel/helper-define-polyfill-provider@0.6.2(transitive)
+ Added@babel/helper-environment-visitor@7.24.7(transitive)
+ Added@babel/helper-function-name@7.24.7(transitive)
+ Added@babel/helper-hoist-variables@7.24.7(transitive)
+ Added@babel/helper-member-expression-to-functions@7.24.7(transitive)
+ Added@babel/helper-module-imports@7.24.7(transitive)
+ Added@babel/helper-module-transforms@7.24.7(transitive)
+ Added@babel/helper-optimise-call-expression@7.24.7(transitive)
+ Added@babel/helper-plugin-utils@7.24.7(transitive)
+ Added@babel/helper-remap-async-to-generator@7.24.7(transitive)
+ Added@babel/helper-replace-supers@7.24.7(transitive)
+ Added@babel/helper-simple-access@7.24.7(transitive)
+ Added@babel/helper-skip-transparent-expression-wrappers@7.24.7(transitive)
+ Added@babel/helper-split-export-declaration@7.24.7(transitive)
+ Added@babel/helper-string-parser@7.24.7(transitive)
+ Added@babel/helper-validator-identifier@7.24.7(transitive)
+ Added@babel/helper-validator-option@7.24.7(transitive)
+ Added@babel/helper-wrap-function@7.24.7(transitive)
+ Added@babel/helpers@7.24.7(transitive)
+ Added@babel/highlight@7.24.7(transitive)
+ Added@babel/parser@7.24.7(transitive)
+ Added@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.24.7(transitive)
+ Added@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.7(transitive)
+ Added@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(transitive)
+ Added@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.7(transitive)
+ Added@babel/plugin-proposal-async-generator-functions@7.20.7(transitive)
+ Added@babel/plugin-proposal-class-properties@7.18.6(transitive)
+ Added@babel/plugin-proposal-export-default-from@7.24.7(transitive)
+ Added@babel/plugin-proposal-logical-assignment-operators@7.20.7(transitive)
+ Added@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(transitive)
+ Added@babel/plugin-proposal-numeric-separator@7.18.6(transitive)
+ Added@babel/plugin-proposal-object-rest-spread@7.20.7(transitive)
+ Added@babel/plugin-proposal-optional-catch-binding@7.18.6(transitive)
+ Added@babel/plugin-proposal-optional-chaining@7.21.0(transitive)
+ Added@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(transitive)
+ Added@babel/plugin-syntax-async-generators@7.8.4(transitive)
+ Added@babel/plugin-syntax-class-properties@7.12.13(transitive)
+ Added@babel/plugin-syntax-class-static-block@7.14.5(transitive)
+ Added@babel/plugin-syntax-dynamic-import@7.8.3(transitive)
+ Added@babel/plugin-syntax-export-default-from@7.24.7(transitive)
+ Added@babel/plugin-syntax-export-namespace-from@7.8.3(transitive)
+ Added@babel/plugin-syntax-flow@7.24.7(transitive)
+ Added@babel/plugin-syntax-import-assertions@7.24.7(transitive)
+ Added@babel/plugin-syntax-import-attributes@7.24.7(transitive)
+ Added@babel/plugin-syntax-import-meta@7.10.4(transitive)
+ Added@babel/plugin-syntax-json-strings@7.8.3(transitive)
+ Added@babel/plugin-syntax-jsx@7.24.7(transitive)
+ Added@babel/plugin-syntax-logical-assignment-operators@7.10.4(transitive)
+ Added@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(transitive)
+ Added@babel/plugin-syntax-numeric-separator@7.10.4(transitive)
+ Added@babel/plugin-syntax-object-rest-spread@7.8.3(transitive)
+ Added@babel/plugin-syntax-optional-catch-binding@7.8.3(transitive)
+ Added@babel/plugin-syntax-optional-chaining@7.8.3(transitive)
+ Added@babel/plugin-syntax-private-property-in-object@7.14.5(transitive)
+ Added@babel/plugin-syntax-top-level-await@7.14.5(transitive)
+ Added@babel/plugin-syntax-typescript@7.24.7(transitive)
+ Added@babel/plugin-syntax-unicode-sets-regex@7.18.6(transitive)
+ Added@babel/plugin-transform-arrow-functions@7.24.7(transitive)
+ Added@babel/plugin-transform-async-generator-functions@7.24.7(transitive)
+ Added@babel/plugin-transform-async-to-generator@7.24.7(transitive)
+ Added@babel/plugin-transform-block-scoped-functions@7.24.7(transitive)
+ Added@babel/plugin-transform-block-scoping@7.24.7(transitive)
+ Added@babel/plugin-transform-class-properties@7.24.7(transitive)
+ Added@babel/plugin-transform-class-static-block@7.24.7(transitive)
+ Added@babel/plugin-transform-classes@7.24.7(transitive)
+ Added@babel/plugin-transform-computed-properties@7.24.7(transitive)
+ Added@babel/plugin-transform-destructuring@7.24.7(transitive)
+ Added@babel/plugin-transform-dotall-regex@7.24.7(transitive)
+ Added@babel/plugin-transform-duplicate-keys@7.24.7(transitive)
+ Added@babel/plugin-transform-dynamic-import@7.24.7(transitive)
+ Added@babel/plugin-transform-exponentiation-operator@7.24.7(transitive)
+ Added@babel/plugin-transform-export-namespace-from@7.24.7(transitive)
+ Added@babel/plugin-transform-flow-strip-types@7.24.7(transitive)
+ Added@babel/plugin-transform-for-of@7.24.7(transitive)
+ Added@babel/plugin-transform-function-name@7.24.7(transitive)
+ Added@babel/plugin-transform-json-strings@7.24.7(transitive)
+ Added@babel/plugin-transform-literals@7.24.7(transitive)
+ Added@babel/plugin-transform-logical-assignment-operators@7.24.7(transitive)
+ Added@babel/plugin-transform-member-expression-literals@7.24.7(transitive)
+ Added@babel/plugin-transform-modules-amd@7.24.7(transitive)
+ Added@babel/plugin-transform-modules-commonjs@7.24.7(transitive)
+ Added@babel/plugin-transform-modules-systemjs@7.24.7(transitive)
+ Added@babel/plugin-transform-modules-umd@7.24.7(transitive)
+ Added@babel/plugin-transform-named-capturing-groups-regex@7.24.7(transitive)
+ Added@babel/plugin-transform-new-target@7.24.7(transitive)
+ Added@babel/plugin-transform-nullish-coalescing-operator@7.24.7(transitive)
+ Added@babel/plugin-transform-numeric-separator@7.24.7(transitive)
+ Added@babel/plugin-transform-object-rest-spread@7.24.7(transitive)
+ Added@babel/plugin-transform-object-super@7.24.7(transitive)
+ Added@babel/plugin-transform-optional-catch-binding@7.24.7(transitive)
+ Added@babel/plugin-transform-optional-chaining@7.24.7(transitive)
+ Added@babel/plugin-transform-parameters@7.24.7(transitive)
+ Added@babel/plugin-transform-private-methods@7.24.7(transitive)
+ Added@babel/plugin-transform-private-property-in-object@7.24.7(transitive)
+ Added@babel/plugin-transform-property-literals@7.24.7(transitive)
+ Added@babel/plugin-transform-react-display-name@7.24.7(transitive)
+ Added@babel/plugin-transform-react-jsx@7.24.7(transitive)
+ Added@babel/plugin-transform-react-jsx-self@7.24.7(transitive)
+ Added@babel/plugin-transform-react-jsx-source@7.24.7(transitive)
+ Added@babel/plugin-transform-regenerator@7.24.7(transitive)
+ Added@babel/plugin-transform-reserved-words@7.24.7(transitive)
+ Added@babel/plugin-transform-runtime@7.24.7(transitive)
+ Added@babel/plugin-transform-shorthand-properties@7.24.7(transitive)
+ Added@babel/plugin-transform-spread@7.24.7(transitive)
+ Added@babel/plugin-transform-sticky-regex@7.24.7(transitive)
+ Added@babel/plugin-transform-template-literals@7.24.7(transitive)
+ Added@babel/plugin-transform-typeof-symbol@7.24.7(transitive)
+ Added@babel/plugin-transform-typescript@7.24.7(transitive)
+ Added@babel/plugin-transform-unicode-escapes@7.24.7(transitive)
+ Added@babel/plugin-transform-unicode-property-regex@7.24.7(transitive)
+ Added@babel/plugin-transform-unicode-regex@7.24.7(transitive)
+ Added@babel/plugin-transform-unicode-sets-regex@7.24.7(transitive)
+ Added@babel/preset-env@7.24.7(transitive)
+ Added@babel/preset-flow@7.24.7(transitive)
+ Added@babel/preset-modules@0.1.6-no-external-plugins(transitive)
+ Added@babel/preset-typescript@7.24.7(transitive)
+ Added@babel/register@7.24.6(transitive)
+ Added@babel/regjsgen@0.8.0(transitive)
+ Added@babel/runtime@7.24.7(transitive)
+ Added@babel/template@7.24.7(transitive)
+ Added@babel/traverse@7.24.7(transitive)
+ Added@babel/types@7.24.7(transitive)
+ Added@hapi/hoek@9.3.0(transitive)
+ Added@hapi/topo@5.1.0(transitive)
+ Added@isaacs/ttlcache@1.4.1(transitive)
+ Added@jest/create-cache-key-function@29.7.0(transitive)
+ Added@jest/environment@29.7.0(transitive)
+ Added@jest/fake-timers@29.7.0(transitive)
+ Added@jest/schemas@29.6.3(transitive)
+ Added@jest/types@26.6.227.5.129.6.3(transitive)
+ Added@jridgewell/gen-mapping@0.3.5(transitive)
+ Added@jridgewell/resolve-uri@3.1.2(transitive)
+ Added@jridgewell/set-array@1.2.1(transitive)
+ Added@jridgewell/source-map@0.3.6(transitive)
+ Added@jridgewell/sourcemap-codec@1.4.15(transitive)
+ Added@jridgewell/trace-mapping@0.3.25(transitive)
+ Added@react-native-community/cli@13.5.1(transitive)
+ Added@react-native-community/cli-clean@13.5.1(transitive)
+ Added@react-native-community/cli-config@13.5.1(transitive)
+ Added@react-native-community/cli-debugger-ui@12.0.0-alpha.1513.5.1(transitive)
+ Added@react-native-community/cli-doctor@13.5.1(transitive)
+ Added@react-native-community/cli-hermes@13.5.1(transitive)
+ Added@react-native-community/cli-platform-android@13.5.1(transitive)
+ Added@react-native-community/cli-platform-apple@13.5.1(transitive)
+ Added@react-native-community/cli-platform-ios@13.5.1(transitive)
+ Added@react-native-community/cli-server-api@12.0.0-alpha.1513.5.1(transitive)
+ Added@react-native-community/cli-tools@12.0.0-alpha.1513.5.1(transitive)
+ Added@react-native-community/cli-types@13.5.1(transitive)
+ Added@react-native-community/viewpager@3.3.1(transitive)
+ Added@react-native/assets-registry@0.74.0(transitive)
+ Added@react-native/babel-plugin-codegen@0.74.84(transitive)
+ Added@react-native/babel-preset@0.74.84(transitive)
+ Added@react-native/codegen@0.74.00.74.84(transitive)
+ Added@react-native/community-cli-plugin@0.74.0(transitive)
+ Added@react-native/debugger-frontend@0.74.84(transitive)
+ Added@react-native/dev-middleware@0.74.84(transitive)
+ Added@react-native/gradle-plugin@0.74.0(transitive)
+ Added@react-native/js-polyfills@0.74.0(transitive)
+ Added@react-native/metro-babel-transformer@0.74.84(transitive)
+ Added@react-native/normalize-colors@0.74.1(transitive)
+ Added@react-native/virtualized-lists@0.74.0(transitive)
+ Added@rnx-kit/chromium-edge-launcher@1.0.0(transitive)
+ Added@sideway/address@4.1.5(transitive)
+ Added@sideway/formula@3.0.1(transitive)
+ Added@sideway/pinpoint@2.0.0(transitive)
+ Added@sinclair/typebox@0.27.8(transitive)
+ Added@sinonjs/commons@3.0.1(transitive)
+ Added@sinonjs/fake-timers@10.3.0(transitive)
+ Added@types/istanbul-lib-coverage@2.0.6(transitive)
+ Added@types/istanbul-lib-report@3.0.3(transitive)
+ Added@types/istanbul-reports@3.0.4(transitive)
+ Added@types/node@18.19.3920.14.9(transitive)
+ Added@types/node-forge@1.3.11(transitive)
+ Added@types/stack-utils@2.0.3(transitive)
+ Added@types/yargs@15.0.1916.0.917.0.32(transitive)
+ Added@types/yargs-parser@21.0.3(transitive)
+ Addedabort-controller@3.0.0(transitive)
+ Addedaccepts@1.3.8(transitive)
+ Addedacorn@8.12.0(transitive)
+ Addedanser@1.4.10(transitive)
+ Addedansi-fragments@0.2.1(transitive)
+ Addedansi-regex@4.1.15.0.1(transitive)
+ Addedansi-styles@3.2.14.3.05.2.0(transitive)
+ Addedanymatch@3.1.3(transitive)
+ Addedappdirsjs@1.2.7(transitive)
+ Addedargparse@1.0.10(transitive)
+ Addedasap@2.0.6(transitive)
+ Addedast-types@0.15.2(transitive)
+ Addedastral-regex@1.0.0(transitive)
+ Addedasync-limiter@1.0.1(transitive)
+ Addedbabel-core@7.0.0-bridge.0(transitive)
+ Addedbabel-plugin-polyfill-corejs2@0.4.11(transitive)
+ Addedbabel-plugin-polyfill-corejs3@0.10.4(transitive)
+ Addedbabel-plugin-polyfill-regenerator@0.6.2(transitive)
+ Addedbabel-plugin-transform-flow-enums@0.0.2(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbase64-js@1.5.1(transitive)
+ Addedbl@4.1.0(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbraces@3.0.3(transitive)
+ Addedbrowserslist@4.23.1(transitive)
+ Addedbser@2.1.1(transitive)
+ Addedbuffer@5.7.1(transitive)
+ Addedbuffer-from@1.1.2(transitive)
+ Addedbytes@3.0.0(transitive)
+ Addedcaller-callsite@2.0.0(transitive)
+ Addedcaller-path@2.0.0(transitive)
+ Addedcallsites@2.0.0(transitive)
+ Addedcamelcase@5.3.16.3.0(transitive)
+ Addedcaniuse-lite@1.0.30001639(transitive)
+ Addedchalk@2.4.24.1.2(transitive)
+ Addedchrome-launcher@0.15.2(transitive)
+ Addedci-info@2.0.03.9.0(transitive)
+ Addedcli-cursor@3.1.0(transitive)
+ Addedcli-spinners@2.9.2(transitive)
+ Addedcliui@6.0.08.0.1(transitive)
+ Addedclone@1.0.4(transitive)
+ Addedclone-deep@4.0.1(transitive)
+ Addedcolor-convert@1.9.32.0.1(transitive)
+ Addedcolor-name@1.1.31.1.4(transitive)
+ Addedcolorette@1.4.0(transitive)
+ Addedcommand-exists@1.2.9(transitive)
+ Addedcommander@2.20.39.5.0(transitive)
+ Addedcommondir@1.0.1(transitive)
+ Addedcompressible@2.0.18(transitive)
+ Addedcompression@1.7.4(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedconnect@3.7.0(transitive)
+ Addedconvert-source-map@2.0.0(transitive)
+ Addedcore-js-compat@3.37.1(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addedcosmiconfig@5.2.1(transitive)
+ Addedcross-spawn@7.0.3(transitive)
+ Addeddayjs@1.11.11(transitive)
+ Addeddebug@2.6.94.3.5(transitive)
+ Addeddecamelize@1.2.0(transitive)
+ Addeddeepmerge@4.3.1(transitive)
+ Addeddefaults@1.0.4(transitive)
+ Addeddenodeify@1.2.1(transitive)
+ Addeddepd@2.0.0(transitive)
+ Addeddestroy@1.2.0(transitive)
+ Addedee-first@1.1.1(transitive)
+ Addedelectron-to-chromium@1.4.815(transitive)
+ Addedemoji-regex@8.0.0(transitive)
+ Addedencodeurl@1.0.2(transitive)
+ Addedenvinfo@7.13.0(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addederror-stack-parser@2.1.4(transitive)
+ Addederrorhandler@1.5.1(transitive)
+ Addedescalade@3.1.2(transitive)
+ Addedescape-html@1.0.3(transitive)
+ Addedescape-string-regexp@1.0.52.0.04.0.0(transitive)
+ Addedesprima@4.0.1(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedetag@1.8.1(transitive)
+ Addedevent-target-shim@5.0.1(transitive)
+ Addedexeca@5.1.1(transitive)
+ Addedfast-xml-parser@4.4.0(transitive)
+ Addedfb-watchman@2.0.2(transitive)
+ Addedfill-range@7.1.1(transitive)
+ Addedfinalhandler@1.1.2(transitive)
+ Addedfind-cache-dir@2.1.0(transitive)
+ Addedfind-up@3.0.04.1.05.0.0(transitive)
+ Addedflow-enums-runtime@0.0.6(transitive)
+ Addedflow-parser@0.206.0(transitive)
+ Addedfresh@0.5.2(transitive)
+ Addedfs-extra@8.1.0(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfsevents@2.3.3(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedgensync@1.0.0-beta.2(transitive)
+ Addedget-caller-file@2.0.5(transitive)
+ Addedget-stream@6.0.1(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedglobals@11.12.0(transitive)
+ Addedgraceful-fs@4.2.11(transitive)
+ Addedhas-flag@3.0.04.0.0(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhermes-estree@0.15.00.19.1(transitive)
+ Addedhermes-parser@0.15.00.19.1(transitive)
+ Addedhermes-profile-transformer@0.0.6(transitive)
+ Addedhttp-errors@2.0.0(transitive)
+ Addedhuman-signals@2.1.0(transitive)
+ Addedieee754@1.2.1(transitive)
+ Addedimage-size@1.1.1(transitive)
+ Addedimport-fresh@2.0.0(transitive)
+ Addedimurmurhash@0.1.4(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedinvariant@2.2.4(transitive)
+ Addedip@1.1.9(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-core-module@2.14.0(transitive)
+ Addedis-directory@0.3.1(transitive)
+ Addedis-docker@2.2.1(transitive)
+ Addedis-fullwidth-code-point@2.0.03.0.0(transitive)
+ Addedis-interactive@1.0.0(transitive)
+ Addedis-number@7.0.0(transitive)
+ Addedis-plain-object@2.0.4(transitive)
+ Addedis-stream@2.0.1(transitive)
+ Addedis-unicode-supported@0.1.0(transitive)
+ Addedis-wsl@1.1.02.2.0(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedisexe@2.0.0(transitive)
+ Addedisobject@3.0.1(transitive)
+ Addedjest-environment-node@29.7.0(transitive)
+ Addedjest-get-type@29.6.3(transitive)
+ Addedjest-message-util@29.7.0(transitive)
+ Addedjest-mock@29.7.0(transitive)
+ Addedjest-util@27.5.129.7.0(transitive)
+ Addedjest-validate@29.7.0(transitive)
+ Addedjest-worker@27.5.1(transitive)
+ Addedjoi@17.13.3(transitive)
+ Addedjs-tokens@4.0.0(transitive)
+ Addedjs-yaml@3.14.1(transitive)
+ Addedjsc-android@250231.0.0(transitive)
+ Addedjsc-safe-url@0.2.4(transitive)
+ Addedjscodeshift@0.14.0(transitive)
+ Addedjsesc@0.5.02.5.2(transitive)
+ Addedjson-parse-better-errors@1.0.2(transitive)
+ Addedjson5@2.2.3(transitive)
+ Addedjsonfile@4.0.0(transitive)
+ Addedkind-of@6.0.3(transitive)
+ Addedkleur@3.0.3(transitive)
+ Addedleven@3.1.0(transitive)
+ Addedlighthouse-logger@1.4.2(transitive)
+ Addedlocate-path@3.0.05.0.06.0.0(transitive)
+ Addedlodash.debounce@4.0.8(transitive)
+ Addedlodash.throttle@4.1.1(transitive)
+ Addedlog-symbols@4.1.0(transitive)
+ Addedlogkitty@0.7.1(transitive)
+ Addedloose-envify@1.4.0(transitive)
+ Addedlru-cache@5.1.1(transitive)
+ Addedmake-dir@2.1.0(transitive)
+ Addedmakeerror@1.0.12(transitive)
+ Addedmarky@1.2.5(transitive)
+ Addedmemoize-one@5.2.1(transitive)
+ Addedmerge-stream@2.0.0(transitive)
+ Addedmetro@0.79.1(transitive)
+ Addedmetro-babel-transformer@0.79.1(transitive)
+ Addedmetro-cache@0.79.1(transitive)
+ Addedmetro-cache-key@0.79.1(transitive)
+ Addedmetro-config@0.79.1(transitive)
+ Addedmetro-core@0.79.1(transitive)
+ Addedmetro-file-map@0.79.1(transitive)
+ Addedmetro-minify-terser@0.79.1(transitive)
+ Addedmetro-resolver@0.79.1(transitive)
+ Addedmetro-runtime@0.79.10.80.9(transitive)
+ Addedmetro-source-map@0.79.10.80.9(transitive)
+ Addedmetro-symbolicate@0.79.10.80.9(transitive)
+ Addedmetro-transform-plugins@0.79.1(transitive)
+ Addedmetro-transform-worker@0.79.1(transitive)
+ Addedmicromatch@4.0.7(transitive)
+ Addedmime@1.6.02.6.0(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedmimic-fn@2.1.0(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp@0.5.61.0.4(transitive)
+ Addedms@2.0.02.1.22.1.3(transitive)
+ Addednegotiator@0.6.3(transitive)
+ Addedneo-async@2.6.2(transitive)
+ Addednocache@3.0.4(transitive)
+ Addednode-abort-controller@3.1.1(transitive)
+ Addednode-dir@0.1.17(transitive)
+ Addednode-fetch@2.7.0(transitive)
+ Addednode-forge@1.3.1(transitive)
+ Addednode-int64@0.4.0(transitive)
+ Addednode-releases@2.0.14(transitive)
+ Addednode-stream-zip@1.15.0(transitive)
+ Addednormalize-path@3.0.0(transitive)
+ Addednpm-run-path@4.0.1(transitive)
+ Addednullthrows@1.1.1(transitive)
+ Addedob1@0.79.10.80.9(transitive)
+ Addedobject-assign@4.1.1(transitive)
+ Addedon-finished@2.3.02.4.1(transitive)
+ Addedon-headers@1.0.2(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedonetime@5.1.2(transitive)
+ Addedopen@6.4.07.4.2(transitive)
+ Addedora@5.4.1(transitive)
+ Addedp-limit@2.3.03.1.0(transitive)
+ Addedp-locate@3.0.04.1.05.0.0(transitive)
+ Addedp-try@2.2.0(transitive)
+ Addedparse-json@4.0.0(transitive)
+ Addedparseurl@1.3.3(transitive)
+ Addedpath-exists@3.0.04.0.0(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-key@3.1.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpicocolors@1.0.1(transitive)
+ Addedpicomatch@2.3.1(transitive)
+ Addedpify@4.0.1(transitive)
+ Addedpirates@4.0.6(transitive)
+ Addedpkg-dir@3.0.0(transitive)
+ Addedpretty-format@26.6.229.7.0(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedpromise@8.3.0(transitive)
+ Addedprompts@2.4.2(transitive)
+ Addedprop-types@15.8.1(transitive)
+ Addedqueue@6.0.2(transitive)
+ Addedrange-parser@1.2.1(transitive)
+ Addedreact@16.14.018.2.0(transitive)
+ Addedreact-devtools-core@5.3.0(transitive)
+ Addedreact-is@16.13.117.0.218.3.1(transitive)
+ Addedreact-native@1000.0.0(transitive)
+ Addedreact-refresh@0.14.20.4.3(transitive)
+ Addedreact-shallow-renderer@16.15.0(transitive)
+ Addedreadable-stream@2.3.83.6.2(transitive)
+ Addedreadline@1.3.0(transitive)
+ Addedrecast@0.21.5(transitive)
+ Addedregenerate@1.4.2(transitive)
+ Addedregenerate-unicode-properties@10.1.1(transitive)
+ Addedregenerator-runtime@0.13.110.14.1(transitive)
+ Addedregenerator-transform@0.15.2(transitive)
+ Addedregexpu-core@5.3.2(transitive)
+ Addedregjsparser@0.9.1(transitive)
+ Addedrequire-directory@2.1.1(transitive)
+ Addedrequire-main-filename@2.0.0(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedresolve-from@3.0.0(transitive)
+ Addedrestore-cursor@3.1.0(transitive)
+ Addedrimraf@2.6.33.0.2(transitive)
+ Addedsafe-buffer@5.1.25.2.1(transitive)
+ Addedscheduler@0.24.0-canary-efb381bbf-20230505(transitive)
+ Addedselfsigned@2.4.1(transitive)
+ Addedsemver@5.7.26.3.17.6.2(transitive)
+ Addedsend@0.18.0(transitive)
+ Addedserialize-error@2.1.0(transitive)
+ Addedserve-static@1.15.0(transitive)
+ Addedset-blocking@2.0.0(transitive)
+ Addedsetprototypeof@1.2.0(transitive)
+ Addedshallow-clone@3.0.1(transitive)
+ Addedshebang-command@2.0.0(transitive)
+ Addedshebang-regex@3.0.0(transitive)
+ Addedshell-quote@1.8.1(transitive)
+ Addedsignal-exit@3.0.7(transitive)
+ Addedsisteransi@1.0.5(transitive)
+ Addedslash@3.0.0(transitive)
+ Addedslice-ansi@2.1.0(transitive)
+ Addedsource-map@0.5.70.6.10.7.4(transitive)
+ Addedsource-map-support@0.5.21(transitive)
+ Addedsprintf-js@1.0.3(transitive)
+ Addedstack-utils@2.0.6(transitive)
+ Addedstackframe@1.3.4(transitive)
+ Addedstacktrace-parser@0.1.10(transitive)
+ Addedstatuses@1.5.02.0.1(transitive)
+ Addedstring-width@4.2.3(transitive)
+ Addedstring_decoder@1.1.11.3.0(transitive)
+ Addedstrip-ansi@5.2.06.0.1(transitive)
+ Addedstrip-final-newline@2.0.0(transitive)
+ Addedstrnum@1.0.5(transitive)
+ Addedsudo-prompt@9.2.1(transitive)
+ Addedsupports-color@5.5.07.2.08.1.1(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedtemp@0.8.4(transitive)
+ Addedtemp-dir@2.0.0(transitive)
+ Addedterser@5.31.1(transitive)
+ Addedthroat@5.0.0(transitive)
+ Addedthrough2@2.0.5(transitive)
+ Addedtmpl@1.0.5(transitive)
+ Addedto-fast-properties@2.0.0(transitive)
+ Addedto-regex-range@5.0.1(transitive)
+ Addedtoidentifier@1.0.1(transitive)
+ Addedtr46@0.0.3(transitive)
+ Addedtslib@2.6.3(transitive)
+ Addedtype-detect@4.0.8(transitive)
+ Addedtype-fest@0.7.1(transitive)
+ Addedundici-types@5.26.5(transitive)
+ Addedunicode-canonical-property-names-ecmascript@2.0.0(transitive)
+ Addedunicode-match-property-ecmascript@2.0.0(transitive)
+ Addedunicode-match-property-value-ecmascript@2.1.0(transitive)
+ Addedunicode-property-aliases-ecmascript@2.1.0(transitive)
+ Addeduniversalify@0.1.2(transitive)
+ Addedunpipe@1.0.0(transitive)
+ Addedupdate-browserslist-db@1.0.16(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedutils-merge@1.0.1(transitive)
+ Addedvary@1.1.2(transitive)
+ Addedvlq@1.0.1(transitive)
+ Addedwalker@1.0.8(transitive)
+ Addedwcwidth@1.0.1(transitive)
+ Addedwebidl-conversions@3.0.1(transitive)
+ Addedwhatwg-fetch@3.6.20(transitive)
+ Addedwhatwg-url@5.0.0(transitive)
+ Addedwhich@2.0.2(transitive)
+ Addedwhich-module@2.0.1(transitive)
+ Addedwrap-ansi@6.2.07.0.0(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedwrite-file-atomic@2.4.3(transitive)
+ Addedws@6.2.37.5.10(transitive)
+ Addedxtend@4.0.2(transitive)
+ Addedy18n@4.0.35.0.8(transitive)
+ Addedyallist@3.1.1(transitive)
+ Addedyaml@2.4.5(transitive)
+ Addedyargs@15.4.117.7.2(transitive)
+ Addedyargs-parser@18.1.321.1.1(transitive)
+ Addedyocto-queue@0.1.0(transitive)