【发布时间】:2021-08-21 19:53:25
【问题描述】:
我正在练习使用 firebase API 创建书店列表
我尝试添加包含每个标题信息的书籍,但失败了,原因是(props.addBook 不是函数)。
谁能找到原因并向我解释一下?
另外,我想知道前端开发人员应该准备什么样的投资组合,在linkedin上,他们说 他们期望
熟悉前端技能(React/Redux/RESTApi/Html/Css 等)
我不明白经验水平应该是什么样的......
下面有两个js文件显示了我的代码 一个用于 AddBook.js / 另一个用于 App.js
谢谢你:) 这是 AddBook.js
import TextField from '@material-ui/core/TextField';
import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import DialogTitle from '@material-ui/core/DialogTitle';
import React, { useState } from 'react';
function AddBook(props) {
const [open, setOpen] = useState(false);
const [book, setBook] = useState({title:'', author:'', year:'', isbn:'', price:''})
const handleOpen = () => {
setOpen(true);
}
const handleClose = () => {
setOpen(false);
}
const handleSave = () => {
props.addBook(book);
handleClose()
}
const inputChanged = (event) => {
setBook({...book, [event.target.name]: event.target.value})
}
return(
<div>
<Button variant="outlined" color="primary" onClick={handleOpen}>
Add Book
</Button>
<Dialog open={open}>
<DialogTitle>New Book</DialogTitle>
<DialogContent>
<TextField
name="title"
value={book.title}
onChange={inputChanged}
margin="dense"
label="Title"
fullWidth
/>
<TextField
name="author"
value={book.author}
onChange={inputChanged}
margin="dense"
label="Author"
fullWidth
/>
<TextField
name="year"
value={book.year}
onChange={inputChanged}
margin="dense"
label="Year"
fullWidth
/>
<TextField
name="isbn"
value={book.isbn}
onChange={inputChanged}
margin="dense"
label="isbn"
fullWidth
/>
<TextField
name="price"
value={book.price}
onChange={inputChanged}
margin="dense"
label="Price"
fullWidth
/>
</DialogContent>
<DialogActions>
<Button color="primary" onClick={handleClose}>Cancel</Button>
<Button color="primary" onClick={handleSave}>Save</Button>
</DialogActions>
</Dialog>
</div>
);
}
export default AddBook;
// This is App.js below
import React, { useState, useEffect } from 'react';
import { AgGridColumn, AgGridReact } from 'ag-grid-react';
import AppBar from '@material-ui/core/AppBar';
import Toolbar from '@material-ui/core/Toolbar';
import Typography from '@material-ui/core/Typography';
import IconButton from '@material-ui/core/IconButton';
import DeleteIcon from '@material-ui/icons/Delete';
import AddBook from './AddBook';
import './App.css';
import 'ag-grid-community/dist/styles/ag-grid.css';
import 'ag-grid-community/dist/styles/ag-theme-material.css';
function App() {
const [books, setBooks] = useState([]);
useEffect(() => {
fetchItems();
}, [])
const fetchItems = () => {
fetch('https://bookstore-4ad5c-default-rtdb.firebaseio.com/books/.json')
.then(response => response.json())
.then(data => addKeys(data))
.catch(err => console.error(err))
}
const addBook = (newBook) => {
fetch('https://bookstore-4ad5c-default-rtdb.firebaseio.com/books/.json',
{
method: 'POST',
body: JSON.stringify(newBook)
})
.then(response => fetchItems())
.catch(err => console.error(err))
}
const deleteBook = (id) => {
fetch(`https://todolist-994d4-default-rtdb.firebaseio.com/items/${id}.json`,
{
method: 'DELETE',
})
.then(response => fetchItems())
.catch(err => console.error(err))
}
const addKeys = (data) => {
const keys = Object.keys(data);
const valueKeys = Object.values(data).map((books, index) =>
Object.defineProperty(books, 'id', {value: keys[index]}));
setBooks(valueKeys)
}
return (
<div className="App">
<AppBar position="static">
<Toolbar>
<Typography variant="h4" noWrap>
Bookstore
</Typography>
</Toolbar>
</AppBar>
<AddBook AddBook={addBook} />
<div className="ag-theme-material" style={ { height: 400, width: 1400, margin: 'auto' } }>
<AgGridReact rowData={books}>
<AgGridColumn sortable={true} filter={true} field='title' />
<AgGridColumn sortable={true} filter={true} field='author' />
<AgGridColumn sortable={true} filter={true} field='year' />
<AgGridColumn sortable={true} filter={true} field='isbn' />
<AgGridColumn sortable={true} filter={true} field='price' />
<AgGridColumn
headerName=''
field='id'
width={90}
cellRendererFramework={ params =>
<IconButton onClick={() => deleteBook(params.value)} size="small" color="secondary">
<DeleteIcon />
</IconButton>
}
/>
</AgGridReact>
</div>
</div>
);
}
export default App;
[在此处输入图片描述][1] [1]:https://i.stack.imgur.com/31grH.png
【问题讨论】:
标签: reactjs firebase api react-hooks