Try the demo here!
- スマホのブラウザ環境で動作すること ✅
- カード下の左にスキップボタン、右にいいね!ボタンを表示する ✅
- スキップボタンをタップしたときはカードが左に流れるアニメーションが実行され、次のカードが表示される ✅
- いいね!ボタンをタップしたときはカードが右に流れるアニメーションが実行され、次のカードが表示される ✅
- すべてのカードを仕分けできたら empty 画面が表示される ✅
- テストを書く ❌
- スワイプでカードを仕分けできる ✅
- カードの下部をタップすると詳細画面が表示される ✅
- API サーバーと連携する ✅
① UI design
② Component
- Phone (写真とボタンを覆うコンポーネント)
- TinderCards (一枚一枚の写真を展開(map)するコンポーネント)
- Card (写真のコンポーネント)
- Botton (ボタンのコンポーネント)
③ 使用予定の Library
- Material-UI - Button の Icon
- react-tinder-card - Swipe 機能
ユーザーが Skip と Like のボタンを交互に押した時、アニメーションが上手くいかなかった。
もしかしたどこか知らないところで、コンポーネントが unmount されて、の exit animation がトリガーされてしまっているかもしれない。
useEffect()を使い, いつ TinderCards コンポーネントが mount、unmount されるかをテストしてみた。
useEffect(() => {
console.log('Mounted');
return () => {
console.log('Unmounted');
};
});
useEffect()のおかげで Skip と Like ボタンを交互に押した時、setSwipeDirection()で swipeDirection の state が変わり、React が TinderCards コンポーネントを rerender をしているのがわかった。要は、以下の状況が起きていた。
-
左のボタンを押した後、右のボタンを押す。
-
setSwipeDirection()が left->right へと state を変更されるので React が TinderCards コンポーネントを rerender する。
-
元々あった TinderCards が unmount されるための exit animation がトリガーされる。この時、の className は left のままのため、左側に流れるアニメーションが実行されてしまう。
なので毎回、カードを取り除いた後、このように setSwipeDirection('')を実行し、swipeDirection をリセットする。 そうすることでまた state が変わり rerender が実行されの className は' 'になる。当然''という名前のアニメショーンは書いていない。結果、left->right と変更した時、同じようにの exit animation がトリガーされるが、の className は''のためアニメーションは実行されずに済むので上手くいく。