保存innerHTML数据并将数据输入到Firebase

时间:2019-04-16 08:29:22

标签: reactjs firebase-realtime-database

我有此代码,要将数据保存到Firebase。我希望能够将选定的会议以及表单中的输入保存到Firebase。我是新来的反应者,现在停留在进一步了解我的代码的过程中,因此我将为我提供一些建议。

This is how my app looks like and with error

我已经选择了Firebase,并且能够上载数据,但是无法将属性中的数据保存为handleClick。

Error when I try to submit form

import './App.css';
import firebase from 'firebase';
const uuid = require('uuid');


class App extends Component {

        constructor(props) {
            super(props);
            // gör strängar av state
            this.state = {
                uid: uuid.v1(),
                meeting:'',
                name:'',
                email:'',
            };

            // binder propertys till click funktion 
            this.handleClick = this.handleClick.bind(this);
            this.handleChange = this.handleChange.bind(this);
            this.handleSubmit = this.handleSubmit.bind(this);
            this.inputData = this.inputData.bind(this);

            // kopplar databas
            var config = {
                apiKey: "",
                authDomain: "",
                databaseURL: "",
                projectId: "",
                storageBucket: "",
                messagingSenderId: ""
            };
            firebase.initializeApp(config);
            // console.log(firebase);

            // skapar databasen lokalt med referens ref
            var database = firebase.database();
            var ref = database.ref('meeting');

            // variabel data med sträng id
            var data ={
                id: '',
            }
            // Pushar upp data till databas
            ref.push(data);
        }

        // hämtar klick för mötes knappar och skriver ut text i knappar
        handleClick = (e) =>{
            console.log(e.target.innerHTML);
            alert('Du har valt ett möte');
        }

        // hämtar API för olika möten 
        componentDidMount(){
            fetch('http://www.mocky.io/v2/5c9cdca03300004d003f2151')
            .then(res => res.json())
            .then(json => {
                let meetings = []
                json.forEach(meeting => {
                    if(new Date(meeting.startDate).getDay() !== new Date(meeting.endDate).getDay()){
                        let day1 = {
                            activity:meeting.activity,
                            location:meeting.location,
                            startDate:meeting.startDate,
                        }
                        let day2 = {
                            activity:meeting.activity,
                            location:meeting.location,
                            endDate:meeting.endDate,
                        }

                        meetings.push(day1,day2)

                    }else{
                        meetings.push(meeting)
                    }

                });
                console.log(meetings)
                this.setState({
                    isLoaded:true,
                    items: meetings,
                })
            });

            // import firebase och ref sträng
            firebase
            .database()
            .ref(`Newdata/${this.state.uid}`)
            .on('value', snap => console.log('from db', snap.val()));
        }


        // hämtar ny data 
    handleChange(e){
        this.setState({
            name: e.target.name});

    }

    // hämtar ref och skriver ut sträng med set till firebase
    handleSubmit(e){
        alert('Er bokning är bekräftad: ' + this.state.value);
        console.log('Du har bekräftat er bokning')
        e.preventDefault();
        firebase
        .database()
        .ref(`Newdata/${this.state.uid}`)
        .set({
            meeting: this.state.meeting,
            name: this.state.name,
            email: this.state.email,
        })
        .catch(error => console.log(error));
    }

// knyter input text till property
    inputData (_e){
        const meeting = this.refs.meeting1.value;
        const name = this.refs.name1.value;
        const email = this.refs.email1.value;
        this.setState({ meeting, name, email});
    }

  render() {

        var { isLoaded, items } = this.state;

        if (!isLoaded){
            return <div>Loading...</div>;
        }
        else {

    return (
            <>
      <div className="App">
                <div className="AppHeader">
                    <h1>Boka ditt möte nedan</h1>

                </div>
        <ul>

                    {items.map((item,i) => (
                        <li key={i}>

                    {/* kopplar handleClick till onChange*/}
                            <button onClick={(e) => this.handleClick(e)} onChange={this.inputData} ref="meeting1" className="select">
                            {item.activity}<br/>
                            Starttid: {item.startDate}<br/>
                            Sluttid: {item.endDate}<br/> 
                            Plats: {item.location}<br/>
                            </button>
                        </li>
                    ))}

                    </ul>

      </div>

        <div className="selectedMeeting">Fyll i dina uppgifter och bekräfta</div>

                <form onSubmit={this.handleSubmit} className="bookingSection">
                    <label>
                        Name:
                        <input type="text" value={this.state.name} onChange={this.inputData}
                        ref="name1"/>
                    </label>
                    <label>
                        E-mail:
                        <input type="text" value={this.state.email} onChange={this.inputData}
                        ref="email1"/>
                    </label>
                    <input className="confirm" type="submit" value="Bekräfta" />
                </form>
                <div className="viewSelect"></div>
                </>
    );
    }

}
}

export default App;

尝试将会议,名称,电子邮件保存到Firebase时出现错误。

2 个答案:

答案 0 :(得分:2)

默认情况下,只有经过身份验证的用户才能访问该数据库。

'rules': {
  '.read': 'auth != null',
  '.write': 'auth != null'
}

您必须在Firebase console

上定义规则

您可以允许向正在开发的每个人读取或写入数据库,然后在需要时添加更多规则(我建议您熟悉Firebase规则):

'rules': {
  '.read': true,
  '.write': true
}

这应该可以立即解决您的问题。 另外,如果您不熟悉React,建议您学习使用Redux并将其与React Redux Firebase结合使用,这些将与React一起为您提供很多帮助。

答案 1 :(得分:0)

您可以在Stackoverflow answer中找到有关此问题的完整说明。还说明了如何正确处理正确的登录。