React 中使用 onKeyDown

Hugh's Programming life
3 min readMay 23, 2020

--

出於好玩自己製作了一個按按鍵就可以讓進度條往前跑的小 function。

這依賴 React-Bootstrap

const Percentage = () => {
const [percent, setPercent] = useState(0);
const handleAdd = (e) => {
if (percent !== 100) setPercent(percent + 10);
};
return (
<ProgressBar
animated
now={percent}
onClick={handleAdd}
/>
);
};

測試中用了 onClick 都可以正常運行,結果換成 onKeyDown 就出了問題,一直想說是不是打錯,最後搜尋在 stackoverflow 找到了答案,原來是需要一個 tabIndex 的屬性。

改成如下就行了:

const Percentage = () => {
const [percent, setPercent] = useState(0);
const handleAdd = () => {
if (percent !== 100) setPercent(percent + 10);
};
return (
<ProgressBar
animated
now={percent}
onKeyDown={handleAdd}
tabIndex="-1"
/>
);
};

但這樣有個缺點,就是我必須點擊進度條,才可以使用任意按鍵增加進度條,所以這樣的方法並不完整。

看了 stackoverflow 之後,我這個問題的最正確的作法應該還是要透過生命週期,或是 useEffect 新增原生 JavaScript 的監聽器了吧?這方面我就不實作了,因為我只是想了解一下而已。

也因為這樣,所以就開始好奇為什麼要點擊進度條之後,才可以使用按鍵去變動進度條的值?

關於 tabIndex 這個 html 屬性

在這裡理解到,原來 tabIndex 就是跟我之前理解到的使用 tab 去選擇元素的功能啊!

有時候滑鼠壞掉,就可以利用 tab 來 focus 一個元素,而這個屬性則是讓我們可以調整 focus 到的優先順序,只要在 w3school 的範例中使用就可以了解。

所以在這裡他就是透過 focus 元素,才可以偵測到 onKeyDown。

也因此理解到這個跟無障礙使用者也有關聯。參考下篇文章:

--

--

Hugh's Programming life
Hugh's Programming life

Written by Hugh's Programming life

我是前端兼後端工程師,主要在前端開發,包括 React、Node.js 以及相關的框架和技術。之前曾擔任化工工程師的職位,然而對電腦科技一直抱有濃厚的熱情。後來,我參加了轉職課程並開設這個部落格紀錄我的學習過程。於2020年轉職成功後,我一直持續精進技能、擴展技術範疇跟各種對人生有正面意義的學習,以增加我的工作能力。

No responses yet