Не должно быть никаких условий гонки, поскольку setState()
ставит изменения в очередь при каждом вызове, в этом случае каждый снимок client
, полученный в результате события child_added
, включая существующие client
и новые client
добавлено.
Возможно, проблема в том, что ваш синтаксис для setState()
может меняться / возвращаться this.state.clients
каждый раз.Вместо этого попробуйте использовать spread syntax
...
для добавления client
объектов к this.state.clients
и неизменного обновления / слияния this.state
.
class ClientsTable extends React.Component {
constructor(props) {
super(props);
this.state = {
open: false,
clients: []
};
}
componentWillMount(){
const clientsRef = fire.database().ref('clients').orderByKey().limitToLast(100);
clientsRef.on('child_added', snapshot => {
const client = { ...snapshot.val(), id: snapshot.key };
this.setState({
...this.state,
clients: [...this.state.clients, client]
});
});
}
}
Используя личный проект Firebase, я смог получитькаждый элемент в эквиваленте this.state.clients
и отображать их соответственно в componentDidMount
или componentWillMount
.Если вы хотите, вы можете создать фиктивный проект Firebase с фиктивными данными / структурой, соответствующими вашему реальному проекту, и сгенерировать StackBlitz, если он все еще не работает.
Надеюсь, это поможет!