Javascript 反应本机:道具更改导致触摸事件取消
我正在使用Javascript 反应本机:道具更改导致触摸事件取消,javascript,arrays,reactjs,react-native,Javascript,Arrays,Reactjs,React Native,我正在使用react原生手势处理程序库创建组件的拖放可排序数组。我现在已经到了我开始为它添加动画的时候了。我通过使用layoutaimations.configureNext(Constants.MyAnimConfig)在我希望为下一次更改设置动画的选定位置执行此操作 数据数组本身(data),以及一个基本呈现函数(renderItem({item,index})),以及一个在数据数组重新排序时调用的函数(onReorder:{ 常量IsBeingDrawed=isMoving&&index=
react原生手势处理程序
库创建组件的拖放可排序数组。我现在已经到了我开始为它添加动画的时候了。我通过使用layoutaimations.configureNext(Constants.MyAnimConfig)
在我希望为下一次更改设置动画的选定位置执行此操作
数据数组本身(data
),以及一个基本呈现函数(renderItem({item,index})
),以及一个在数据数组重新排序时调用的函数(onReorder:
编辑:
看来我的猜测是因为更新道具(从而触发重新渲染)导致的,这是不正确的。即使在本地状态下,也会取消触摸。下一步是尝试将其放入组件范围之外的减速器功能中,并祈祷
编辑2:将数据
数组移动到减缩器中也不起作用。此时,我只有一个猜测。我的列表组件将renderItem
道具包装在自己的\u renderItem
函数中,该函数将列表项包装在PanGestureHandler
中,如下所示:
const _renderItem = ({item, index}) => {
const isBeingDragged = isMoving && index === dragIndex;
const style: ViewStyle = {
width: itemStyle.width,
height: itemStyle.width,
opacity: isBeingDragged ? 0 : 1,
};
return (
<PanGestureHandler
key={`handler-${item.name}`}
onGestureEvent={e => onMove(e, index)}
onHandlerStateChange={e => onState(e, index)}>
<Animated.View style={{...itemStyle, ...style}}>
{renderItem({item, index})}
</Animated.View>
</PanGestureHandler>
);
};
const\u renderItem=({item,index})=>{
常量IsBeingDrawed=isMoving&&index==dragIndex;
常量样式:视图样式={
宽度:itemStyle.width,
高度:itemStyle.width,
不透明度:正在拖动?0:1,
};
返回(
onMove(e,index)}
onHandlerStateChange={e=>onState(e,索引)}>
{renderItem({item,index})}
);
};
我现在的假设是,该事件被取消,因为触发并继续触摸事件的PanGestureHandler
由于数组重新排序而被重新渲染。至于为什么只有当元素向下移动时才会发生这种情况,这是任何人的猜测。此时,我已经没有想法了。因此,我确实对t进行了研究他最后一次编辑。处理平移运动的
的重新渲染取消了该手势。这是因为我在列表中为每个渲染项包含了一个
。而这是一种方便的方法,可以获取用户拖动的元素的索引,并将其传递给OnGetureEvent
和e> onHandlerStateChange
事件处理程序,它最终不得不退出
我从一开始就应该做的是只渲染一个
,并将其放在列表上方,然后使用我创建的函数获取数组中基于XY坐标的元素索引以获取索引。这就是我最终所做的:
<PanGestureHandler onGestureEvent={onMove} onHandlerStateChange={onState}>
<View
onLayout={({nativeEvent: {layout}}) => setContainerView(layout)}
style={styles.listContainer}>
{data.map((item, index) => _renderItem({item, index}))}
</View>
</PanGestureHandler>
setContainerView(布局)}
style={styles.listContainer}>
{data.map((项,索引)=>\u renderItem({项,索引}))}
如果您面临类似的问题,您应该查看我创建的要点。请记住,此列表创建为水平的,这可能与您自己的实现不同。它也需要一些更改。相应地计划