【发布时间】:2021-04-22 11:01:36
【问题描述】:
我是使用 react 钩子的新手,由于以下原因,我一直在努力使用 useEffect 钩子:
我有一个简单的评论板来发布 cmets,并在发布的 cmets 列表下方,我希望每次有新评论时组件都会重新加载以显示它。
这些注释是从 API 中的 useEffect 第一个参数得到的,问题是第二个参数(依赖数组),如果我不放这个参数会导致无限循环,如果我放一个空数组它会避免无限循环,但我的组件不会渲染发布的新 cmets,如果我输入变量状态“cmets”也会导致无限循环。所以在互联网上导航我找到了“解决方案”,它只是添加另一个变量状态以将其传递给依赖项数组,并在我调用函数“makecomponent”时进行修改,这样它会刷新状态,强制我的组件重新渲染:
export const ForumApp = () => {
const [comment, setComment] = useState("")
const [comments, setComments] = useState([])
const [count, setCount] = useState(0)
useEffect(() => {
const getComments = async () => {
try {
const query = await axios.get("http://127.0.0.1:8000/comments")
setComments(query.data.comments)
} catch (error) {
console.log(error);
}
}
getComments()
}, [count])
const handleEnter = (e: KeyboardEvent) => {
if (e.key === ENTER && !e.shiftKey) {
e.preventDefault();
makeComment();
}
};
const makeComment = async () => {
try {
await axios.post("http://127.0.0.1:8000/comments/create", {
time: "1:29",
content: comment,
})
alert("Comment posted!")
setCount((prevCount) => prevCount + 1)
setComment("")
} catch (error) {
console.log(error)
}
};
return (
<div className="forum-app">
<div className="comment-board">
<h1>Post your comment</h1>
<textarea
placeholder="Write something to us"
onChange={(e) => setComment(e.target.value)}
onKeyDown={handleEnter}
value={comment}
></textarea>
<br />
<button onClick={makeComment}>Comment</button>
</div>
<ol>
{
comments.map(({_id, content}) => (
<CommentItem key={_id} content={content}/>
))
}
</ol>
</div>
)
}
所以基本上我的问题是:这是执行此操作的“正确”方式,还是存在另一种更清洁的方式,无需声明另一个变量,只使用我拥有的内容?
【问题讨论】:
标签: javascript reactjs typescript use-effect