Удалить элемент по ключу, Firebase React Native - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть простое приложение Notes React Native, и я могу добавлять и получать к нему данные, но я не уверен, как удалять / обновлять данные.Основная проблема заключается в получении части, где я сообщаю Firebase, какие данные удалить.Как я могу передать ключ firebase в функцию «delete», которая принимает ключ в качестве параметра и удаляет его из firebase.Я абсолютный новичок в React Native, мой код следующий:

export default class App extends React.Component {
  constructor(props) {
  super(props);
  this.state = {
    all_notitas: [],
    notita_text: ''
  };
};

componentWillMount() {
  const notitasRef = firebase.database().ref('notitas');
  this.listenForNotitas(notitasRef);
};

listenForNotitas = (notitasRef) => {
  notitasRef.on('value', (dataSnapshot) => {
    var aux = [];
    dataSnapshot.forEach((child) => {
      aux.push({
        date: child.val().date,
        notita: child.val().notita
      });
    });
    this.setState({all_notitas: aux});
  });
};  // listenForNotitas

render() {
  let show_notitas = this.state.all_notitas.map((val, key) => {
    return (
      <Notita
        key={key}
        keyval={key}
        val={val}
        eventDeleteNotita={()=>this.deleteNotita(key)}> // I THINK THIS IS THE PROBLEM
      </Notita>
    );
  });

  return (
    <View style={styles.container}>

      <View style={styles.header}>
        <Text style={styles.headerText}>NOTITAS</Text>
      </View>

      <ScrollView style={styles.scrollContainer}>
        {show_notitas}
      </ScrollView>

      <View style={styles.footer}>
        <TouchableOpacity
          style={styles.addButton}
          onPress={this.addNotita.bind(this)}>
          <Text style={styles.addButtonText}>+</Text>
        </TouchableOpacity>

        <TextInput
          style={styles.textInput}
          placeholder='>>> Escribir notita'
          placeholderTextColor='white'
          underlineColorAndroid='transparent'
          onChangeText={(notita_text) => (this.setState({notita_text}))}
          value={this.state.notita_text}>

        </TextInput>
      </View>

    </View>
  );
}

addNotita() {
  if (this.state.notita_text) {
    var d = new Date();
    dataForPush = {
      'date': d.getDate() + '-' +  d.getMonth() + '-' + d.getFullYear(),
      'notita': this.state.notita_text
    };
    firebase.database().ref('notitas').push(dataForPush);
    this.state.all_notitas.push(dataForPush);
    this.setState(
      {
        all_notitas: this.state.all_notitas,
        notita_text: '',  // Limpiar input
      }
    )
  }  // end if
}  // addNotita

Когда я выполняю 'console.log (key)', он возвращает int, например, 0, 1, 2 и т. Д.Он должен вернуть ключ firebase, например, '-LRtghw8CjMsftSAXMUg'.Я не знаю, что я делаю неправильно и как это исправить.

deleteNotita(key) {
  firebase.database().ref('notitas').child('' + key).remove()

  /*
  let updates = {};
  console.log(key);
  console.log(updates['/notitas/' + key]);
  updates['/notitas/' + key] = null;
  firebase.database().ref().update(updates); */

  this.state.all_notitas.splice(key, 1);
  this.setState({all_notitas: this.state.all_notitas});
} // deleteNotita

}

1 Ответ

0 голосов
/ 22 ноября 2018

Вы удаляете ключ из Firebase, когда добавляете заметки в aux.Решение также заключается в том, чтобы сохранить ключ от Firebase там:

notitasRef.on('value', (dataSnapshot) => {
  var aux = [];
  dataSnapshot.forEach((child) => {
    aux.push({
      date: child.val().date,
      notita: child.val().notita,
      id: child.key
    });
  });
  this.setState({all_notitas: aux});
}

и затем передать это значение deleteNotita с помощью:

this.deleteNotita(val.id)
...