React не отображает массив после извлечения данных

#reactjs #typescript

Вопрос:

 class MyAttendees extends React.Component {
  static contextType = AuthContext;

  constructor(props){
    super(props);

    this.state = {
      barcodesData: []
    }
  }

  componentDidMount() {
    this.fetchBarcodeData() 
  }

  fetchBarcodeData() {
    const { currentUser, GetBarcodesByUser } = this.context; // getting current user logged in and a function
    const uid = currentUser.uid; // uid of the user
    GetBarcodesByUser(uid) // this will return a array of string containing barcodes id
             .then( data => this.setState({ barcodesData: data }))
  }

  // force rerender
  forceUpdater() {
    this.forceUpdate();
  }

  render() {
    return (
    <div>
          {
            // trying to render the array list 
            // this is not rerendering even after the barcodes is updated
            this.state.barcodesData.map((item) => {
              console.log("item: ", item)
              return <h1 key={item}>{item}</h1>
            })
          }
    </div>
    )
  }
}
export default MyAttendees;

 
     const GetBarcodesByUser = async ( uid: string ): string[] => {
        const data = await getBarcodesByUser(uid);
        return data;
    }
 
  export const getBarcodesByUser = async ( uid: string ): string[] => {
  const result = [];

  const q = query(collection(firestore, "qrcode"), where("uid", "==", uid));
  onSnapshot(q, (querySnapshot): string[] => {
    querySnapshot.forEach( document => {
      result.push( document.id )
    })
  })

  return resu<
}
 

Вещи, которые я пробовал

  • сначала я использовал функциональный подход с useEffect.
  • Я попытался использовать функцию для рендеринга массива.
  • Я попытался использовать функцию выборки внутри функции componentDidMount()
  • Пробовал forceUpdate Любой из вышеперечисленных методов не работает

Комментарии:

1. — экспортировали ли вы класс, поскольку export default MyAttendees ваша функция GetBarcodesByUser действительно разрешает что-либо или отклоняет обещание

2. Можете ли вы поделиться ссылкой на игровую площадку?

3. да, я это сделал. Но забудьте добавить его.

4. Фактически, у AuthContext есть apikeys, поэтому я не могу добавить полный исходный код

5. нет, функция GetBarcodesByUser не возвращает обещание

Ответ №1:

Не 100% это была вся консоль.log итак, я предполагаю, что вы отображаете неправильный бит. Попробуйте изменить свое состояние, чтобы установить его следующим образом

 .then( response => this.setState({ barcodesData: response.data }))
 

Комментарии:

1. массив — это что-то вроде этого barcodes: Array(4) [ "asdfasdfasdfasdfasdfasdfasdfa", "asdfasdfasdfasdf", "yasdfasdfasdfasVz", "zafdsfasdfasdfasdfS" ]

2. @RitikRanjan Не могли бы вы console.log(data) при вызове api и опубликовать это, пожалуйста « .then( data => { this.setState({ barcodesData: data }) console.log(data}) «

3. при выполнении ‘console.log («data: «, data)’ я получаю data: Array [] ​ 0: "NyUadadadsxCR3zgI" ​ 1: "lfOsdasdaqB0neGUSN" ​ 2: "yYasdo8AP1czHEVz" ​ 3: "zG8Lg2yasdasf3xphBfS" ​ length: 4

4. @RitikRanjan только что обновил мой ответ, попробуйте это

5. Для записи: meta.stackexchange.com/q/214173/332043