【发布时间】:2021-07-06 09:27:14
【问题描述】:
我正在开发一个 React 项目并使用 AWS Amplify 作为无服务器后端的工具,其中我有一个 DynamoDB 作为我在 AWS 云中的数据库。
我的 React 应用需要检测 DynamoDB 中的实时数据更新。我正在使用 Amplify 的 GraphQL API。
Amplify 生成的 GraphQL API 提供了一个subscriptions API,用于实时订阅数据更改。我认为这正是我需要的,所以我正在使用它:
import React, {useEffect, useState, useRef} from 'react';
import Amplify, { API, graphqlOperation } from 'aws-amplify';
import { onCreateData } from './graphql/subscriptions';
// subscribe to listen to new data creation in DynamoDB
const subscription = API.graphql(
graphqlOperation(onCreateData)
).subscribe({
next: (newData) => {
// New data is received here outside 'App' functional component,
// how can I render the data then?
console.log(`new data: ${JSON.stringify(newData)}`);
}
});
// I can't put the above subscription code inside App component, I don't know why but it just doesn't work unless I move it outside the App functional component.
function App() {
const [dataArray, setDataArray] = useState([]);
...
useEffect(() => {
fetchDataArray();
showDataArray();
return () => {
//cleanup
}
}, [dataArra])
return (<div>
<canvas ref={canvasRef}/>
</div>)
}
export default App;
问题是 subscription 用于 DynamoDB 中的新数据插入仅在我将其放在 function App(){...} 之外时才有效,如上所示。那么,当订阅回调next: (newData)收到newData时,如何在App组件中显示新数据?
你可以在我的App 组件中看到我有状态变量dataArray,理想的解决方案是用newData 更新这个dataArray 状态,但我认为现在不可能。所以,总的来说,我想知道现在如何在我的App 组件中显示新数据?
附: Amplify GraphQL API doc sample code(如果您看到“订阅”部分)也显示订阅代码与导入处于同一级别。
【问题讨论】:
-
学习一些教程? react FC(你的App是FC,可以转成类组件)需要像
useSubscription-apollographql.com/docs/react/data/subscriptions这样的hook形式 -
我想知道如何订阅我的功能组件,而不是类组件。有没有可能。
-
您是否尝试在 App 中使用 useEffect 挂钩添加它?
标签: reactjs amazon-web-services graphql amazon-dynamodb aws-amplify