Reactjs 将流值设置为反应状态
目前,我有一个示例应用程序,我尝试使用RejectDB和React 在数据库中,它们具有侦听订阅表中的更改(插入、更新、删除)的功能 当调用“feed”套接字事件时,它会将新创建的记录附加到状态。执行更新时,我想修改当前状态用户,但当我尝试记录值时,它仍然是空数组,但我想根据套接字事件响应返回的id修改特定记录 例如: 假设Reactjs 将流值设置为反应状态,reactjs,rethinkdb,Reactjs,Rethinkdb,目前,我有一个示例应用程序,我尝试使用RejectDB和React 在数据库中,它们具有侦听订阅表中的更改(插入、更新、删除)的功能 当调用“feed”套接字事件时,它会将新创建的记录附加到状态。执行更新时,我想修改当前状态用户,但当我尝试记录值时,它仍然是空数组,但我想根据套接字事件响应返回的id修改特定记录 例如: 假设users的当前值在socket.emit('load')call之后处于状态: {id: "0e6dde2c-b21b-4963-9a06-393b04dfeb45", n
users
的当前值在socket.emit('load')
call之后处于状态:
{id: "0e6dde2c-b21b-4963-9a06-393b04dfeb45", name: "updaste."} App.js:28
{id: "106682b4-1395-4f8a-9758-5dd1d73b4174", name: "test1xx"} App.js:28
{id: "60b7c8cf-b40f-4209-a7ef-ff51735ae7c5", name: "William Adama", posts: Array(3), tv_show: "Battlestar Galactica"} App.js:28
{id: "ff920ad9-fc1d-4034-a7e8-d96b502935d3", name: "tesst"} App.js:28
现在在后端我更新了记录:ff920ad9-fc1d-4034-a7e8-d96b502935d3,socket.on('feed')
将返回
{id: "ff920ad9-fc1d-4034-a7e8-d96b502935d3", name: "updated"}
我想更新users
状态下的数组元素,所以我这样做了
ws.on("feed", response => {
console.log(response);
const prevUser = [...users]
let result = prevUser.find(t => t.id === response.id)
if (result) {
result.name = response.name
}
setUsers(user => [...user, response]);
});
对于用户
它返回[]
,对于结果
它返回未定义
。我没有费心将结果
附加到setUsers,因为它仍然是未定义的
完整片段:
const [users, setUsers] = useState([]);
useEffect(() => {
ws.on("connect", () => {
console.log("connected");
ws.emit("load"); // server will emit the "feed" message
console.log(`emitted`);
});
// will be called when "load" message was emitted
ws.on("feed", response => {
console.log(response);
const prevUser = [...users];
let result = prevUser.find(t => t.id === response.id);
if (result) {
result.name = response.name;
}
console.log(result);
setUsers(user => [...user, response]);
});
});
响应
对象是流值
请帮帮我。谢谢对象返回的是什么?返回
undefined
如果在给定谓词的数组中找不到任何内容。response返回以下内容:{id:“ff920ad9-fc1d-4034-a7e8-d96b502935d3”,name:“updated”}当使用array.find时,由于users数组为空,它将始终返回undefined。因此,最初,users数组为空。然后,向数组添加一个响应。如果另一个值来自流,您将看到users数组不是空的。它应该是如何工作的?老实说,我不明白问题出在哪里。好吧,我的问题是,在第一个套接字事件发出后,用户数组已经被填充,但当我尝试检查它的值时,它显示[],所以这可能就是为什么array.find不起作用的原因。@Gasim我再次尝试了setState的功能版本,它工作得很好。谢谢你的建议