2017-08-09 24 views
0

我做了一個側面菜單,它在genymotion上沒問題,但不能在我的手機上工作。它的響應延遲超過10秒,大部分時間不響應phone.please幫助我!我做了一個側面菜單,但PanResponder不能在電話上工作

在開始的時候,我認爲這是流動的原因: 1,位置:「絕對」 2,PanResponder包裝器可觸摸

我不得不嘗試清潔這一點,但它也沒有work.maybe它的一個bug,你是 ?

enter image description here

import React, {Component} from 'react' 
 
import { 
 
\t View, 
 
\t Text, 
 
\t StyleSheet, 
 
\t ScrollView, 
 
\t Alert, 
 
\t PanResponder, 
 
\t TouchableOpacity 
 
} from 'react-native' 
 
import {get_pointBaikeCate} from 'api' 
 
import {Touchable} from 'basic' 
 

 

 
export default class PointBaike extends Component { 
 
\t static navigationOptions = { 
 
\t \t title: '穴位百科', 
 
\t \t header: null 
 
\t } 
 
\t 
 
\t constructor(props) { 
 
\t \t super(props); 
 
\t \t this.state = { 
 
\t \t \t info: [] 
 
\t \t } 
 
\t \t 
 
\t \t this.scrollY = [] 
 
\t } 
 
\t 
 
\t async getInfo() { 
 
\t \t let res = await get_pointBaikeCate(); 
 
\t \t console.log(res) 
 
\t \t 
 
\t \t // let info = []; 
 
\t \t // res.data.map((r)=> { 
 
\t \t // \t r.content.map(c=> { 
 
\t \t // \t \t let flag = info.find((item)=> { 
 
\t \t // \t \t \t return item.jl == c.jl 
 
\t \t // \t \t }) 
 
\t \t // \t \t if (flag) { 
 
\t \t // \t \t \t flag.xw += `,${c.xw}` 
 
\t \t // \t \t } else { 
 
\t \t // \t \t \t info.push({ 
 
\t \t // \t \t \t \t jl: c.jl, 
 
\t \t // \t \t \t \t xw: c.xw 
 
\t \t // \t \t \t }) 
 
\t \t // \t \t } 
 
\t \t // \t }) 
 
\t \t // }); 
 
\t \t // 
 
\t \t // // 對info的xw進行過濾 
 
\t \t // info = info.map((item)=> { 
 
\t \t // \t let xw = item.xw.split(/[,|]/) 
 
\t \t // \t item.xw = [...new Set(xw)].filter((x)=> { 
 
\t \t // \t \t return x 
 
\t \t // \t }) 
 
\t \t // \t return item 
 
\t \t // }); 
 
\t \t 
 
\t \t this.setState({ 
 
\t \t \t info: res.data 
 
\t \t }) 
 
\t } 
 
\t 
 
\t goDetail(item) { 
 
\t \t let {navigate} = this.props.navigation 
 
\t \t console.log(item) 
 
\t \t navigate('PointBaikeDetail', { 
 
\t \t \t item 
 
\t \t }) 
 
\t } 
 
\t 
 
\t componentWillMount() { 
 
\t \t this.getInfo() 
 
\t \t 
 
\t \t this._panResponder = PanResponder.create({ 
 
\t \t \t onStartShouldSetPanResponder: this._handleStartShouldSetPanResponder.bind(this), 
 
\t \t \t onStartShouldSetPanResponderCapture: this._handleStartShouldSetPanResponderCapture.bind(this), 
 
\t \t \t onMoveShouldSetPanResponder: this._handlerMoveShouldSetPanResponder.bind(this), 
 
\t \t \t onMoveShouldSetPanResponderCapture: this._handleMoveShouldSetPanResponderCapture.bind(this), 
 
\t \t \t onPanResponderTerminationRequest: this._handleMoveShouldSetPanResponderCapture, 
 
\t \t \t onPanResponderMove: this._handlePanResponderMove.bind(this), 
 
\t \t }); 
 
\t } 
 
\t _handlerMoveShouldSetPanResponder(evt, gestureState){ 
 
\t \t if (gestureState.dx != 0 && gestureState.dy == 0) { 
 
\t \t \t return true; 
 
\t \t } 
 
\t \t return false; 
 
\t } 
 
\t 
 
\t _handleMoveShouldSetPanResponderCapture(evt, gestureState) { 
 
\t \t return gestureState.dx != 0 && gestureState.dy != 0 
 
\t } 
 
\t 
 
\t _handleStartShouldSetPanResponderCapture(evt, gestureState) { 
 
\t \t return gestureState.dx != 0 && gestureState.dy != 0; 
 
\t } 
 
\t 
 
\t _handleMoveShouldSetPanResponderCapture(evt, gestureState) { 
 
\t \t return gestureState.dx != 0 && gestureState.dy != 0; 
 
\t } 
 
\t 
 
\t _scrollTo(index) { 
 
\t \t // Alert.alert('索引', `${index}`) 
 
\t \t 
 
\t \t this._scrollView.scrollTo({y: this.scrollY[index]}) 
 
\t } 
 
\t 
 
\t _handleStartShouldSetPanResponder() { 
 
\t \t return true 
 
\t } 
 
\t 
 
\t _handlePanResponderMove(e, gestureState) { 
 
\t \t // console.log('滑動', e.nativeEvent.pageY) 
 
\t \t // 計算手指在那個元素上,得出index,然後根據index設置scrollTop 
 
\t \t let y = e.nativeEvent.pageY - 100 
 
\t \t let index = Math.ceil(y/20) - 1 
 
\t \t console.log(index, this) 
 
\t \t 
 
\t \t this._scrollView.scrollTo({y: this.scrollY[index]}) 
 
\t } 
 
\t 
 
\t 
 
\t _onLayout({nativeEvent}) { 
 
\t \t this.scrollY.push(nativeEvent.layout.y) 
 
\t } 
 
\t 
 
\t render() { 
 
\t \t let {info} = this.state 
 
\t \t return (
 
\t \t \t <View style={styles.wrapper}> 
 
\t \t \t \t 
 
\t \t \t \t <ScrollView style={{flex: 1, height: 300}} 
 
\t \t \t \t    showsVerticalScrollIndicator={false} 
 
\t \t \t \t    ref={(e)=> { 
 
\t \t \t \t \t    this._scrollView = e 
 
\t \t \t \t    }} 
 
\t \t \t \t > 
 
\t \t \t \t \t { 
 
\t \t \t \t \t \t info.map((item, i)=> { 
 
\t \t \t \t \t \t \t return (
 
\t \t \t \t \t \t \t \t <View key={i} style={styles.lists} 
 
\t \t \t \t \t \t \t \t  onLayout={this._onLayout.bind(this)} 
 
\t \t \t \t \t \t \t \t > 
 
\t \t \t \t \t \t \t \t \t <View> 
 
\t \t \t \t \t \t \t \t \t \t <Text style={styles.title}>{item.title}</Text> 
 
\t \t \t \t \t \t \t \t \t </View> 
 
\t \t \t \t \t \t \t \t \t <View style={styles.listBox}> 
 
\t \t \t \t \t \t \t \t \t \t 
 
\t \t \t \t \t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t \t \t \t \t item.list.map((x, xi)=> { 
 
\t \t \t \t \t \t \t \t \t \t \t \t return (
 
\t \t \t \t \t \t \t \t \t \t \t \t \t <Touchable key={xi} 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t   onPress={this.goDetail.bind(this, x)} 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t > 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t \t <View style={styles.list}> 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t <Text 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t style={styles.text}>{x.title}</Text> 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t \t </View> 
 
\t \t \t \t \t \t \t \t \t \t \t \t \t </Touchable> 
 
\t \t \t \t \t \t \t \t \t \t \t \t) 
 
\t \t \t \t \t \t \t \t \t \t \t }) 
 
\t \t \t \t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t \t \t </View> 
 
\t \t \t \t \t \t \t \t </View> 
 
\t \t \t \t \t \t \t) 
 
\t \t \t \t \t \t }) 
 
\t \t \t \t \t } 
 
\t \t \t \t \t <View style={{height: 100}}></View> 
 
\t \t \t \t </ScrollView> 
 
\t \t \t \t <View style={styles.sideMenu} 
 
\t \t \t \t  {...this._panResponder.panHandlers} 
 
\t \t \t \t > 
 
\t \t \t \t \t { 
 
\t \t \t \t \t \t info.map((item, i)=> { 
 
\t \t \t \t \t \t \t return (
 
\t \t \t \t \t \t \t \t <TouchableOpacity key={i} onPress={this._scrollTo.bind(this, i)}> 
 
\t \t \t \t \t \t \t \t \t <View> 
 
\t \t \t \t \t \t \t \t \t \t <Text 
 
\t \t \t \t \t \t \t \t \t \t \t style={styles.sideText}>{item.title.charAt(3) || item.title.charAt(0)}</Text> 
 
\t \t \t \t \t \t \t \t \t </View> 
 
\t \t \t \t \t \t \t \t </TouchableOpacity> 
 
\t \t \t \t \t \t \t) 
 
\t \t \t \t \t \t }) 
 
\t \t \t \t \t } 
 
\t \t \t \t </View> 
 
\t \t \t </View> 
 
\t \t) 
 
\t } 
 
} 
 

 
const styles = StyleSheet.create({ 
 
\t wrapper: { 
 
\t \t paddingLeft: 6, 
 
\t \t paddingRight: 6, 
 
\t \t paddingTop: 10, 
 
\t \t paddingBottom: 10, 
 
\t \t flex: 1, 
 
\t \t backgroundColor: '#fff' 
 
\t }, 
 
\t sideText: { 
 
\t \t width: 25, 
 
\t \t height: 20, 
 
\t \t lineHeight: 20, 
 
\t \t textAlign: 'center' 
 
\t }, 
 
\t sideMenu: { 
 
\t \t position: 'absolute', 
 
\t \t right: 0, 
 
\t \t top: 100, 
 
\t \t zIndex: 100, 
 
\t \t backgroundColor: '#eee' 
 
\t }, 
 
\t lists: {}, 
 
\t listBox: { 
 
\t \t flexDirection: 'row', 
 
\t \t flexWrap: 'wrap' 
 
\t }, 
 
\t list: { 
 
\t \t width: (WinWidth - 20)/5, 
 
\t }, 
 
\t title: { 
 
\t \t fontSize: 18, 
 
\t \t color: DEFAULT_COLOR, 
 
\t \t paddingTop: 14, 
 
\t \t paddingBottom: 10 
 
\t }, 
 
\t text: { 
 
\t \t flex: 1, 
 
\t \t textAlign: 'center', 
 
\t \t paddingTop: 10, 
 
\t \t paddingBottom: 10, 
 
\t } 
 
})

回答

0

你可以試試這個

componentWillMount() { 
    this.getInfo() 

    this._panResponder = PanResponder.create({ 
     onStartShouldSetPanResponder:() => true, 
     onStartShouldSetPanResponderCapture: this._handleStartShouldSetPanResponderCapture.bind(this), 
     onMoveShouldSetPanResponder: this._handlerMoveShouldSetPanResponder.bind(this), 
     onMoveShouldSetPanResponderCapture: this._handleMoveShouldSetPanResponderCapture.bind(this), 
     onPanResponderTerminationRequest: this._handleMoveShouldSetPanResponderCapture, 
     onPanResponderMove: this._handlePanResponderMove.bind(this), 
    }); 
} 
+0

點擊菜單是好的,但panResponderMove是延遲了,但是它的確定上genymotion。 – banli17

相關問題