0

i'm new to react development i'm creating 2 tab using Navs and tabs to display data retrieved from api in cards ..i'm trying to restart animation made by framer-motion to the tab content on tab-click but it animate once only, i think the answer is related to component lifecycle at tracking update phase but i'm little overwhelmed..any help ??

import React, { useEffect, useState } from 'react'

import { motion,AnimatePresence } from "framer-motion"
import './AllPlatforms.css'
import axios from 'axios';
import PCTabContent from '../PCTabContent/PCTabContent';


export default function AllPlatforms() {
      let[gamesList,setGamesList] = useState([]);
      //to set animation for active tab
      let [activeClass, setActiveClass] = useState("");

      //function to get active tab
      function getActiveTab(e){
        console.log("tab clicked!!");
        console.log(e.target.id);
        setActiveClass(e.target.id)
      }
      // useEffect(()=>{},[activeClass])
      const itemVariants = {
        hidden: {opacity:0,
                  x:-50,
                },
        visible:(custom)=>({
          opacity:1,
          x:0,
          
          transition:{delay:custom,
          duration:0.5,
          ease: "linear",
          type:"spring"
        }
        })
      }

      useEffect(()=> {
        getAllGames();
      },[activeClass])
      async function getAllGames(){
        let config = {
          headers :{
            'x-rapidapi-host': 'free-to-play-games-database.p.rapidapi.com',
            'x-rapidapi-key': 'b52128808dmsh5826403ec30ac21p1b9548jsnfca5769e0b68'
          }
        }
        
        let {data} = await axios.get(`https://free-to-play-games-database.p.rapidapi.com/api/games?category=flight`,config);
    
        console.log(data);
        setGamesList(data);
      }

  return (
    <div className='allPlatforms'>
      <div className="container">
        <div className="row">
          <div className="col-md">
            <ul className="nav nav-tabs" id="myTab" role="tablist">
              <li className="nav-item" role="presentation">
                <button className="nav-link active" id="pc-tab" data-bs-toggle="tab" data-bs-target="#pc-tab-pane" type="button" role="tab" aria-controls="pc-tab-pane" aria-selected="true" onClick={getActiveTab}>pc</button>
              </li>
              <li className="nav-item" role="presentation">
                <button className="nav-link" id="browser-tab" data-bs-toggle="tab" data-bs-target="#browser-tab-pane" type="button" role="tab" aria-controls="browser-tab-pane" aria-selected="false" onClick={getActiveTab}>browser</button>
              </li>
            </ul>

            <div className="tab-content" id="myTabContent">
                <div className="tab-pane fade show active" id="pc-tab-pane" role="tabpanel" aria-labelledby="pc-tab" tabIndex="0">
                  {/* <PCTabContent list={gamesList} itemVariants={itemVariants}/> */}
                  <div className="row gy-5">
                    {gamesList.map((game,index)=>{
                      return <motion.div className="col-lg-4" key={index} variants={itemVariants} initial="hidden" animate="visible" custom={index +1 * 0.1}
                      >
                      <div className="card mx-2">
                        <img className="card-img-top" src={game.thumbnail} alt=""></img>
                        <div className="card-body">
                        <h5 className="card-title">{game.title}</h5>
                        <p className="card-text">{game.short_description}</p>
                                  </div>
                                </div>
                      </motion.div>
                    })}
                  </div>
                  
                </div>
                <div className="tab-pane fade" id="browser-tab-pane" role="tabpanel" aria-labelledby="browser-tab" tabIndex="0">
                <div className="row gy-5">
                    {gamesList.map((game,index)=>{
                      return <motion.div className="col-lg-4" key={index} variants={itemVariants} initial="hidden" animate="visible" custom={index +1 * 0.1}
                      >
                      <div className="card mx-2">
                        <img className="card-img-top" src={game.thumbnail} alt=""></img>
                        <div className="card-body">
                        <h5 className="card-title">{game.title}</h5>
                        <p className="card-text">{game.short_description}</p>
                                  </div>
                                </div>
                      </motion.div>
                    })}
                  </div>
              </div>
            </div>

          </div>
        </div>
      </div>
      

      

{/* <main role="main" className="container">

<div className="row">
  <div className="col-md">
    <div className="starter-template">
      <ul className="nav nav-tabs" id="myTab" role="tablist">
        <li className="nav-item">
          <a className="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-selected="true">Home</a>
        </li>
        <li className="nav-item">
          <a className="nav-link" id="profile-tab" data-toggle="tab" href="#profile" role="tab" aria-controls="profile" aria-selected="false">Profile</a>
        </li>
        <li className="nav-item">
          <a className="nav-link" id="contact-tab" data-toggle="tab" href="#contact" role="tab" aria-controls="contact" aria-selected="false">Contact</a>
        </li>
      </ul>

      <div className="tab-content" id="myTabContent">

        <div className="tab-pane masonry-container fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
          <h3>Tab 1 Content</h3>
          <div className="card-columns">
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1490261739438-981517eafb2e?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=ab1a1d09d3cdcd618d51691e27adc66e" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1513569536235-bf46baacc948?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=9087de94911f2bff7c66b37b476d9a71" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1512281921271-a5004a8e8e2b?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=c9d71484dab165e928166d3975600e7f" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
          </div>
        </div>

        <div className="tab-pane fade masonry-container" id="profile" role="tabpanel" aria-labelledby="profile-tab">
          <h3>Tab 2 Content</h3>
          <div className="card-group">
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1501743029101-21a00d6a3fb9?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=04fc74cb01d267c20b706d27c2c493e5" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1488740304459-45c4277e7daf?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=49bcc37a7a6a0de2eb984e74d19f472d" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1482066490729-6f26115b60dc?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=3f77fa1436c24f2227c3b69ba66cd088" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
          </div>
        </div>

        <div className="tab-pane fade masonry-container" id="contact" role="tabpanel" aria-labelledby="contact-tab">
          <h3>Tab 3 Content</h3>
          <div className="card-group">
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1433162653888-a571db5ccccf?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=459d195af49a3331fd7815ce743fd4c8" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1494947665470-20322015e3a8?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=e0a403101d9ddf75a0ff3fffdaac3e77" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
            <div className="card">
              <img className="card-img-top" src="https://images.unsplash.com/photo-1507682520764-93440a60e9b5?ixlib=rb-0.3.5&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=400&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ%3D%3D&s=11800f8d2bc199aa310594f9ea4406eb" alt=""></img>
              <div className="card-body">
                <h5 className="card-title">Card title</h5>
                <p className="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
                <p className="card-text"><small className="text-muted">Last updated 3 mins ago</small></p>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

</main> */}

    </div>
  )
}


i'm trying to use useEffect hook and track updates of the gameList but i'm unable to reach my goal

R.cs
  • 13
  • 1
  • 9

0 Answers0