【发布时间】:2019-06-09 22:18:10
【问题描述】:
这里的小问题我认为解决起来相对简单,但我无法完全理解。我对 React 很陌生。我决定制作一个小型示例应用程序,它只从两个字段中获取输入,将它们保存到 Firebase 并在页面上输出这些值。它在提交数据和检索数据方面工作得很好,但是当我单击提交按钮将数据添加到 Firebase 时,它似乎复制了存储在状态中的数据并呈现两次:
父组件:
import React, { Component, Fragment } from 'react';
import firebase from '../../config/firebase';
import QuestFormField from './QuestFormField/QuestFormField';
import QuestFormSelection from './QuestFormSelection/QuestFormSelection';
import classes from './QuestForm.css';
class QuestForm extends Component {
state = {
value: '',
points: 0,
items: []
}
questHandler = e => {
this.setState({
value: e.target.value,
});
}
pointsHandler = e => {
this.setState({
points: e.target.value,
});
}
submitHandler = e => {
e.preventDefault();
const itemsRef = firebase.database().ref('quest');
const items = {
quest: this.state.value,
points: this.state.points
}
itemsRef.push(items);
this.setState({
value: '',
points: 0
});
}
render () {
return (
<Fragment>
<form className={classes.Form} onSubmit={this.submitHandler}>
<QuestFormField val='Quest' inputType='text' name='quest' value={this.state.value} changed={this.questHandler} />
<QuestFormField val='Points' inputType='number' name='points' value={this.state.points} changed={this.pointsHandler} />
<button>Away! To Firebase!</button>
</form>
<QuestFormSelection />
</Fragment>
);
}
}
export default QuestForm;
子组件(表单域)
import React from 'react';
import classes from './QuestFormField.css';
const QuestFormField = (props) => (
<div className={classes.Container}>
<label htmlFor={props.name}>{props.val}</label>
<input type={props.inputType} name={props.name} onChange={props.changed}/>
</div>
);
export default QuestFormField;
子组件 B(数据检索器/显示器)
import React, { Component, Fragment } from 'react';
import firebase from '../../../config/firebase';
import classes from './QuestFormSelection.css';
class QuestFormSelection extends Component {
state = {
quests: []
}
componentDidMount() {
const database = firebase.database();
const quests = [];
database.ref('quest').on('value', (snapshot) => {
snapshot.forEach((childSnapshot) => {
quests.push({
id: childSnapshot.key,
quest: childSnapshot.val().quest,
points: childSnapshot.val().points,
});
});
console.log(quests);
this.setState(() => {
return {
quests: quests
}
});
console.log(this.state.quests);
});
}
render () {
return (
<section className='display-item'>
<div className="wrapper">
{this.state.quests.map(quest => (
<div key={quest.key}>
<p>{quest.quest}</p>
<p>{quest.points}</p>
</div>
))}
</div>
</section>
)
}
}
export default QuestFormSelection;
此处的行为示例:
https://i.gyazo.com/c70972f8b260838b1673d360d1bec9cc.mp4
任何指针都会有所帮助:)
【问题讨论】:
-
QuestFormSelection组件中的控制台日志显示什么? -
@Treycos 最初,只是存储在 Firebase 中的数据:i.gyazo.com/72d807b3d4ecb70cf72896ad221c3f64.png 但是单击提交按钮会复制状态:i.gyazo.com/e552a1d30679c9691eb85e0e42a430ce.png
标签: javascript reactjs firebase state