reactjs - 使用 react/firebase api 创建书店列表
问题描述
我正在练习 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
解决方案
错误在这里:
<AddBook AddBook={addBook} />
您添加了错误的大写 A。它应该是:
<AddBook addBook={addBook} />
推荐阅读
- python - 选择文件成功执行但没有在机器人框架中上传文件
- class - 如何在类中获取类型参数的擦除类型
- laravel - Livewire 是否替换了 Laravel 中的 Vue.js/React.js?
- javascript - 为什么我从两种形式的相同数学表达式 [javascript] 中得到不同的结果?
- python - 组合多个列表以获得给定条件的整数
- python - ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败:无法获取本地颁发者证书 (_ssl.c:1123)
- calculus - 一个连续的、单调的、准凹函数的例子?
- javascript - 在页面加载后启动动画反应
- python - 基于列表项数量的条件?
- java - 如何让我的 Spring Boot 应用程序使用给定的用户名和密码登录到 keycloak?