Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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
Reactjs 循环设置状态反应+;火库_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Reactjs 循环设置状态反应+;火库

Reactjs 循环设置状态反应+;火库,reactjs,firebase,google-cloud-firestore,Reactjs,Firebase,Google Cloud Firestore,我正在尝试为我的应用程序创建一个用户配置文件页面,对于该页面,我正在尝试从firestore获取包含一些用户信息的文档,并填充用户可以单击和更改的字段。当我将setTags函数添加到下面的db调用时,它产生了一个无限循环。有人能解释为什么会发生这种情况以及如何解决它吗?我对使用鱼钩很陌生 const UserProfile = ({history}) => { const description = useRef(''); const name = useR

我正在尝试为我的应用程序创建一个用户配置文件页面,对于该页面,我正在尝试从firestore获取包含一些用户信息的文档,并填充用户可以单击和更改的字段。当我将
setTags
函数添加到下面的db调用时,它产生了一个无限循环。有人能解释为什么会发生这种情况以及如何解决它吗?我对使用鱼钩很陌生

const UserProfile = ({history}) => {
        const description = useRef('');
        const name = useRef('');
        const {currentUser} = useContext(AuthContext);
        let [tags, setTags] = useState('');
        let uData;
        db.collection('Users').doc(currentUser.uid).get().then(doc => {
            console.log("checking db")
            console.log(doc.data())
            uData = doc.data();
            description.current = uData.description;
            name.current = uData.name
            setTags(uData.tags)
        })
    }

功能组件在每个渲染上运行。这意味着在每次重新渲染时,您都会打开数据库来搜索当前用户,然后设置标记。至关重要的是,更新状态总是导致重新加载!这是React的一个核心特性,允许隐式更新,也是首先使用React的主要原因之一

如果您希望某个东西只运行一次,您仍然可以这样做,但是您需要从类组件模拟
componentDidMount()
。因此,您可以使用:

//将此导入添加到
从“react”导入{useffect};
const UserProfile=({history})=>{
const description=useRef(“”);
const name=useRef(“”);
const{currentUser}=useContext(AuthContext);
let[tags,setTags]=useState(“”);
让乌达塔;
useffect(()=>{
db.collection('Users').doc(currentUser.uid).get().then(doc=>{
日志(“检查数据库”)
console.log(doc.data())
uData=doc.data();
description.current=uData.description;
name.current=uData.name
setTags(uData.tags)
})
},[]);//空的依赖项列表意味着这将仅在第一次渲染时运行
}