删除功能不起作用,也没有错误出现

问题描述

早上好,所以我有一个关于firebase的问题,也许还有我的代码,我用JSX和React编写了一些与Firebase链接代码,而我要删除的Button无法正常工作。

我正在使用“亲子”道具将功能传递到需要删除页面中,但是没有功能。我需要帮助,谢谢!

这是函数所在的父级:

import React from 'react';
import fire from '../config/firebase';
import Modal from 'react-modal';
// import "firebase/database";
// import 'firebase/auth';

import NotesCard from './note-card';

Modal.setAppElement('#root');


export default class Notes extends React.Component {
  _isMounted = false;
  
  constructor(props) {
    super(props);
    
    this.state = {
      notes: [],showModal: false,loggedin: false
    };
    this.handleOpenModal = this.handleOpenModal.bind(this);
    this.handleCloseModal = this.handleCloseModal.bind(this);
    this.handleAddNote = this.handleAddNote.bind(this);
    this.handleRemoveNote = this.handleRemoveNote.bind(this);

  }
  
  componentDidMount() {
    this._isMounted = true;

    fire.auth().onAuthStateChanged((user) => {
      if(user){
        // call firebase from import fire 
        // grab userData and push it to the dataArray
        fire.database().ref(`users/${user.uid}/notes`).on('value',(res) => {
          const userData = res.val()
          const dataArray = []
          for(let objKey in userData) {
            userData[objKey].key = objKey
            dataArray.push(userData[objKey])
          }
          // set in the state 
          if(this._isMounted){
            this.setState({
            notes: dataArray,loggedin: true
            })
          }
        });
      }else {
        this.setState({loggedin: false})

      }
    });
  };

  componentwillUnmount() {
    this._isMounted = false;
  }

  handleAddNote (e) {
    e.preventDefault()

    const note = {
      title: this.noteTitle.value,text: this.noteText.value
    }
    // reference where we can push it
    const userId = fire.auth().currentUser.uid;
    const dbRef = fire.database().ref(`users/${userId}/notes`);
    dbRef.push(note)

    this.noteTitle.value = ''
    this.noteText.value = ''
    this.handleCloseModal()
  }

  handleRemoveNote(key) {
    const userId = fire.auth().currentUser.uid;
    const dbRef = fire.database().ref(`users/${userId}/notes/${key}`);
    dbRef.remove();
  }

  handleOpenModal (e) {
    e.preventDefault();
    this.setState({
      showModal: true
    });
  }

  handleCloseModal () {
    this.setState({
      showModal: false
    });
  }



  render() {
    return (
      <div>
        <button onClick={this.handleOpenModal}>create Note</button>
        <section className='notes'>
          {
            this.state.notes.map((note,indx) => {
              return (
                <NotesCard 
                  note={note} 
                  key={`note-${indx}`} 
                  handleRemoveNote={this.handleRemoveNote}
                /> 
              )
            }).reverse()
          }
        </section>
        <Modal
        isOpen={this.state.showModal}
        onRequestClose={this.handleCloseModal}
        shouldCloSEOnOverlayClick={false}
        style={
          {
            overlay: {
              backgroundColor: '#9494b8'
            },content: {
              color: '#669999'
            }
          }
        }
        >
          <form onSubmit={this.handleAddNote}>
            <h3>Add New Note</h3>
            <label htmlFor='note-title'>Title:</label>
            <input type='text' name='note-title' ref={ref => this.noteTitle = ref} />
            <label htmlFor='note-text'>Note</label>
            <textarea name='note-text' ref={ref => this.noteText = ref} placeholder='type notes here...' />
            <input type='submit' onClick={this.handleAddNote} />
            <button onClick={this.handleCloseModal}>close</button>
          </form>
        </Modal>
      </div>
    )
  }
}

这就是调用函数的地方:

import React from 'react';
import fire from '../config/firebase';

export default class NotesCard extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      editing: false,note: {}
    }
    this.handleEditNote = this.handleEditNote.bind(this);
    this.handleSaveNote = this.handleSaveNote.bind(this);
  }

  handleEditNote() {
    this.setState({
      editing: true
    })
  }

  handleSaveNote(e) {
    e.preventDefault()
    const userId = fire.auth().currentUser.uid;
    const dbRef = fire.database().ref(`users/${userId}/notes/${this.props.note.key}`);
    dbRef.update({
      title: this.noteTitle.value,text: this.noteText.value
    })
    this.setState({
      editing: false
    })
  }

  render() {
    let editingTemp = (
      <span>
        <h4>{this.props.note.title}</h4>
        <p>{this.props.note.text}</p>
      </span>
    )
    if(this.state.editing) {
      editingTemp = (
        <form onSubmit={this.handleSaveNote}>
          <div>
            <input 
              type='text' 
              defaultValue={this.props.note.title} 
              name='title' 
              ref={ref => this.noteTitle = ref}
            />
          </div>
          <div>
            <input 
              type='text' 
              defaultValue={this.props.note.text} 
              name='text' 
              ref ={ref => this.noteText = ref}
            />
          </div>
          <input type='submit' value='done editing' />
        </form>
      )

    }
    
    return (
      <div>
        <button onClick={this.handleEditNote}>edit</button>
        <button onClick={this.props.handleRemoveNote(this.state.note.key)}>delete</button>
        {editingTemp}
      </div>
    )
  }
} 

预先感谢您阅读此代码

解决方法

第二次迭代答案

工作沙箱

Edit condescending-night-8jkrj

问题

看着https://codesandbox.io/s/trusting-knuth-2og8e?file=/src/components/note-card.js:1621-1708

我看到你有这行

您的state.note在构造函数中声明为空映射

 this.state = {
   editing: false,note: {}
}

但从未在组件中使用this.setState分配值

解决方案

将其更改为:

<button onClick={()=> this.props.handleRemoveNote(**this.props.note.key**)}>delete</button>

第一次迭代答案

NotesCard的按钮在渲染时触发onClick回调,而在click事件时触发。
这是因为您执行了该函数,而不是将回调传递给onClick处理程序

更改

<button onClick={this.props.handleRemoveNote(this.state.note.key)}>delete</button>

收件人

<button onClick={()=> this.props.handleRemoveNote(this.state.note.key)}>delete</button>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...