Reactを使用してToDoリストアプリを作成しています。 Firebaseデータベースにデータを保存できます。ただし、これらのデータを取得してJSXに配置する方法がわかりません。コンソールで印刷できます。現在、バーに入力してEnterキーを押すだけで、ToDoリストが出力されます。
これが私のコードです。ちょっと面倒です。
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import firebase from 'firebase';
var config = {
apiKey: "**********************",
authDomain: "react-to-do-list-a8f6d.firebaseapp.com",
databaseURL: "https://react-to-do-list-a8f6d.firebaseio.com",
projectId: "react-to-do-list-a8f6d",
storageBucket: "react-to-do-list-a8f6d.appspot.com",
messagingSenderId: "673689778313"
};
firebase.initializeApp(config);
const database = firebase.database();
const ref = database.ref('todos');
// const todos = []
class Index extends React.Component {
constructor(props) {
super(props)
this.state = {
todo: '',
todos: [],
// database:
}
this.handleInput = this.handleInput.bind(this)
this.addTask = this.addTask.bind(this)
this.check = this.check.bind(this)
}
handleInput(e) {
this.setState({
todo: e.target.value
})
}
addTask(e) {
if (e.keyCode === 13) {
this.setState({
todos: this.state.todos.concat(this.state.todo)
})
e.target.value = ''
ref.Push(this.state.todo)
}
}
check(e) {
if (e.target.style.textDecoration === "") {
e.target.style.textDecoration = " line-through"
} else {
e.target.style.textDecoration = ""
}
}
render() {
ref.on('value', gotData, errData)
function gotData(data) {
let todos = data.val()
// console.log(todos)
let keys = Object.keys(todos)
// console.log(keys)
for (let i = 0; i < keys.length; i++) {
let key = keys[i]
let todo = todos[key]
console.log(todo)
}
}
function errData(err) {
console.log('Error !')
console.log(err)
}
return (
<div className='container'>
<h1>To Do List</h1>
<input value={this.state.term} onKeyDown={this.addTask} onChange={this.handleInput} placeholder=" Add your tasks here"></input>
<ul>
{this.state.todos.map(x => {
return (
<li>
<input type="checkbox" id={x} name={x} value={x} />
<label for={x}>{x}</label>
</li>
)
})}
</ul>
</div>
)
}
}
ReactDOM.render(<Index />, document.getElementById('root'));
FirebaseデータベースはリアルタイムDBであるため、データの場所への参照を提供し、参照のデータが変更されるたびにトリガーできるので、特定の参照でデータのスナップショットをキャプチャできます。
参照でデータを取得するためにfirebase.database().ref().on('value')
メソッドを使用することはほぼ正しいです。
次のようなコールバックをさらに追加できます。
firebase
.database()
.ref(
firebase_basepath + `${tenantId}/${userId}/task/product/${referenceId}`
)
.on("value", snapshot => {
console.log("FireB ",snapshot)
if (snapshot && snapshot.exists()) {
//Set values in state which can be extracted in jsx in render.
}})
状態が変化すると、関数が再レンダリングされ、jsxで値を設定できます。