【发布时间】:2020-07-25 05:17:31
【问题描述】:
我正在使用 react-native-svg 制作应用程序,但无法从 PanResponder 内部更新组件的状态。
我有一个
我正在尝试在平移手势完成后更改 originCoords,因此,即使
这是我的文件:
// MapScreen.js
import React, { useRef, useState } from "react";
import { Animated } from "react-native";
import { Svg, Circle } from "react-native-svg";
import { createPanResponder } from "../services/utils/createPanResponder";
export const MapScreen = () => {
const [originCoords, setOriginCoords] = useState({x: 0, y: 0});
const [circleCoords, setCircleCoords] = useState({x: 20, y: 20});
const pan = useRef(new Animated.ValueXY()).current;
const panResponder = createPanResponder(pan, originCoords, setOriginCoords);
return (
<Animated.View
style={{transform: [{ translateX: pan.x }, { translateY: pan.y }],}}
{...panResponder.panHandlers}
>
<Svg width='300' height='300' style={{ backgroundColor: "blue" }}>
<Circle
cx={`${circleCoords.x - originCoords.x}`}
cy={`${circleCoords.y - originCoords.y}`}
r="5"
stroke="white"
strokeWidth="1"
/>
</Svg>
</Animated.View>
);
};
import { useRef } from "react";
import { PanResponder, Animated } from "react-native";
export const createPanResponder = (pan, originCoords, setOriginCoords) => {
return useRef(
PanResponder.create({
// PanResponder default configs have been removed to be more succint
onPanResponderMove: (evt, gestureState) => {
// sets pan.x and pan.y to equal gesture's deltas
Animated.event([{ x: pan.x }])({ x: gestureState.dx });
Animated.event([{ y: pan.y }])({ y: gestureState.dy });
},
onPanResponderRelease: (evt, gestureState) => {
//resets pan.x and pan.y
Animated.event([{ x: pan.x }])({ x: 0 });
Animated.event([{ y: pan.y }])({ y: 0 });
// PROBLEM IS HERE, setOriginCoords DOESN'T DO ANYTHING
console.log(originCoords); // { x: 0, y: 0 }
const { dx, dy } = gestureState;
setOriginCoords({ ...originCoords, dx, dy });
console.log(originCoords); // { x: 0, y: 0 }
},
})
).current;
};
【问题讨论】:
标签: javascript reactjs react-native svg react-native-android