【发布时间】:2020-04-11 15:59:08
【问题描述】:
我正在尝试在组件中使用 React 挂钩(useState 和 useEffect)来显示投票计数。用户单击上/下后,“投票”状态应该增加或减少,然后应用程序调用 API 来修补数据库中的“投票”计数。原始投票计数来自父组件传递的道具。但由于某种原因,投票的初始状态始终为 0——即使当我 console.log 显示道具时它显示正确的票数?
PATCH 请求似乎工作正常,但我认为带有钩子的东西是错误的。在此先感谢您提供的任何帮助!
export default function Votes(props) {
const { item, voteCount, itemType } = props
const [votes, setVotes] = useState(voteCount || 0)
useEffect(() => {
if (itemType == 'question') {
questionApiService.updateQuestionFields({
questionId: item.id,
questionFields : { votes: `${votes}` }
})
} else if (itemType === 'answer') {
console.log('answer')
// questionApiService.updateAnswerFields({
// answerId: item.id,
// answerFields: { votes: votes }
//})
}
}, [votes])
const handleClick = e => {
e.currentTarget.id === "increment"
? setVotes(prevCount => prevCount + 1)
: setVotes(prevCount => prevCount - 1)
}
return (
<div className="QuestionPage__votes-count">
<button id="increment" onClick={handleClick}>
<FontAwesomeIcon icon={faCaretUp} size="2x" />
</button>
{votes}
<button id="decrement" onClick={handleClick}>
<FontAwesomeIcon icon={faCaretDown} size="2x" />
</button>
</div>
)
}
【问题讨论】:
-
将雕像的初始值分配给道具的初始值被认为是反模式。
-
如果
questionApiService正在调用远程服务或 API 端点,它可能需要是带有await的async或使用承诺模式。 -
所以问题只与组件的初始状态有关?
-
问题似乎只与初始状态有关(PATCH 有效,单击向上/向下按预期重新呈现屏幕上的计数)。问题是当我刷新页面时,屏幕上显示的投票计数会变回零,即使这不是从道具传递的 voteCount。
-
我是 React 新手,所以不知道将 props 作为初始状态传递是不好的。我选择这样做是因为这个“投票”组件在多个地方被重用。父组件总是获取一些数据(其中一部分是当前投票计数,这是我想要的初始状态)。我不确定是否有更好的方法来做到这一点...除了将“投票”功能作为自己的组件之外,我可以将其写入每个父级,以便它可以访问那里的数据?
标签: javascript reactjs react-hooks