iT邦幫忙

2022 iThome 鐵人賽

DAY 10
0
Modern Web

自己工具,自己 React - React學習系列 第 10

【D10】 小工具:溫度換算(part 1)

  • 分享至 

  • xImage
  •  

攝氏與華氏

常見的氣溫標記方式為攝氏溫標(degree Celsius)和華氏溫標(degree Fahrenheit),也就是常見的 °C 或 °F 兩種,這兩種的換算如下:

°F = (9/5)*(°C) + 32
°C = (5/9)*(°F - 32)

意義:

  • 華氏溫度:在標準大氣壓下,冰的熔點為32℉,水的沸點為212℉,中間等分180份,每等分為華氏1度。
  • 攝氏溫度:在標準大氣壓下,純水的凝固點為0°C,水的沸點為100°C,中間分100等份,每等份為攝氏1度。

轉換程式碼

首先製作出攝氏與華氏的變數,接著根據公式,製作溫度轉換:

  let [celsius, setCelsius] = useState(0);
  let [fahrenheit, setFahrenheit] = useState(0);

  const handleCelsiusChange = (e) => {
    setCelsius(e.target.value);
    setFahrenheit((9.0 / 5.0) * celsius + 32);
    console.log("e:" + celsius + "|f:" + fahrenheit);
  };

  const handleFahrenheitChange = (e) => {
    setFahrenheit(e.target.value);
    setCelsius((5.0 / 9.0) * (fahrenheit - 32));
    console.log("e:" + fahrenheit + "|c:" + celsius);
  };

最後結果如下:

import { useState } from "react";

function DegreeChange() {
  let [celsius, setCelsius] = useState(0);
  let [fahrenheit, setFahrenheit] = useState(0);

  const handleCelsiusChange = (e) => {
    setCelsius(e.target.value);
    setFahrenheit((9.0 / 5.0) * celsius + 32);
    console.log("e:" + celsius + "|f:" + fahrenheit);
  };

  const handleFahrenheitChange = (e) => {
    setFahrenheit(e.target.value);
    setCelsius((5.0 / 9.0) * (fahrenheit - 32));
    console.log("e:" + fahrenheit + "|c:" + celsius);
  };

  return (
    <div>
      <h1>溫度換算</h1>
      <div>
        <label>攝氏溫度(°C )</label>
        <div>
          <input itemType="text" onChange={handleCelsiusChange}></input>
        </div>
      </div>
      <div>
        <label>華氏溫度(°F )</label>
        <div>
          <input itemType="text" onChange={handleFahrenheitChange}></input>
        </div>
      </div>
      <div>
        <label>
          {celsius}°C ={fahrenheit} °F
        </label>
      </div>
    </div>
  );
}

export default DegreeChange;

但這還是發生個問題,每次onChange時候,只會讀取上次的狀態,並不是最新的狀態,所以會有顯示如100°C =50 °F 錯誤的窘境...

需要花時間再研究一下


參考資料


後記

首先做了個溫度轉化,看似簡單的轉換,但是對於新手的我仍是有些討戰,要研究一下為什麼讀資料都不是當下的值,是之前的值。


上一篇
【D9】 製作簡易互動的 .jsx
下一篇
【D11】 小工具:轉換字串編碼(part 1)
系列文
自己工具,自己 React - React學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
Tree
iT邦新手 3 級 ‧ 2022-09-28 21:00:58

handleCelsiusChange 中的 celsius 會取到舊值是因為 react batch update 機制,

可參考這篇文章,他有詳細解釋 https://lance.coderbridge.io/2021/06/10/react-batch-update-in-hooks-and-react18/

所以你可能需要在 handleCelsiusChange 設定一個 newCelsius 來接收 e.target.value 數值

const handleCelsiusChange = (e) => {
    const newCelsius = e.target.value;
    setCelsius(newCelsius);
    setFahrenheit((9.0 / 5.0) * newCelsius + 32);
    console.log("e:" + newCelsius + "|f:" + fahrenheit);
};

我要留言

立即登入留言