react-native-design について
React Nativeでモバイルアプリを開発する人向けのガイドです。スタイル、ナビゲーション、アニメーション、プラットフォーム別レイアウトに加え、性能改善や問題解決の指針を扱います。
主な機能
- 01React Navigationのパターン
- 02Reanimated 3のアニメーション指針
- 03StyleSheetとstyled-componentsによるスタイル
- 04レスポンシブ・プラットフォーム別レイアウト
- 05ジェスチャー操作の指針
- 06性能改善と問題解決の助言
活用シーン
- 01クロスプラットフォームのReact Nativeアプリ開発
- 02型付きナビゲーションフローの追加
- 03高性能なアニメーションとジェスチャーの作成
- 04レイアウトや性能の問題調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ wshobson/ agents --skill react-native-designインストール後、Claude Code で/react-native-designを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/details.mdnavigation-patterns.mdreanimated-patterns.mdstyling-patterns.md詳細
React Native Design
React Native のスタイリングパターン、React Navigation、Reanimated 3 をマスターして、ネイティブ品質のユーザー体験を備えた高性能なクロスプラットフォームモバイルアプリケーションを構築しましょう。
このスキルを使用する場面
- React Native でクロスプラットフォームモバイルアプリを構築する場合
- React Navigation 6+ でナビゲーションを実装する場合
- Reanimated 3 で高性能なアニメーションを作成する場合
- StyleSheet と styled-components でコンポーネントをスタイリングする場合
- さまざまな画面サイズに対応するレスポンシブレイアウトを構築する場合
- プラットフォーム固有のデザイン(iOS/Android)を実装する場合
- Gesture Handler でジェスチャー駆動のインタラクションを作成する場合
- React Native のパフォーマンスを最適化する場合
詳細セクション: コアコンセプト
もともとこの SKILL.md にあった 6471 バイトのセクションです。Codex のスキル本文 8 KB の上限に収めるため、references/details.md に移動しました。
クイックスタートコンポーネント
import React from 'react';
import {
View,
Text,
StyleSheet,
Pressable,
Image,
} from 'react-native';
import Animated, {
useSharedValue,
useAnimatedStyle,
withSpring,
} from 'react-native-reanimated';
interface ItemCardProps {
title: string;
subtitle: string;
imageUrl: string;
onPress: () => void;
}
const AnimatedPressable = Animated.createAnimatedComponent(Pressable);
export function ItemCard({ title, subtitle, imageUrl, onPress }: ItemCardProps) {
const scale = useSharedValue(1);
const animatedStyle = useAnimatedStyle(() => ({
transform: [{ scale: scale.value }],
}));
return (
<AnimatedPressable
style={[styles.card, animatedStyle]}
onPress={onPress}
onPressIn={() => { scale.value = withSpring(0.97); }}
onPressOut={() => { scale.value = withSpring(1); }}
>
<Image source={{ uri: imageUrl }} style={styles.image} />
<View style={styles.content}>
<Text style={styles.title} numberOfLines={1}>
{title}
</Text>
<Text style={styles.subtitle} numberOfLines={2}>
{subtitle}
</Text>
</View>
</AnimatedPressable>
);
}
const styles = StyleSheet.create({
card: {
backgroundColor: '#ffffff',
borderRadius: 16,
overflow: 'hidden',
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowOpacity: 0.1,
shadowRadius: 8,
elevation: 4,
},
image: {
width: '100%',
height: 160,
backgroundColor: '#f3f4f6',
},
content: {
padding: 16,
gap: 4,
},
title: {
fontSize: 18,
fontWeight: '600',
color: '#1f2937',
},
subtitle: {
fontSize: 14,
color: '#6b7280',
lineHeight: 20,
},
});
ベストプラクティス
- TypeScript を使用する: 型安全性のためにナビゲーションと props の型を定義します
- コンポーネントをメモ化する:
React.memoとuseCallbackを使用して不要な再レンダリングを防ぎます - UI スレッドでアニメーションを実行する: 60fps のアニメーションには Reanimated のワークレットを使用します
- インラインスタイルを避ける: パフォーマンスのために StyleSheet.create を使用します
- セーフエリアを処理する:
SafeAreaViewまたはuseSafeAreaInsetsを使用します - 実機でテストする: シミュレーター/エミュレーターのパフォーマンスは実機とは異なります
- リストには FlatList を使用する: 長いリストで ScrollView と map を決して使用しないでください
- プラットフォーム固有のコード: iOS/Android の違いには Platform.select を使用します
よくある問題
- ジェスチャーの競合: ジェスチャーを
GestureDetectorでラップし、simultaneousHandlersを使用します - ナビゲーションの型エラー: すべてのナビゲーターに
ParamList型を定義します - アニメーションのカクつき:
runOnUIワークレットでアニメーションを UI スレッドに移動します - メモリリーク: useEffect でアニメーションをキャンセルしクリーンアップします
- フォントの読み込み: カスタムフォントには
expo-fontまたはreact-native-assetを使用します - セーフエリアの問題: ノッチのあるデバイス(iPhone、切り欠きのある Android)でテストします
コメント
Markdown 対応