Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase ref.on(';value';)连续调用,即使没有更改_Javascript_Reactjs_Firebase_Firebase Realtime Database - Fatal编程技术网

Javascript Firebase ref.on(';value';)连续调用,即使没有更改

Javascript Firebase ref.on(';value';)连续调用,即使没有更改,javascript,reactjs,firebase,firebase-realtime-database,Javascript,Reactjs,Firebase,Firebase Realtime Database,我正在使用事件侦听器检查实时数据库的更改 const [chats, setChats] = useState({}); const ref = db.ref(`users/${sender}/chat/`); ref.on('value', (snapshot) => { const data = snapshot.val(); setChats(data); }); 我总是得到太多的重新渲染。Firebase文档说它只应该在孩子们发生变化时更新。我做错

我正在使用事件侦听器检查实时数据库的更改

  const [chats, setChats] = useState({});
  const ref = db.ref(`users/${sender}/chat/`);
  ref.on('value', (snapshot) => {
    const data = snapshot.val();
    setChats(data);
  });

我总是得到太多的重新渲染。Firebase文档说它只应该在孩子们发生变化时更新。我做错什么了吗?是否有解决方法?

问题最有可能是问题中的代码在每次渲染时运行,更改状态,然后重新渲染。无限循环

试着用一种新的方法。在中删除侦听器的额外点数

const[chats,setChats]=useState({});
useffect(()=>{
const ref=db.ref(`users/${sender}/chat/`);
//值侦听器函数
const onValue=快照=>{
setChats(snapshot.val())
}
//寄存器侦听器
参考on(‘值’、on值);
//返回清除函数以删除侦听器
return()=>ref.off(“value”,onValue)
}, [])

问题很可能是问题中的代码在每次渲染时运行,更改状态,从而重新渲染。无限循环

试着用一种新的方法。在中删除侦听器的额外点数

const[chats,setChats]=useState({});
useffect(()=>{
const ref=db.ref(`users/${sender}/chat/`);
//值侦听器函数
const onValue=快照=>{
setChats(snapshot.val())
}
//寄存器侦听器
参考on(‘值’、on值);
//返回清除函数以删除侦听器
return()=>ref.off(“value”,onValue)
}, [])

这似乎出乎意料,但我在您共享的代码中没有看到任何可以解释这一点的内容。你是否可以在jsbin或stackblitz这样的网站上设置一个最小复制,这样我就可以看一看?这似乎出乎意料,但我在你共享的代码中没有看到任何可以解释这一点的东西。你是否可以在jsbin或stackblitz这样的网站上设置一个最小的复制,这样我就可以看一看?