iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Modern Web

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

【D15】 小工具:溫度換算(part 2)

  • 分享至 

  • xImage
  •  

先前遇到的問題

第10天發現取到的值都是之前的值,對此完全不知道發生什麼事情。經過網友的回應,原來是在 batch update 發生的問題。原來 React 避免過度的轉譯(Render),所以就在設定值的時候,並不會馬上地進行變化,而是會將所有的改變 state 收集起來,然後一次做修改。

因此在這邊,使用兩個方法放值,一個是用變數取直,另一個是用 setState 放值。因此第一種 newCelsius 可以讀取現在的值,而使用 setState 則是會取得上一個值。

用這個當範例:

const newCelsius = e.target.value;
setCelsius(newCelsius);
console.log("e:" + newCelsius + "|f:" + fahrenheit);
console.log("e:" + celsius + "|f:" + fahrenheit);

在輸入 10 到 100 的過程中,會取得之前的值,所以導致華氏溫度沒有變化,提供錯誤的訊息:

e:10|f:50
e:100|f:50

用變數進行計算

這樣的話,就用變數接值,用此來計算,這樣資料就會是正確的。當然,兩個輸入欄的 handle 功能都要處理,這樣問題就解決囉~

import { useState } from "react";

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

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

  const handleFahrenheitChange = (e) => {
    const newFahrenheit = e.target.value;
    setFahrenheit(newFahrenheit);
    setCelsius((5.0 / 9.0) * (newFahrenheit - 32));
    console.log("e:" + newFahrenheit + "|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;

參考資料


後記

感謝 Tree 的協助,讓我找到原因囉!卡關好幾天的說。


上一篇
【D14】 小工具:超連結頁面(props 運用)
下一篇
【D16】 小工具:轉換字串編碼(part 2)
系列文
自己工具,自己 React - React學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言