Javascript 设置触发调度时状态失控
我正在练习使用Reactjs和Firestore构建类似于reddit的东西。但是,当我单击upvote按钮并触发分派以增加帖子的分数时,帖子将重新呈现,组件的状态id属性将变得未定义 我的控制台日志屏幕截图,其中id神奇地变得未定义:( 其减速器如下: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
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;
}
}
我的问题是:
首先,你的代码看起来很棒!我很高兴看到它有多整洁:)为了回答你的第二个问题,你可以随时使用
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;
}
}