cari

Rumah  >  Soal Jawab  >  teks badan

Menggunakan pembolehubah yang dimuatkan melalui permintaan API dalam useEffect() dalam bekas React

Pada asasnya, saya mempunyai permintaan API dalam useEffect() supaya ia memuatkan semua "buku nota" sebelum halaman dimuatkan supaya saya boleh memaparkannya.

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

Bagaimana saya boleh menggunakan senarai buku nota ini dalam kod saya supaya saya boleh menggunakannya dalam teg?

Saya seorang pemula dalam React, jadi saya tidak melakukan banyak perkara selain daripada memanggil fungsi dalam useEffect().

Kemas kini: Seperti yang diminta, berikut ialah fungsi teras getAllNotebooks, kes penggunaannya dan fungsi yang dipanggil secara dalaman oleh useEffect():

tarik_repositori_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;
  }

dapatkan_semua_notebook_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;
  }
}

tarik_pembekal

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 hari yang lalu573

membalas semua(1)saya akan balas

  • 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>
    })};

    Semoga ini membantu, jika anda mempunyai sebarang pertanyaan sila jawab.

    balas
    0
  • Batalbalas