javascript - 如何在 React 上读取事件中的 Prop

标签 javascript reactjs firebase

我通过 ReactFirebase 创建聊天系统。
聊天系统的数据由 Firebase RealTimeDatabase 管理。
现在点这里
网址:https://react-chat-b0e8a.firebaseapp.com/
Github: https://github.com/kaibara/React-chat

我正在尝试实现删除按钮,但我不知道如何让子组件event 读取父组件this.props。 作为对此的解决方案,我正在考虑让 this.propsrender 之前读取。 但我不知道该怎么做。 你能在下面的代码中分享这个问题的解决方案吗?

App.js - parenet 组件

import React, { Component } from 'react'
import firebase from 'firebase/app'
import { firebaseApp,firebaseDB } from './firebase/firebase'
import ChatMessage from './components/ChatMessage'

const messagesRef = firebaseDB.ref('messages')

class App extends Component {
  constructor(props) {
    super(props)
    this.state = {
      text : "",
      user_name: "",
      messages: []
    }
  }
  componentWillMount() {
    messagesRef.on('child_added', (snapshot) => {
      const m = snapshot.val()
      let msgs = this.state.messages
      msgs.push({
        'text' : m.text,
        'user_name' : m.user_name,
        'key': snapshot.key
      })
      console.log({msgs})
      this.setState({
        messages : msgs
      })
      console.log(this.state.messages)
    })
  }
  render() {
    return (
      <div className="App">
        <div className="MessageList">
          <h2>メッセージログ</h2>
          {this.state.messages.map((m, i) => {
            return <ChatMessage key={i} messages={m} />
          })}
        </div>
      </div>
    )
  }
}

export default App

ChatMessage.js - 子组件

import React,{Component} from 'react'
import { firebaseDB } from '../firebase/firebase'

const messagesRef = firebaseDB.ref('messages')

class ChatMessage  extends Component {
  onRemoveClick(){
    messagesRef.child(this.props.messages.key).remove()
    // I want to load `this.props.messages.key` here
  }
  render(){
    return(
      <div className="Message">
        <p>{this.props.messages.key}</p>
        <p className="MessageText">{this.props.messages.text}</p>
        <p className="MessageName" style={user}>by&nbsp;{this.props.messages.user_name}</p>
        <button className="MessageRemove" onClick={this.onRemoveClick}>削除</button>
      </div>
    )
  }
}

export default ChatMessage

请把你的知识借给我。
谢谢。

最佳答案

Implement the handler in your parent component and pass the reference down to child component has props

App 组件中实现 onRemoveClick() 并将 `props' 中的处理程序引用传递给 ChatMessage 组件。

应用组件:

 deleteMessageHandler = (key) =>{
    const messages = [...this.state.messages];
    messages = messages.splice(key,1);
    this.setState({messages:messages});
  }

聊天消息:

render() {
    return (
      <div className="App">
        <div className="MessageList">

          {this.state.messages.map((m, i) => {
            return <ChatMessage key={i} messages={m} deleteMessageHandler={this.deleteMessageHandler}/>
          })}
        </div>
      </div>
    )
  }

注意:不要使用 map 的索引有 map 中组件的键,它是一种反模式,它应该是适当的唯一 ID。

关于javascript - 如何在 React 上读取事件中的 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54861345/

相关文章:

firebase - 适用于 Google Drive 的无服务器解决方案观察变化

firebase - 限制返回数据的深度

firebase - Firebase 分析首次报告需要多长时间?

Javascript 倒计时与用户输入

javascript - 无法使用react-form以编程方式设置文本

javascript - client.guilds.cache.size 是否损坏?

javascript - React js 和 flux 用户存储安全

reactjs - 尝试在类里面进行获取

javascript - 使用 Jasmine 在 CoffeeScript 中测试 Backbone.js 时出现类型错误

javascript - 如何在 AngularJS 中使用方法作为过滤器?