我正在使用本機反應創建一個撲克桌,我希望點擊椅子影片應該發生(桌子周圍的椅子安排)。
但是影片在第一次點擊時不起作用,而在我第二次點擊時它起作用。
請檢查下面的圖片
你可以看到桌子周圍有 8 把椅子我想要的是每當我點擊任何一張桌子時,旋轉應該以這樣一種方式發生,即我點擊的桌子應該取代綠色桌子(底部)
問題是在第一次點擊時,useEffect 中的代碼可以作業,但仍然沒有出現影片。
這是代碼
import {
Animated,
} from 'react-native';
function HomeScreen() {
const [shiftBy, setSiftBy] = React.useState(0);
const [p1InitialPosition] = React.useState(new Animated.ValueXY({ x: 180, y: 30 }));
const [p2InitialPosition] = React.useState(new Animated.ValueXY({ x: 325, y: 125 }));
const [p3InitialPosition] = React.useState(new Animated.ValueXY({ x: 338, y: 230 }));
const [p4InitialPosition] = React.useState(new Animated.ValueXY({ x: 335, y: 370 }));
const [p5InitialPosition] = React.useState(new Animated.ValueXY({ x: 180, y: 470 }));
const [p6InitialPosition] = React.useState(new Animated.ValueXY({ x: 30, y: 370 }));
const [p7InitialPosition] = React.useState(new Animated.ValueXY({ x: 30, y: 230 }));
const [p8InitialPosition] = React.useState(new Animated.ValueXY({ x: 40, y: 125 }));
const chairs = React.useMemo(() => {
return [
p1InitialPosition,
p2InitialPosition,
p3InitialPosition,
p4InitialPosition,
p5InitialPosition,
p6InitialPosition,
p7InitialPosition,
p8InitialPosition,
];
}, [
p1InitialPosition,
p2InitialPosition,
p3InitialPosition,
p4InitialPosition,
p5InitialPosition,
p6InitialPosition,
p7InitialPosition,
p8InitialPosition,
]);
// updated/animated positions
React.useEffect(() => {
const np = [];
for (let i = 0; i < chairs.length; i ) {
console.log(chairs[i], chairs[(i shiftBy) % 8]);
np.push(
Animated.timing(chairs[i], {
toValue: chairs[(i shiftBy) % 8],
duration: 800,
useNativeDriver: true,
}),
);
}
Animated.parallel(np).start();
console.log('');
}, [shiftBy]);
return (
<SafeAreaView style={styles.container}>
<Image
onLayout={event => {
const layout = event.nativeEvent.layout;
console.log('height:', layout.height);
console.log('width:', layout.width);
console.log('x:', layout.x);
console.log('y:', layout.y);
}}
source={require('../../assets/image/table/table.png')}
style={{
height: '100%',
width: '100%',
}}
/>
{/* p1 */}
<Animated.View
style={{
position: 'absolute',
transform: [{ translateX: p1InitialPosition.x }, { translateY: p1InitialPosition.y }],
}}>
<TouchableOpacity
// disabled={selectedChair}
onPress={() => setSiftBy(4)}>
<Icon name="chair" size={30} color="blue" />
</TouchableOpacity>
</Animated.View>
{/* p2 */}
<Animated.View
style={{
position: 'absolute',
transform: [{ translateX: p2InitialPosition.x }, { translateY: p2InitialPosition.y }],
}}>
<TouchableOpacity
// disabled={selectedChair}
onPress={() => setSiftBy(3)}>
<Icon name="chair" size={30} color="skyblue" />
</TouchableOpacity>
</Animated.View>
{/* p3 */}
{/* p4 */}
{/* p5 */}
{/* p6 */}
{/* p7 */}
{/* p8 */}
</SafeAreaView>
);
}
export default HomeScreen;
這是完成screen-snack.expo.dev/sd7yF5CzZ代碼的鏈接
請幫忙。
uj5u.com熱心網友回復:
解決方案是添加useLayoutEffect您的代碼:
React.useLayoutEffect(() => {
const np = [];
for (let i = 0; i < chairs.length; i ) {
console.log(chairs[i], chairs[(i shiftBy) % 8]);
np.push(
Animated.timing(chairs[i], {
toValue: chairs[(i shiftBy) % 8],
duration: 800,
useNativeDriver: true,
}),
);
}
Animated.parallel(np).start();
console.log('');
}, [shiftBy]);
解釋
由于useEffect回呼是在渲染提交階段之后呼叫的,因此是在渲染周期之后呼叫的,并且LayoutAnimation.configureNext旨在“準備”下一次渲染,因此在useEffect.
所以解決方案是使用useLayoutEffectwithuseEffect以確保影片將在第一次渲染時運行
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/453188.html
