我正在用React和Express创建我的第一个Crud应用程序,但是我无法创建从SQL Cosulta接收到的动态表。
错误是:props.datos.map不是函数。
我不知道自己是否做得正确,或者是否使用了不良做法。
我看到了,这可能是因为调用是异步的,也是由于这个原因。
我必须更改组件的状态,而不要传递道具的数据。
Express js:
const express = require('express');
const app = express();
var mysql = require('mysql');
const port = process.env.PORT || 5000;
var connection = mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'shells'
});
connection.connect();
// console.log that your server is up and running
app.listen(port, () => console.log(`Listening on port ${port}`));
// create a GET route
app.get('/express', (req, res) => {
// res.send({ saludo: 'YOUR EXPRESS BACKEND IS CONNECTED TO REACT' });
connection.query('select * from shell', function(err, rows, fields) {
res.send(JSON.stringify(rows));
});
});
App.js
import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';
import SideBar from './sideBar'
import Table from './table'
class App extends Component {
render() {
return (
<SideBar>
<Table datos={rows}/>
</SideBar>
);
}
}
export default App;
var rows= fetch('/express')
.then(function(response) {
console.log(response)
return response;
})
.then(function(myJson) {
console.log(myJson);
});
console.debug(rows)
console.log(rows)
Table.js
function SimpleTable(props) {
return (
<Paper className={props.root}>
<Table className={props.table}>
<TableHead>
<TableRow>
<TableCell>Familia</TableCell>
<TableCell numeric>Genero</TableCell>
<TableCell numeric>Especie </TableCell>
<TableCell numeric>Calidad </TableCell>
<TableCell numeric>Tamaño </TableCell>
<TableCell numeric>Pais </TableCell>
<TableCell numeric>Comentario </TableCell>
<TableCell numeric>Precio </TableCell>
</TableRow>
</TableHead>
<TableBody>
{props.datos.map(molusco => {
return (
<TableRow >
<TableCell component="th" scope="row">
{molusco.familia}
</TableCell>
<TableCell numeric>{molusco.genero}</TableCell>
<TableCell numeric>{molusco.especie}</TableCell>
<TableCell numeric>{molusco.calidad}</TableCell>
<TableCell numeric>{molusco.tamaño}</TableCell>
<TableCell numeric>{molusco.pais}</TableCell>
<TableCell numeric>{molusco.comentario}</TableCell>
<TableCell numeric>{molusco.precio}</TableCell>
</TableRow>
);
})}
</TableBody>
</Table>
</Paper>
);
}
SimpleTable.propTypes = {
classes: PropTypes.object.isRequired,
};
export default withStyles(styles)(SimpleTable);
答案 0 :(得分:0)
您出错,因为rows
变量不是数组。这是一个承诺。
您应该给它分配另一种方式:
let rows = [];
const loadingPromise = fetch('/express')
.then(response => response.json())
.then(json => {
rows = json
})
管理异步数据的更好方法是使用React.Component的生命周期方法。这样,您可以保证在rows
方法中定义render
变量,并且当您从服务器获得响应时,组件将自动重新呈现。
class App extends React.Component {
state = {
rows: []
}
componentDidMount() {
fetch("https://jsonplaceholder.typicode.com/users")
.then(r => r.json())
.then(users => {
this.setState({rows: users});
})
}
render () {
const {rows} = this.state;
return (
<div>
{rows.length === 0 && "Loading..."}
<ul>
{rows.map((row, index) => (
<li key={index}>{row.name}</li>
))}
</ul>
</div>
)
}
}
ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
答案 1 :(得分:0)
只需稍微更改'rows'变量,将异步请求放入组件生命周期方法中是一种好习惯。我认为它将起作用。
CorrelationId