#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