【发布时间】:2019-05-21 03:09:36
【问题描述】:
我创建了一个 React 应用程序,它使用 fetch() 到 componentDidMount 上的路由文件来构建渲染组件中的数据。
这很好用,但是当 MySQL 数据库中的数据更新时,React 组件是静态的。
当 MySQL 数据库中的数据发生更改时,如何使用任何更改来更新我的 React 组件?请在下面查看我的代码示例。
反应文件 - react.js
class myComponent extends React.Component {
constructor(props) {
super(props);
this.state = {
data: []
}
}
// componentDidMount - When the component is mounted.
componentDidMount() {
// Retrieve project data from the database.
fetch('/retrieve-data', {
credentials: 'include'
})
.then((response) => {
if (response.ok) {
return response.json();
} else {
console.log('Error with session response');
}
})
.then((result) => {
// Set the state of data.
this.setState({
data: data
})
})
.catch((error) => {
console.log('Error: ', error);
});
}
render() {
return (
<div>
{/* Loop Data Array */}
{this.state.data.map((thisData, k) => (
<div key={k}>
{thisData.field1}
</div>
))}
</div>
)
}
}
路由文件-retrieve-data.js
var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var connection = mysql.createConnection({
host: myHost,
user: myUser,
password: myPassword,
database: myDatabase
})
router.get('/', function(req, res, next) {
// Select data from the database.
connection.query("SELECT * FROM database_table", function (error, resultData, fields) {
// Send the result message back to the React application.
res.send({resultData});
});
});
module.exports = router;
数据是由一个单独的路由文件上的 Webhook 更新的,所以这可能是我希望服务器告诉 React 它需要更新的地方,但前提是更改与单个客户端看到的数据相关.
对于这个问题,我很抱歉,我对 React 很陌生。谢谢!
【问题讨论】:
-
您需要从服务器发送推送通知,客户端正在侦听该通知,或者在客户端上设置一个间隔来 ping 服务器以进行偶尔的更新,或者在您 POST 后进行另一次获取到服务器,或者只是将发布的数据直接附加到状态,这应该与刷新的操作相同。
-
谢谢。由于数据将由 Webhook 更新,我如何告诉 Webhook 路由文件更改 React 中的状态?我正在考虑您提到的第三个选项来进行另一次提取。因此,我想当 Webhook 路由文件接收到 Webhook 时,我需要告诉客户端再次获取。谢谢!
-
我对 webhook 没有太多经验,但这里的核心选项是执行
window.location.href='/myRoute',这将强制页面完全刷新,并会导致您的componentDidMountfetch 到火。也就是说,我相信有 webhook 经验的人可以为您提供更好的见解。