Как заказать данные на лету

Я новичок в React Native или Firebase, поэтому я не знаю, как это объяснить, но я понятия не имею, как упорядочить полученные данные из базы данных.

Допустим, у меня есть база данных:

appname
   items
     -some_random_generated_string
       -name: "someString"
       -value: "999"
       -type: 0
     -some_random_generated_string
       -name: "someString"
       -value: "999"
       -type: 0

Я уже пробовал со всеми типами ордеров, а также устанавливал правило .indexOn, но не нашел решения. Также попытался добавить идентификатор, а затем заказать с ним и не пришел к решению.

Я предполагаю, что это доступ к базе данных для получения элементов, поэтому я также попытался упорядочить их в одной строке, но ничего не сработало, кроме ограничения объема данных.

let itemsRef = db.ref('items');

то у меня есть:

componentDidMount() {
    itemsRef.on('value', snapshot => {
      let data = snapshot.val();
      let items = Object.values(data);
      this.setState({ items });
    });
  }

и я добавляю так:

let addItem= (item, value, type) => {
  db.ref('/items').push({
    name: item,
    value: value,
    type: type,
  });
};

В основном, чего я хочу добиться, так это отображать данные в обратном порядке, чем они были добавлены, чтобы последний добавленный был показан вверху.

0
0
30
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это двумя способами.

Сначала просто вызовите .reverse() в текущем массиве. Если вы вызываете метод push для добавления новых элементов, обычно ключ, назначенный каждому дочернему элементу, гарантирует, что они будут храниться в хронологическом порядке. Следовательно, вызов его как таковой должен быть достаточно хорошим:

componentDidMount() {
  itemsRef.on('value', snapshot => {
    let data = snapshot.val();
    let items = Object.values(data);
    items.rerverse();
    this.setState({ items });
  });
}

Хотя я не знаю, гарантирует ли let items = Object.values(data); в каждом браузере, что ваши данные упорядочены, как задумано. Кстати, Object.values() в отличие от Object.keys() не поддерживается во многих старых браузерах, но если вы используете его в ReactNative, то все в порядке.

Если вы хотите быть полностью уверены, что он правильно упорядочен, перепишите его следующим образом:

componentDidMount() {
  itemsRef.on('value', snapshot => {
    let items = [];
    // forEach always send you the children in the right order
    snapshot.forEach(snap => { 
      items.push(snap.val())
    })
    items.rerverse();
    this.setState({ items });
  });
}

Наконец, еще один способ сделать это, если вы не доверяете автоматически сгенерированным идентификаторам firebase, - добавить объекты как таковые:

let addItem = (item, value, type) => {
  db.ref('/items').push({
    name: item,
    value: value,
    type: type,
    timestamp: new Date().getTime()
  });
};

и использовать функцию firebase orderByChild при извлечении данных, используя timestamp в качестве дочернего элемента, а затем .reverse() снова, как мы делали ранее.

Другие вопросы по теме