- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这篇文章是我的第一篇文章!
我正在 React 中创建一个番茄钟。我的目标很简单。我正在创建一个 Pomodoro 时钟,能够在 JavaScript 中成功完成此操作,但使用 React 组件架构。但我遇到了一些问题。
所以我的 App 组件有 3 个子组件:Session
、Timer
和 Break
应用组件
let [fromSession, setFromSession] = useState();
let [isSession, setIsSession] = useState();
let [fromBreak, setFromBreak] = useState();
let [isBreak, setIsBreak] = useState();
const fromSessionFunction = w => {
setFromSession(w);
}
const sessionTrueOrNot = x => {
setIsSession(x);
}
const fromBreakFunction = y => {
setFromBreak(y);
}
const breakTrueOrNot = z => {
setIsBreak(z);
}
if(isBreak === true) {
isSession = false;
}
if (isSession === true) {
isBreak = false;
}
console.log('from App', isSession, isBreak)
return (
<div className='app-background center'>
<h1>Pomodoro Timer</h1>
<div className='flex'>
<Session sessionFunctionFromApp={fromSessionFunction} sessionTrueOrNot={sessionTrueOrNot}/>
<Timer sessionFromApp={fromSession} isSessionFromApp={isSession} breakFromApp={fromBreak} isBreakFromApp={isBreak}/>
<Break breakFunctionFromApp={fromBreakFunction} breakTrueOrNot={breakTrueOrNot}/>
</div>
</div>
)
}
export default App;
session 组件
let [sessionTime, setSessionTime] = useState(25);
let [sessionTrue, setSessionTrue] = useState();
const decreaseSessionFunction = () => {
setSessionTime(sessionTime -= 1);
setSessionTrue(true);
}
const increaseSessionFunction = () => {
setSessionTime(sessionTime += 1);
setSessionTrue(true);
console.log(sessionTrue);
}
useEffect(() => {
setSessionTrue(true);
}, []);
sessionFunctionFromApp(sessionTime);
sessionTrueOrNot(sessionTrue);
return (
<div>
<h3>Session</h3>
<p>{sessionTime}:00</p>
<button className='ui purple basic button' onClick={() => decreaseSessionFunction()}>-</button>
<button className='ui purple basic button' onClick={() => increaseSessionFunction()}>+</button>
</div>
)
}
export default Session;
计时器组件
let name, display;
if(isSessionFromApp) {
name = 'Timer for Session';
display = sessionFromApp;
}
if(isBreakFromApp) {
name = 'Timer for Break';
display = breakFromApp;
}
return (
<div>
<h2>{name}</h2>
<p id='big-font'>{display}:00</p>
<button className='ui blue basic button'>Start</button>
<button className='ui blue basic button'>Stop</button>
<button className='ui blue basic button'>Restart</button>
</div>
)
}
export default Timer;
中断组件
let [breakTime, setBreakTime] = useState(10);
let [breakTrue, setBreakTrue] = useState();
const decreaseBreakFunction = () => {
setBreakTime(breakTime -= 1);
setBreakTrue(true);
}
const increaseBreakFunction = () => {
setBreakTime(breakTime += 1);
setBreakTrue(true);
console.log(breakTrue);
}
useEffect(() => {
setBreakTrue(false)
}, []);
breakFunctionFromApp(breakTime);
breakTrueOrNot(breakTrue);
return (
<div>
<h3>Break</h3>
<p>{breakTime}:00</p>
<button className='ui violet basic button' onClick={() => decreaseBreakFunction()}>-</button>
<button className='ui violet basic button' onClick={() => increaseBreakFunction()}>+</button>
</div>
)
}
export default Break;
好吧,从字面上看,我唯一想做的就是,从应用程序中,当我像现在这样console.log
时,它会打印true
或false
这很好。
我希望 Session
默认为真,Break
默认为假。 所以我想要的是当我点击 +
的 Break,尽管 App 的 console.log
更改为 false true。从 Break 组件的第 15 行说 false。
为什么会这样?
如果这是假的,那么应用程序怎么会说假真呢?
最后,当我点击 Session 的 +
时,Session 组件的第 15 行再次显示 true,但 App 打印 false true。
感谢您的阅读,我真诚地感谢您的帮助,我理解我的代码反射(reflect)了我是一个初学者。
最佳答案
您看到 Break
和 App
对 看似 相同的值 breakTrue
说了一些矛盾的事情。但它们实际上是两个值。这是因为 setState()
是一个异步函数。您不能指望它会立即改变其状态。
En bref,你的代码执行顺序是这样的:
[PSEUDO CODE]
1. Break: setBreakTrue(true)
// issue an async update command, doesn't take effect yet.
2. Break: console.log(breakTrue)
// sync func, instant effect, so you see the old value `false` before previous command
3. App: console.log('from App', isBreak)
// exec in the re-render cycle triggered by 1st command, thus reflects the new value `true`.
我在这里附上一个demoboard .检查 Break
文件 ln:22,我添加了:
useEffect(() => console.log('breakTrue (async):', breakTrue))
这个 console.log
被包裹在 useEffect
中,因此它在 setState
命令完成它的工作后执行,所以您会看到 breakTrue
的新值如预期的那样为 true
。
附件是这个应用程序的重写:
https://frontarm.com/demoboard/?id=aa46b63b-a020-4041-b8a8-14c2174c647e
关于javascript - 尝试在 React 中创建一个番茄钟但坚持正确传递 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59463352/
在我的 POJO 中,我有这个: @Transient private int qtyMentee; 在我的 DAO 中我有这个查询: public List findQtyMentee(){
如果我正在编写的应用程序终止,我需要将当前位置存储到 iphone 的“磁盘”中。然后,当应用程序再次启动时,我想恢复这些信息。但是,CLLocation 坐标属性是只读的。 如何在程序调用之间保存此
这个问题有点来回,因为我已经了解了一些关于 unix 系统的 g++ 知识(抱歉,如果我把任何人搞砸了)。 对于我目前正在尝试完成的项目,我想获得 twitcurl使用 Xcode 和 OpenFra
我想在表格中显示用户的姓名以及本周发布的照片数量。 示例:用户 1 发布了 10 张照片,用户 2 发布了 20 张照片...... 所以我需要一个计数,但我不知道如何。 图片型号: public
我正在尝试保留具有@OneToMany 和@ManyToOne 关系的实体。 @OneToMany(mappedBy="customer", cascade=CascadeType.ALL, fetc
我有一个表单,我从另一个表中获取字段,例如,第一个字段是硬编码的,第二个字段是从另一个表中获取的,如果其他表有 10 条记录,则向用户显示 10 个新字段。我的问题是如何将这种数据插入表中。 我得到这
我一直在努力控制导入和导出,这样我就可以精简我的 JS 应用程序。我试过合并这些 Mozilla和 this Stack Overflow examples没有任何运气。 It looks like
我的数据库中的一个字段中包含以下文本: [quote:5a7b87febe="mr smith"]This is some text. This is more text on another lin
我正在使用 cling UPnP android 中的框架连接到支持 UPnP 的设备。我成功地创建了一个设备并浏览了网络中的可用设备。但对于三星电视在网络框架内没有任何反应。在这里我添加了 Rend
我正在制作一个问答网站,类似于此网站和 Yahoo answers。我有 3 个表 - smf_members、qa_questions 和 qa_answers。 在此查询中,我想从 qa_ques
阅读后this question - 它还提供了文档链接,我仍然对文档有疑问。 MDN:Date.parse A string representing an RFC2822 or ISO 8601
我有一个父实体客户端。该客户可以访问该网站并创建约会。这意味着约会是在客户反对的其他时间创建的。 我的问题是:如何将子对象添加到已持久化的父对象中?如果调用下面示例中的函数 addData1(),则会
我正在尝试创建气泡,重复几次后我的浏览器卡住了。这是我的代码。有人请帮助....我如何在不提出许多请求的情况下完成它。 看起来我的帖子主要是代码,但我为这个 Stackoverflow 添加了足够的细
我被这个 linq 查询困住了,我需要做的就是优化最后的价格计算,因为我得到了大约 1000 篇文章,而且销量很大,所以它变得很慢...... var result = from article in
我有一列用于对象创建 的时间,一列用于对象更新 的时间。当我创建并保留新对象时,我从 MySQL 收到错误: updated cannot be null. 我没有为它设置任何值,因为我希望 upda
我以前使用 git 没有任何问题,但突然间我无法推送 或克隆 任何东西。当我使用这个命令时,没有任何反应,甚至没有错误,所以我必须按 ctrl + c 或关闭 git 窗口。 我使用这个简单的命令来推
我似乎不知道下一步该做什么。我的目标是使用图像包中的 SubImage 函数从原始图像创建一个包含所有子图像的数组。我能够在 imageSplit() 函数中分割图像并通过 channel 传递给 i
我有一个 STM32L-Discovery 板,它有一个 STM32L152R8 微处理器。我很难让基本的事情发挥作用。 我看过ST给出的例子(电流消耗触摸传感器和温度传感器),我认为它们不太用户友好
这是一个散列,其中mysql列与散列的键相关,值与散列的值相关 {:jobID=>"1", :checkoutArtificateFolder=>"/cmf/new/build/Artifacts/
我有两个实体 @Entity @Table(name="parent") public class Parent { @Id String uuid; @ElementCollection
我是一名优秀的程序员,十分优秀!