recherche

Maison  >  Questions et réponses  >  le corps du texte

Utilisation de variables chargées via des requêtes API dans useEffect() dans un conteneur React

En gros, j'ai une requête API dans useEffect() donc elle charge tous les "carnets" avant le chargement de la page afin que je puisse les afficher.

useEffect(() => {
   getIdToken().then((idToken) => {
        const data = getAllNotebooks(idToken);
        const jsonData = JSON.stringify(data, null, 2);
        notebooks = JSON.parse(jsonData) as [Notebook, Withdraw[]][];
   });
}

Comment utiliser cette liste de notebooks dans mon code pour pouvoir l'utiliser dans des balises ?

Je suis débutant en React, donc je n'ai pas fait grand-chose d'autre que d'appeler des fonctions dans useEffect().

Mise à jour : Comme demandé, voici la fonction principale de getAllNotebooks, son cas d'utilisation et la fonction appelée en interne par useEffect() :

withdraw_repository_http

async getAllNotebooks(idToken: string): Promise<[Notebook, Withdraw[]][]> {
    var notebooks: [Notebook, Withdraw[]][] = [[new Notebook({numSerie : '34000', isActive: false}), [new Withdraw({numSerie : '34000', email: 'erro@maua.br', withdrawTime: Date.now(), finishTime: null})]]];
    try {
      const url = process.env.NEXT_PUBLIC_API_URL + '/get-all-notebooks';
      const { data, status} = await axios.get<[Notebook, Withdraw[]][]>(url, {headers : {'Authorization' : `Bearer ${idToken}'`}});
      console.log('response status is', status);
      if (status === 200) {
          // console.log('response data is', data);
          const jsondata = JSON.stringify(data, null, 2);
          notebooks = JSON.parse(jsondata).notebooks as [Notebook, Withdraw[]][];
          console.log('notebooks is', notebooks);
          return notebooks;
      }
      else {
          console.log('response data is', data);
      }
    }
    catch (error) {
      if (axios.isAxiosError(error)) {
          console.log('error response is', error);
  } else {
          console.log('unknown error');
          console.log(error);
          
      }
    }
    return notebooks;
  }

get_all_notebooks_usecase

import { IWithdrawRepository } from '../domain/repositories/withdraw_repository_interface';

export class GetAllNotebooksUsecase {
  constructor(private withdrawRepo: IWithdrawRepository) {}

  async execute(idToken: string) {
    const withdraws = await this.withdrawRepo.getAllNotebooks(idToken);
    return withdraws;
  }
}

withdraw_provider

async function getAllNotebooks(idToken: string){
    try {
      const notebooks = await getAllNotebooksUsecase.execute(idToken);
      setNotebooks(notebooks);
      return notebooks;
    }
    catch (error: any) {
      console.log(`ERROR PROVIDER: ${error}`);
      const setError = error;
      setError(setError);
      return [];
    }
  }

P粉663883862P粉663883862441 Il y a quelques jours574

répondre à tous(1)je répondrai

  • P粉311089279

    P粉3110892792023-09-16 00:47:40

    const [notebooks, setNotebooks] = useState([]); // initialize notebooks with empty array
    
    useEffect(() => {
       getIdToken().then((idToken) => {
          const data = getAllNotebooks(idToken);
           // I think you don't need this line
           // const jsonData = JSON.stringify(data, null, 2);
    
          setNotebooks(data);
       });
    },[]); // empty brackets here means: useEffect executes only once on load component
    
    // render notebooks using JSX (xml inside javascript)
    return {notebooks.map((notebook, index) => {
        <div>
           <h1>My notebook number {index}</h1>
           <h3>This noteboot's name is: {notebook.name}</h3>
           etc..
        </div>
    })};

    J'espère que cela vous aidera, si vous avez des questions, n'hésitez pas à y répondre.

    répondre
    0
  • Annulerrépondre