Generate 按鈕 以及 text input 均無法正確顯示畫面
-
<ContextInput>
取出context
後便直接放入useState
預設值。 -
useState
預設值給定context
之後,context
就算繼續更新,也不會重新預設useState
的初始值了 -
希望畫面顯示(更新)global state (
context
),卻只顯示 local stateinputData
的畫面<div>Context value: {inputData}</div>
-
底下 input 也只有更新 local state,並未更新 global state,因此 global state
context
就算被按鈕改變,並不會影響,<ContextInput>
的畫面渲染 -
抓取元素的方式,也應該修正
e.value
為e.target.value
直接將 <input>
的 value / onChange 與 context
, setContext
掛鈎,
則必須透過 useEffect
,同步雙向更新 context
(global) 及 inputData
(local)
useEffect(() => {
setContext(inputData);
}, [inputData]);
useEffect(() => {
setInputData(context);
}, [context]);
避免 <ContextInput>
修改 local state 卻希望改變 global state,如此隱含地 implicit behavior,
Implicity 將造成極大的心理認知負擔 與 認知轉換 ( context switch ) ,將造成未來除錯的困難
-
與設計師、PM討論該元件的行為及心理預期,重新釐清需求來修正程式碼。
-
避免透過
<input>
直接修改 global state -
可改使用
<Form>
在 onsubmit 事件發生時,將 input value (local state),透過handleSubmit
塞進 global context -
若實際商業應用與實務需求為此,則傾向直接透過方法1在
input
上修改、明顯示出該input
就是希望修改 global state
Generate 按鈕 Math.random().toString()
希望顯示亂數型別為字串(String)
context 的預設值卻給定數字(Number) 0
另外<input type="text">
的 value 只會產出 字串(String) 或 未定義(undefined))
如果有API call 可以另外再跟throttle 或 debounce 搭配來取消 request
如果需求上,我們的 input 只希望輸入數字,我們可以在 type 上,type="text"
改 type="number"
,提前預防使用者輸入錯誤。
而在使用者輸入完成後,也可以搭配一些 validation 來驗證 input 是否合法、符合需求