gpt4 book ai didi

javascript - 如何在 ListView (react-native)上制作滑动功能?

转载 作者:行者123 更新时间:2023-11-29 21:26:10 24 4
gpt4 key购买 nike

我有项目 list 。我正在使用 ListView为此,我需要能够通过向左或向右滑动来删除任何行。

我可以从哪里开始?

最佳答案

如果您愿意,请关注 this guide使用 React Native Swipeout .

否则,这是我的 SwipeList 和 SwipeListRow 组件。我部分使用了我的图书馆 Cairn用于样式,但如果您愿意的话,它应该很容易地转换成普通的 React 样式表:

滑动列表.js

import React from 'react';
import { Text, ListView } from 'react-native';
import styleContext from 'app/style';

const style = styleContext.extend({
listViewSection: {
paddingVertical: 10,
paddingLeft: 15,
backgroundColor: '$greyDefault'
},

'text.listViewSection': {
color: '$greyMid',
fontSize: 16,
marginLeft: 5
}
});

function SwipeList({ dataSource, renderRow }) {
function renderSectionHeader(sectionData, sectionId) {
return (
<View {...style('listViewSection')}>
<Text {...style('text.listViewSection')}>{sectionId.toUpperCase()}</Text>
</View>
);
}

if (!dataSource.rowIdentities.length) {
return (
<Text>No items found.</Text>
);
}

return (
<ListView
dataSource={dataSource}
automaticallyAdjustContentInsets={false}
directionalLockEnabled
keyboardShouldPersistTaps={false}
keyboardDismissMode={'on-drag'}
renderSectionHeader={renderSectionHeader}
renderRow={renderRow} />
);
}

SwipeList.propTypes = {
dataSource: React.PropTypes.shape({
rowIdentities: React.PropTypes.array.isRequired
}).isRequired,
renderRow: React.PropTypes.func.isRequired
};

export default SwipeList;

滑动列表行.js

import React from 'react';
import {
View,
Text,
ScrollView,
Animated,
Dimensions
} from 'react-native';

import styleContext from 'app/style';

const { width } = Dimensions.get('window');
const style = styleContext.extend({
swipeMessage: {
position: 'absolute',
top: 0,
height: 75,
justifyContent: 'center',
alignItems: 'center'
},

itemContainer: {
width
}
});

const WHITE = 0;
const GREEN = 1;
const AnimatedScrollView = Animated.createAnimatedComponent(ScrollView);

class SwipeListRow extends React.Component {
constructor(props) {
super(props);

this.state = {
color: new Animated.Value(WHITE)
};
}

animateScroll = (e) => {
const threshold = width / 5;
let x = e.nativeEvent.contentOffset.x;
let swiped = null;

x = x * -1;

if (x > -50 && this.swiped !== WHITE) {
swiped = WHITE;
} else if (x < -50 && x > -threshold && this.swiped !== GREEN) {
swiped = GREEN;
}

if (swiped !== null) {
this.swiped = swiped;

Animated.timing(this.state.color, {
toValue: swiped,
duration: 200
}).start();
}
}

takeAction = () => {
if (this.swiped) {
Animated.timing(this.state.color, {
toValue: WHITE,
duration: 200
}).start();

this.props.onSwipe();
}
}

render() {
const { swipeEnabled, swipeMessage, children } = this.props;
const bgColor = this.state.color.interpolate({
inputRange: [
WHITE,
GREEN
],
outputRange: [
'rgb(255, 255, 255)',
'rgb(123, 204, 40)'
]
});

return (
<View>
<AnimatedScrollView
horizontal
directionalLockEnabled
automaticallyAdjustContentInsets={false}
onScroll={this.animateScroll}
scrollEventThrottle={16}
scrollEnabled={swipeEnabled}
onMomentumScrollBegin={this.takeAction}
style={[{ flex: 1 }, { backgroundColor: bgColor }]}>
<View>
<View {...style('itemContainer')}>
{children}
</View>
<View
{...style(
'swipeMessage',
[{ width: width / 5, right: -width / 5 - 20 }]
)}>
<Text {...style('text.bold text.white')}>{swipeMessage}</Text>
</View>
</View>
</AnimatedScrollView>
</View>
);
}
}

SwipeListRow.propTypes = {
children: React.PropTypes.node.isRequired,
onSwipe: React.PropTypes.func.isRequired,
swipeEnabled: React.PropTypes.bool.isRequired,
swipeMessage: React.PropTypes.string.isRequired
};


export default SwipeListRow;

有了这些组件,现在您所要做的就是像向普通 ListView 一样传递所需的数据源,如 ListView component documentation 中所述。 .

    <SwipeList
dataSource={dataSource}
renderRow={(item) => (
<SwipeListRow
key={item.id}
swipeMessage={'Delete Item'}
onSwipe={() => deleteItem(item)}
swipeEnabled={true}>
<<< INSERT DISPLAY OF ROW HERE >>>
</SwipeListRow>
)} />

关于javascript - 如何在 ListView (react-native)上制作滑动功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37393453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com