Javascript 当我尝试刷新usestate时,为什么程序会中断?

Javascript 当我尝试刷新usestate时,为什么程序会中断?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,当我尝试刷新usestate时,我的程序就中断了。有问题的一行是“setMesses(_messages);”。我试图将usestate资本化,但没有任何变化 import React, {useState} from 'react'; import Message from './Message'; import * as firebase from "firebase"; function MessContainer() { let counter = 0; let _me

当我尝试刷新usestate时,我的程序就中断了。有问题的一行是“setMesses(_messages);”。我试图将usestate资本化,但没有任何变化

import React, {useState} from 'react';
import Message from './Message';
import * as firebase from "firebase";

function MessContainer() {
    let counter = 0;
    let _messages = [];
    const [messes, setMesses] = useState([{this: null}]);

    firebase.database().ref().child('counter').on('value', function(snapshot){
        counter = snapshot.child("counter").val();
    });

    function load(_counter){
        firebase.database().ref().child('messages/' + _counter).on('value', function(snapshot){        
            let _chet = {}; 
            let _name = snapshot.child("name").val();

            _chet.mess =  _name + ": " + snapshot.child("message").val();

            if(_name === document.getElementById("name").value){
              _chet.status = "right";
            } else {
              _chet.status = "left";
            }
            _messages.push(_chet);
        });
    }


    function loadChet(){
        _messages = [];
        for(let i = 0; i < counter; i++){
            load(i);
        }
        console.log(_messages);
        setMesses(_messages);
        setTimeout(loadChet, 1000); 
    }

    loadChet();

    return (
        <div>{messes.map(_mess => (
            <Message mess={_mess.mess} status={_mess.status} />
        ))}
        </div>
    );
}

export default MessContainer;
import React,{useState}来自“React”;
从“/Message”导入消息;
从“firebase”导入*作为firebase;
函数MessContainer(){
设计数器=0;
让_messages=[];
const[messes,setMesses]=useState([{this:null}]);
firebase.database().ref().child('counter')。on('value',函数(快照){
计数器=snapshot.child(“计数器”).val();
});
功能加载(_计数器){
firebase.database().ref().child('messages/'+\计数器).on('value',函数(快照){
让uChet={};
让_name=snapshot.child(“name”).val();
_chet.mess=_name+“:”+snapshot.child(“message”).val();
if(_name==document.getElementById(“name”).value){
_chet.status=“右”;
}否则{
_chet.status=“左”;
}
_消息。推送(_chet);
});
}
函数loadChet(){
_消息=[];
for(设i=0;i(
))}
);
}
导出默认容器;

发生这种情况的原因是,您调用
loadChet
,这将调用
setMesses
,使组件重新加载并再次调用
loadChet
,从而导致无限循环

您不应该对函数调用
loadChet
,可以使用
useffect
并只调用一次。您需要在什么时候调用
loadChet

编辑: 试试这个

function MessContainer() {
    let counter = 0;
    let _messages = [];
    const [messes, setMesses] = useState([{this: null}]);

    firebase.database().ref().child('counter').on('value', function(snapshot){
        counter = snapshot.child("counter").val();
    });

    function load(_counter){
        firebase.database().ref().child('messages/' + _counter).on('value', function(snapshot){        
            let _chet = {}; 
            let _name = snapshot.child("name").val();

            _chet.mess =  _name + ": " + snapshot.child("message").val();

            if(_name === document.getElementById("name").value){
              _chet.status = "right";
            } else {
              _chet.status = "left";
            }
            _messages.push(_chet);
        });
    }


    function loadChet(){
        _messages = [];
        for(let i = 0; i < counter; i++){
            load(i);
        }
        console.log(_messages);
        setMesses(_messages);
        setTimeout(loadChet, 1000); 
    }

    useEffect(() => {
        loadChet();
    }, [])

    return (
        <div>{messes.map(_mess => (
            <Message mess={_mess.mess} status={_mess.status} />
        ))}
        </div>
    );
}
函数MessContainer(){
设计数器=0;
让_messages=[];
const[messes,setMesses]=useState([{this:null}]);
firebase.database().ref().child('counter')。on('value',函数(快照){
计数器=snapshot.child(“计数器”).val();
});
功能加载(_计数器){
firebase.database().ref().child('messages/'+\计数器).on('value',函数(快照){
设_chet={};
让_name=snapshot.child(“name”).val();
_chet.mess=_name+“:”+snapshot.child(“message”).val();
if(_name==document.getElementById(“name”).value){
_chet.status=“右”;
}否则{
_chet.status=“左”;
}
_消息。推送(_chet);
});
}
函数loadChet(){
_消息=[];
for(设i=0;i{
loadChet();
}, [])
返回(
{messes.map(_mess=>(
))}
);
}

您遇到了什么错误?“重新渲染的次数太多。React限制渲染次数以防止无限循环。”几秒钟后,整个站点崩溃。我看不到更多细节。我应该如何修复它,以重新呈现firebase中的数据?每两秒或三秒。我不知道UseFeftc是什么:(@BudaÖrs每两秒或三秒一次,或者firebase中的数据发生变化时?看看感谢您的患者,并提供帮助!!我很高兴:))