【发布时间】:2016-09-30 17:40:47
【问题描述】:
我正在尝试将一组问题和相关选项推送到名为“测验”的 Firebase 参考。单击提交时,我在控制台中得到以下信息。
Uncaught Error: Firebase.push failed: first argument contains an invalid key ($$typeof) in property 'quizzes.questions.0'. Keys must be non-empty strings and can't contain ".", "#", "$", "/", "[", or "]"
我不知道($$typeof) 在这里是什么意思,也不知道如何解决这个问题。我将 Option 组件推入 Question 组件数组 [ ],然后将 question 组件推入 QuizBuilderForm 数组 [ ]。
谢谢!
这是我的代码
// Quiz Builder Component
import React from 'react';
import Question from './Question';
import firebase from 'firebase';
const QuizBuilderForm = React.createClass({
getInitialState: function() {
return {
questions: [],
};
},
addQuestion: function(questions, index) {
index = this.state.questions.length;
questions = this.state.questions;
questions.push(<Question key={index} id={index}/>);
index++;
this.setState({
questions: questions
});
},
componentDidMount: function() {
this.addQuestion();
},
handleSubmit: function(event) {
event.preventDefault();
this.firebaseRef = firebase.database().ref('quizzes');
this.firebaseRef.push({
questions: this.state.questions
});
this.refs.form.reset();
this.setState({
questions: []
});
},
render: function() {
return (
<form className="quiz-form" onSubmit={this.handleSubmit} ref="form">
{this.state.questions}
<button type="button" className="add-question" onClick={this.addQuestion}>Add a question</button>
<button type="submit">Create Quiz</button>
</form>
);
}
});
export default QuizBuilderForm;
// Question Component
import React from 'react';
import Option from './Option';
const Question = React.createClass({
getInitialState: function() {
return {
value: "",
options: []
};
},
handleChange: function(e) {
this.setState({
value: e.target.value
});
},
addOption: function(options, index) {
index = this.state.options.length;
options = this.state.options;
options.push(<Option key={index} id={index} />);
index++;
this.setState({
options: options
});
},
componentDidMount: function() {
this.addOption();
},
render: function() {
return (
<div className="question">
<input type="text" value={this.state.value} onChange={this.handleChange}></input>
{this.state.options}
<button type="button" onClick={this.addOption}>Add another option</button>
</div>
);
}
});
export default Question;
// Options component
import React from 'react';
const Option = React.createClass({
getInitialState: function() {
return {
value: ""
};
},
handleChange: function(e) {
this.setState({
value: e.target.value
});
},
render: function() {
return (
<input type="text" value={this.state.value} placeholder="Enter an answer here" onChange={this.handleChange}></input>
);
}
});
export default Option;
【问题讨论】:
-
尝试在 push() 事件之前记录 this.state.questions 的内容。你会发现这是一个 React 组件,并且包含以 $ 和 $$ 开头的特殊键。 Firebase 键中不允许使用这些字符,因此它被拒绝,如错误所示。您需要将该数据解析为有效的 JSON 和匹配 Firebase 允许架构的键——您将无法像您在此处尝试的那样将 React 对象直接保存到数据库中。查看reactfire 以获得更简单的集成。
-
感谢您的回复。我想我不太确定如何解析数据。我不是很熟悉。我认为我卡住的地方是我正在动态添加输入字段,我不确定获取每个动态添加的输入字段值的好方法,以便我可以将其添加到 Firebase。显然,这是一个静态形式的小菜一碟,只需抓住裁判,但对我来说,动态形式非常具有挑战性。那里有什么建议吗?谢谢!
标签: reactjs firebase firebase-realtime-database