reactjs - 如何让我的 React like 按钮在不喜欢时增加,然后在喜欢时减少?
问题描述
状态变量likes
只是继续增加。我以为我的onSelect
函数可以交替 的布尔值liked
,但显然不是。
这是错误:
Error: Maximum update depth exceeded. This can happen when a component repeatedly calls
setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested
updates to prevent infinite loops.
这是 App.js:
import React, { useState } from 'react';
import './App.css';
import LikeButton from './components/LikeButton';
function App() {
const [likes, updateLikes] = useState(23);
const [liked, updateLiked] = useState(false);
return (
<LikeButton
secret='like-button'
numLikes={likes}
liked={liked}
// status={liked}
onSelect={function clickLike(liked) { //This function is happening, but the else block
// never fires.
if (liked) {
updateLikes(likes + 1);
} else { updateLikes(likes - 1)
};
updateLiked(!liked);
}
}
/>
// onClick function here, or in LikeButton.js?
);
}
export default App;
这是 LikeButton.js:
import React from 'react';
import { FaThumbsUp } from 'react-icons/fa';
export default function LikeButton({secret, liked, numLikes, onSelect}) {
return (
<>
<FaThumbsUp />
<div key={secret} liked={liked} onClick={onSelect(liked)}>Like Button</div>
<p>{numLikes}</p>
</>
);
}
解决方案
问题
您立即调用您的onClick
回调,它会更新父级中的状态。
import React from 'react';
import { FaThumbsUp } from 'react-icons/fa';
export default function LikeButton({secret, liked, numLikes, onSelect}) {
return (
<>
<FaThumbsUp />
<div
key={secret}
liked={liked}
onClick={onSelect(liked)} // invoked right away
>
Like Button
</div>
<p>{numLikes}</p>
</>
);
}
解决方案
使其成为匿名内部函数。
import React from 'react';
import { FaThumbsUp } from 'react-icons/fa';
export default function LikeButton({secret, liked, numLikes, onSelect}) {
return (
<>
<FaThumbsUp />
<div
key={secret}
liked={liked}
onClick={() => onSelect(liked)} // invoked when clicked
>
Like Button
</div>
<p>{numLikes}</p>
</>
);
}
建议
当下一个状态值取决于当前状态值时,您还应该真正使用功能状态更新,即在递增/递减计数或切换布尔值时。我还建议将其移动updateLikes
到一个useEffect
钩子中以对liked
切换做出反应。这可能会使关于递增/递减的逻辑更加清晰。
function App() {
const [likes, updateLikes] = useState(23);
const [liked, updateLiked] = useState(false);
useEffect(() => {
updateLikes(likes => likes + (liked ? 1 : -1));
}, [liked]);
return (
<LikeButton
secret='like-button'
numLikes={likes}
liked={liked}
// status={liked}
onSelect={function clickLike(liked) {
updateLiked(liked => !liked);
}}
/>
);
}
推荐阅读
- python - 如何加速用于在python中加入字符串列的groupby应用函数
- windows - ApacheDS - 默认服务无法在 Windows 上启动
- flutter - 来自 Json 的 DateFormat 解析
- xcode - carplay setRootTemplate 崩溃(允许的类:(null))
- documentation - 如何在 chargify 中找到对帐单的状态?即,如果它没有支付?
- websocket - 如何在竞争消费者场景中重定向消息
- python - 如何放入测试真正的 zip 文件并处理提取的文件
- java - 在eclipse中将通用Lib文件夹添加到Javaproject
- java - 如何使用流将值从对象添加到列表
- gensim - Gensim LdaModel 如何确定文档的概率