Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.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 反应效果不';t阻止重新渲染_Javascript_Reactjs_Use Effect_Use State - Fatal编程技术网

Javascript 反应效果不';t阻止重新渲染

Javascript 反应效果不';t阻止重新渲染,javascript,reactjs,use-effect,use-state,Javascript,Reactjs,Use Effect,Use State,我需要创建一个功能性的react组件,它在每次发生特定事件时自动更新内部数据 我写了下面的代码,但每次调用回调时,组件都会重新呈现,变量myArray被设置为空数组,而不是填充回调中的所有内容 我做错了什么?我应该用什么方法 //事件模拟 函数onEventEmulator(回调,间隔=1000){ setInterval(()=>callback('content'),interval); } 函数轮询组件(props){ const[myArray,setMyArray]=useState(

我需要创建一个功能性的react组件,它在每次发生特定事件时自动更新内部数据

我写了下面的代码,但每次调用回调时,组件都会重新呈现,变量
myArray
被设置为空数组,而不是填充回调中的所有内容

我做错了什么?我应该用什么方法

//事件模拟
函数onEventEmulator(回调,间隔=1000){
setInterval(()=>callback('content'),interval);
}
函数轮询组件(props){
const[myArray,setMyArray]=useState([]);
useffect(()=>{
onEventEmulator(内容=>{
setMyArray([…myArray,content]);
});
},[]);//无论是否将空数组作为第二个参数传递,结果都不会更改。
返回
  • 回拨
  • {myArray.length}
; }
让我们试试这个:

function onEventEmulator(callback, interval = 1000) {
  setInterval(() => callback("content"), interval);
}
然后:

function PollingComponent(props) {
  const [myArray, setMyArray] = useState([]);

  useEffect(() => {
    onEventEmulator(content => {
      setMyArray(arr => [...arr, ...content]);
    });
  }, []);

  return (
    <ul>
      <li>Callback</li>
      <li>{myArray.length}</li>
    </ul>
  );
}
函数轮询组件(props){
const[myArray,setMyArray]=useState([]);
useffect(()=>{
onEventEmulator(内容=>{
setMyArray(arr=>[…arr,…content]);
});
}, []);
返回(
  • 回拨
  • {myArray.length}
); }

这里缺少的一件事是清除
setInterval
的方法,但我想这不是您关心的问题

我在这里错过了必须在某个时间间隔(而不是仅仅一次)完成的操作,这将很快更新代码。您是在寻找某种事件发射器方法,还是仅仅从某个api进行轮询?如果您正在寻找事件发射器(更可能),那么创建使用全局事件发射器的自定义挂钩可能是一个解决方案。另一方面,如果池是您想要的,那么有这样的钩子首先感谢您的帮助,我试图研究
useffect
,从它的文档中应该允许在不重新呈现组件的情况下更改状态,但在我的示例中它没有。我是不是用错了useEffect?@Raffaele通过查看您的代码,我很难说您是否正确使用了
useEffect
。不确定你所说的“特定事件”是什么意思-是像点击按钮之类的事件还是其他什么(像订阅websocket订阅)?换句话说,
onEventEmulator
应该如何启动?你能在上面创建一些示例吗?我会尽我所能查看它并尽我所能帮助你。嗨@Danko,如果我这样做,看起来你添加的代码正在解决问题,这会给网站的其他用户造成混乱。我会在你们更新主答案中的代码后将其标记为有用并被接受。