reactjs - 每次有人使用 firebase 和 Reactjs 访问页面时计算浏览次数

标签 reactjs firebase google-cloud-firestore react-router-dom

我想在用户每次使用react-router-dom和Firebase访问页面时计算浏览次数,我有以下代码:

//useHistory is the react-router-dom dependency 
const history = useHistory();

const handleClick = () => history.push('/post');

if(handleClick) {
  db.collection("posts").doc(postId).update({
    views: increment,
  })
}

它的作品,但它给出了一个无限循环我尝试过 useEffect 像:

useEffect(() => {
  if(handleClick) {
    db.collection("posts").doc(postId).update({
      views: increment,
    })
  }
}, [handleClick]) 

并且它仍然给出无限增量,有没有一种方法可以在不遇到此类问题的情况下计算 View ?

最佳答案

问题

尚不清楚第一个片段如何创建渲染循环,但它肯定是不正确的。组件的每个渲染/重新渲染都会重新运行函数组件主体,这意味着每个渲染 handleClick 都会被重新声明,并且 OFC if (handleClick) 条件将始终 为 true(因为它是在上面定义的),并且“posts”集合每次都会更新。

事实上,在第二个片段中,问题几乎是相同的,组件的每个渲染/重新渲染都会重新声明 handleClick 函数,这是依赖项数组中的一个新引用,它会触发 useEffect 回调。

解决方案

使用挂载(空依赖数组)useEffect来触发数据库集合更新。

useEffect(() => {
  db.collection("posts")
    .doc(postId)
    .update({
      views: increment,
    });
}, []);

尚不清楚 postIdincrement 值来自何处,但我假设在组件代码中的先前位置您已访问相同的集合并检索了“初始值” “查看数据库中的值。

关于reactjs - 每次有人使用 firebase 和 Reactjs 访问页面时计算浏览次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69929205/

相关文章:

javascript - 如何比较数组中的每个元素并将具有相同数据的元素分组(在我的例子中是日期)? JavaScript

firebase - React-redux-firebase 正确加载数据,但在组件内部不可用

swift - swift语言中cloud Firestore server timestamp的等效数据类型是什么?

java - 如何以排序的方式检索文档的值?

javascript - Node.js Firestore 身份验证问题(当 javascript 工作时)

firebase - Firestore 最近的什么变化使它提示 "Overlapping recursive wildcard match statement"?

javascript - 检测何时触摸另一个 View - 在 React Native 中使用 PanResponder 拖动

reactjs - RTK查询错误: could not find react-redux context value; please ensure the component is wrapped in a <Provider>

javascript - React 应用程序中的语法错误。仅在第一次加载时

android - 在 Android 上启用安全网设备检查 API 的具体步骤是什么