Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.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 设置触发调度时状态失控_Javascript_Reactjs_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 设置触发调度时状态失控

Javascript 设置触发调度时状态失控,javascript,reactjs,firebase,google-cloud-firestore,Javascript,Reactjs,Firebase,Google Cloud Firestore,我正在练习使用Reactjs和Firestore构建类似于reddit的东西。但是,当我单击upvote按钮并触发分派以增加帖子的分数时,帖子将重新呈现,组件的状态id属性将变得未定义 我的控制台日志屏幕截图,其中id神奇地变得未定义:( 其减速器如下: export const upVote = (postDetails) => { return (dispatch, getState) => { const newScore = postDetails.score

我正在练习使用Reactjs和Firestore构建类似于reddit的东西。但是,当我单击upvote按钮并触发分派以增加帖子的分数时,帖子将重新呈现,组件的状态id属性将变得未定义

我的控制台日志屏幕截图,其中id神奇地变得未定义:(

其减速器如下:

export const upVote = (postDetails) => {
  return (dispatch, getState) => {
    const newScore = postDetails.score + 1;
    firebase.firestore().collection('posts').doc(postDetails.id).update({
      score: newScore,
    }).then(() => {
      dispatch({type: 'UPVOTE_SUCCESS'})
    }).catch((err) => {
      dispatch({type: 'UPVOTE_ERROR', error:err})
    })
  }
}
const postReducer = (state = initState, action) => {
  switch (action.type) {
    case 'UPVOTE_SUCCESS':
      console.log('Upvote Success!')
      return state;
    case 'UPVOTE_ERROR':
      console.log('Upvote Error', action.error)
      return state;
    default:
      return state;
  }
}
我的问题是:

  • 我听说将你所在州的属性设置为prop的值是不对的,但这个问题与此有关吗?如果是,我应该如何重组它

  • 当我触发dispatch函数时,是否可以不重新呈现组件,但仍然能够更新post组件中的分数


  • 首先,你的代码看起来很棒!我很高兴看到它有多整洁:)为了回答你的第二个问题,你可以随时使用
    shouldComponentUpdate
    ()来控制基于道具和状态更改的重新渲染。也就是说,我认为我们可能缺少一些背景知识来理解问题所在。看起来您正在导入一个
    upVote
    操作,对吗?这个动作和减速器是什么样子的?您是否也可以共享来自父组件的更多代码?可能有什么东西让事情变得不对劲。@YvesGurcan感谢您的鼓励:)我已经用action、reducer和parent组件更新了我的问题。非常感谢你调查我的问题!我说真的!更新问题后添加的代码看起来也很棒。没有什么比这更明显的问题了。稍后我会尝试复制这个bug,但在接下来的12个小时内我无法查看它。希望到那时,其他人会发现这个问题。否则,我会让你知道,如果我发现了什么。继续努力!你会明白的:)@Yvesgur可以慢慢来。非常感谢。如果有帮助的话,我已经添加了控制台日志的图片:)@Josh Pittman我确实删除了postReducer,我注释掉了“dispatch({type:'UPVOTE_SUCCESS'})”,这样它就不会调用reducer。
    export const upVote = (postDetails) => {
      return (dispatch, getState) => {
        const newScore = postDetails.score + 1;
        firebase.firestore().collection('posts').doc(postDetails.id).update({
          score: newScore,
        }).then(() => {
          dispatch({type: 'UPVOTE_SUCCESS'})
        }).catch((err) => {
          dispatch({type: 'UPVOTE_ERROR', error:err})
        })
      }
    }
    
    const postReducer = (state = initState, action) => {
      switch (action.type) {
        case 'UPVOTE_SUCCESS':
          console.log('Upvote Success!')
          return state;
        case 'UPVOTE_ERROR':
          console.log('Upvote Error', action.error)
          return state;
        default:
          return state;
      }
    }