Не удается получить массив объектов из firebase с помощью reactjs

#javascript #reactjs #firebase #firebase-realtime-database

#javascript #reactjs #firebase #firebase-realtime-database

Вопрос:

Я разрабатываю приложение cart, и мои товары хранятся в базе данных firebase. При извлечении данных я получаю каждый продукт отдельно в виде массива. Здесь я использую Context API. Ниже приведен код.

 class ProductProvider extends Component {
  state = {
    products: []
  };

  componentDidMount() {
    this.setProducts();
  }

  setProducts() {
    let products = [];
    let product = firebaseConfig.database().ref("dataJson");
    product.on("child_added", snap => {
      products = snap.val()   
      this.setState(
        () => {
          return { products };
        }
         , () => console.log(this.state)
      );
    });
  }

  render() {
    return (
      <ProductContext.Provider
        value={{
          ...this.state
        }}
      >
        {this.props.children}
      </ProductContext.Provider>
    );
  }
}

const ProductConsumer = ProductContext.Consumer;

export { ProductProvider, ProductConsumer };
  

введите описание изображения здесь

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

1. Не могли бы вы подробнее рассказать о том, что не работает должным образом, и как бы вы хотели, чтобы это работало?

2. Я хочу, чтобы мои продукты были массивом объектов.

3. И что происходит в данный момент? Ваш вопрос не очень ясен.

4. {products:{…}} {products:{…}} {products:{…}} {products:{…}} {products:{… }} Я получаю подобное в console.log (this.state

5. у каждого {products:{…}} есть один продукт

Ответ №1:

Попробуйте перенести ваше значение для каждой записи в вашей базе данных в массив products следующим образом:

 setProducts() {
  let product = firebaseConfig.database().ref("dataJson");

  product.on("child_added", snap => {
    let products = [];
    products.push(snap.val());
    this.setState({ products });
  });
}
  

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

1. в console.log (this.state.products) я получаю 8 массивов объектов, в каждом из которых есть все 8 продуктов

2. Что именно содержит one snap.val()? (Не работает с firebase.) Похоже, snap.val() уже содержит все объекты. В этом случае попробуйте поставить let products = []; перед аргументом this.setState . (Смотрите обновленный код.)