本文最后更新于 2024年12月2日 下午
Challenge #1 Date Counter 在codesandbox 上运用state 实现date counter 功能。
(1)实现界面及功能
功能
第一行按钮可实现对Step的加减1位;第二行按钮可实现对Count的加减step位;第三行会显示距今的过去和未来的天数,和Count有关,Count=0,今天;Count>0,未来;Count<0,过去。
(2)实现代码及思路 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import "./styles.css" ;import { useState } from "react" ;export default function App ( ) { return ( <div className ="App" > //需要添加css中App类 <Counter /> //调用Counter组件 </div > ); }function Counter ( ) { const [count, setCount] = useState (0 ); const [step, setStep] = useState (1 ); const date = new Date (); date.setDate (date.getDate () + count); return ( <div > <div > <button onClick ={() => setStep((c) => c - 1)}>-</button > Step:{step} <button onClick ={() => setStep((c) => c + 1)}>+</button > </div > <div > <button onClick ={() => setCount((c) => c - step)}>-</button > Count:{count} <button onClick ={() => setCount((c) => c + step)}>+</button > </div > <p > <span > {count === 0 ? "Today is " : count > 0 ? `${count} days from today is ` : `${Math.abs(count)} days ago was `}//取绝对值 </span > <span > {date.toDateString()}</span > </p > </div > ); }
(1)状态state使用场景
(2)在函数组件中使用useState钩子
const [state, setState] = useState(initialValue)
:定义一个状态变量 state
和更新该状态的函数 setState
,initialValue
为初始值。
使用 setState
来更新状态。
(3)采用setState的回调方式
①确保基于最新状态进行更新;
②避免直接修改状态,React不建议直接修改状态变量值;
1 2 3 4 5 6 setStep (step-1 );setStep (step-1 );setStep ((c )=> c-1 );setStep ((c )=> c-1 );
(3)进阶版界面及功能
功能
采用文本框和调节框,当改变二者值时,会出现reset按钮。
(4)进阶版代码及思路 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 import "./styles.css" ;import { useState } from "react" ;export default function App ( ) { return ( <div className ="App" > <Counter /> </div > ); }function Counter ( ) { const [count, setCount] = useState (0 ); const [step, setStep] = useState (1 ); function handleReset ( ) { setCount (0 ); setStep (1 ); } const date = new Date (); date.setDate (date.getDate () + count); return ( <div > <div > <input //设置step调节框 type ="range" min ="0" max ="10" value ={step} onChange ={(e) => setStep(Number(e.target.value))} /> Step:{step} </div > <div > <button onClick ={() => setCount((c) => c - step)}>-</button > <input //设置count文本框 type ="text" value ={count} onChange ={(e) => setCount(Number(e.target.value))} /> <button onClick ={() => setCount((c) => c + step)}>+</button > </div > <p > <span > {count === 0 ? "Today is " : count > 0 ? `${count} days from today is ` : `${Math.abs(count)} days ago was `} </span > <span > {date.toDateString()}</span > </p > {count !== 0 || step !== 1 ? ( //满足此条件reset按钮才会出现 <div > <button onClick ={handleReset} > Reset</button > </div > ) : null} </div > ); }
(1)onChange用法
解析:onChange={(e) => setStep(e.target.value)}
1.onChange
onChange
是一个事件处理程序,专门用来监听用户对表单元素(如输入框、文本域、复选框、下拉菜单等)的更改。它会在以下情况下触发:
用户在输入框中输入或删除字符。
用户从下拉菜单中选择不同的选项。
用户勾选或取消复选框。
(e) => setStep(e.target.value)
这是一个箭头函数,作为 onChange
事件处理程序传递。
3.e
(事件对象)
e
是事件对象,代表触发 onChange
事件的详细信息。它包含事件发生时的各种信息,比如事件目标(target
)以及事件类型。
4.e.target
e.target
表示触发事件的 DOM 元素。在表单控件中,这通常是一个 <input>
、<select>
或 <textarea>
元素。
5.e.target.value
e.target.value
是表单控件当前的值。例如:
对于文本输入框,value
是用户输入的文本。
对于下拉菜单,value
是选中的选项值。
setStep
在这里,setStep
被用来更新 step
变量的值,使其与用户输入保持同步。
执行步骤:
1、用户在输入框中输入内容。
2、onChange
事件被触发,e.target.value
捕获用户输入的值。
3、setStep
函数被调用,更新 step
状态。
4、组件重新渲染,输入框的值和页面上的 Current Step
文本同步更新。