BridgeCraft logobridgecraft
週報顧問服務作品集關於聯絡登入
聯絡

bridgecraft

從資料視覺化到 AI Agent,一直在找下一個 meta

文章主題指南週報顧問服務Labs作品集系統架構關於聯絡RSS

© 2026 BridgeCraft — Waiting7777. All rights reserved.

← 所有文章

Controlled and Uncontrolled Component in React

2021年9月15日 · Waiting7777 · 2 分鐘閱讀

先來看看什麼是 controlled 什麼是 uncontrolled component。

The Uncontrolled

uncontrolled 的通常就像傳統的 HTML input,內部自己紀錄了 input 的值。

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.input = React.createRef();
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.input.current.value);
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={this.input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

這是最簡單的實現,它保持了 dom 裡唯一的真相來源,是個簡單又快速的實現,但可能不太夠用,因為得想辦法把值傳出去,如果表單需要驗證或是其他處理的時候,會導致很難修改。

The Controlled

controlled input 把 value 當作 props 來使用,並且在 onChange 接 handler 處理 value

class Form extends Component {
  constructor() {
    super();
    this.state = {
      name: '',
    };
  }

  handleNameChange = (event) => {
    this.setState({ name: event.target.value });
  };

  render() {
    return (
      <div>
        <input
          type="text"
          value={this.state.name}
          onChange={this.handleNameChange}
        />
      </div>
    );
  }
}

這樣做的好處是因為 value 就在 state 裏面,所以 UI 可以馬上做回應:

  • 驗證可以馬上做,不用等到 submit
  • 強化 input 格式,像是電話號碼或是信用卡號碼

但如果你不需要做這些,那麼 uncontroll 比較簡單。

到底該選哪個?

source: https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/

會有這篇文章是因為,在製作 component 的時候,因為自己的使用情境很簡單,所以做了個 uncontrolled 的版本,但給別人用的時候,原先做了個簡單版本 uncontrolled,自己 maintain 了狀態然後生了 onChange 告訴上層狀態的變化,但因為他想對狀態做後處理,然後擔心他的狀態跟組件的狀態不一致,所以最後還是改了 controlled 版本出來,並且讓 component 是兩種兼容的。

結論

想要簡單快速,uncontrolled 版本就好,想要複雜功能還是把問題都讓用 component 的人去 controll 就好。看你的使用情境來決定,至於是做 component 的話,或許比想像中的還複雜,想要足夠好用就得兩種都做。

同場加映

過去用 vue 在做 component 時,其實只有 controlled 版本,因為 vue 有語法糖 v-model 導致大家都約定成俗這樣做,所以也就沒這個額外的煩惱。

Reference:

https://zh-hant.reactjs.org/docs/uncontrolled-components.html

https://goshacmd.com/controlled-vs-uncontrolled-inputs-react/

每週一篇 — 技術趨勢背後的商業邏輯

分享:

Waiting7777

WoW Arena 冠軍轉前端,用電競 meta 思維拆解技術趨勢。

關於作者

相關文章

YC 裡越來越多二次創業者 — AI 時代為什麼老手反而更吃香創業創投+4

YC 裡越來越多二次創業者 — AI 時代為什麼老手反而更吃香

為什麼 AI 時代反而讓「老手」更吃香?從 YC 的數據看 repeat founder 的優勢在哪,以及這對第一次創業的人有什麼啟示。

2026年8月12日 · Waiting7777 · 7 分鐘閱讀

繼續閱讀 →
OpenChamber:專為 AI Agent 設計的開發環境,跟 IDE 的差別在哪?AI Agents開發工具+5

OpenChamber:專為 AI Agent 設計的開發環境,跟 IDE 的差別在哪?

拆解 OpenChamber 的設計邏輯:為什麼 agent 需要專屬的開發環境、跟直接在 terminal 跑 Claude Code 有什麼本質差異,以及這個方向的商業潛力在哪。

2026年8月11日 · Waiting7777 · 8 分鐘閱讀

繼續閱讀 →
AI coding 工具燒錢有多快?Databricks 告訴你怎麼控成本AI開發工具+4

AI coding 工具燒錢有多快?Databricks 告訴你怎麼控成本

從「Databricks 燒完錢才搞出控制工具」這個角度切入,拆解 AI coding 工具的真實成本結構,以及企業在 scale up 後才發現的坑。對比 Rippling 同樣在燒錢後才蓋 ROI 工具,這是一個系統性問題。

2026年8月8日 · Waiting7777 · 7 分鐘閱讀

繼續閱讀 →

這篇文章對你有幫助嗎?

每週一篇 — 技術趨勢背後的商業邏輯

AI 產業在變什麼、工程師該注意什麼——拆清楚寄到你的信箱。