鍍金池/ 教程/ HTML/ 雙向綁定輔助工具
顯示數(shù)據(jù)
組件的引用
Controlled Input 值為 null 的情況
Reconciliation
子 props 的類型
組件的詳細說明和生命周期
傳遞 Props
特殊的非 DOM 屬性
組件 API
PureRenderMixin
雙向綁定輔助工具
瀏覽器中的工作原理
深入 JSX
表單組件
Dangerously Set innerHTML
入門
JSX 中的 If-Else
克隆組件
教程
更多的關(guān)于Refs
JSX 的 false 處理
高級性能
Mounting 后 componentWillReceiveProps 未被觸發(fā)
簡介
測試工具集
JSX 陷阱
工具集成(ToolingIntegration)
公開組件功能
通過 AJAX 加載初始數(shù)據(jù)
事件系統(tǒng)
可復用組件
this.props.children undefined
不可變數(shù)據(jù)的輔助工具(Immutability Helpers)
動態(tài)交互式用戶界面
組件的 DOM 事件監(jiān)聽
復合組件
動畫
插件
JSX 展開屬性
行內(nèi)樣式
性能分析工具
類名操作
與其他類庫并行使用 React
鍵控的片段
標簽和屬性支持
組件間的通信
React (虛擬)DOM 術(shù)語
JSX 根節(jié)點的最大數(shù)量
在樣式props中快速制定像素值
頂層 API
深入理解 React
自閉合標簽
為什么使用 React?
getInitialState 里的 Props 是一個反模式
與 DOM 的差異

雙向綁定輔助工具

ReactLink是一種簡單表達React雙向綁定的方式。

注意:

如果你是這個框架的初學者,記住ReactLink對于大多數(shù)應用來說都是不需要的,應該謹慎使用。

在React里面,數(shù)據(jù)流是一個方向的:從擁有者到子節(jié)點。這是因為根據(jù)the Von Neumann model of computing,數(shù)據(jù)僅向一個方向傳遞。你可以認為它是單向數(shù)據(jù)綁定。

然而,有很多應用需要你讀取一些數(shù)據(jù),然后傳回給你的程序。例如,在開發(fā)表單的時候,當你接收到用戶輸入時,你將會頻繁地想更新某些React state?;蛘吣阆朐贘avaScript中演算布局,然后反應到某些DOM元素的尺寸上。

在React中,你可以通過監(jiān)聽一個“change”事件來實現(xiàn)這個功能,從你的數(shù)據(jù)源(通常是DOM)讀取,然后在你某個組件上調(diào)用setState()。"關(guān)閉數(shù)據(jù)流循環(huán)"明顯會引導寫出更加容易理解的和維護的程序。查看我們的表單文檔來獲取更多信息。

雙向綁定 -- 隱式地強制在DOM里面的數(shù)據(jù)總是和某些React state保持一致 -- 是簡明的,并且支持非常多的應用。我們已經(jīng)提供了ReactLink:如上所述,是一種設置通用數(shù)據(jù)流循環(huán)模型的語法糖,或者說“關(guān)聯(lián)”某些數(shù)據(jù)到React state。

注意:

ReactLink僅僅是一個onChange/setState()模式的簡單包裝和約定。它不會從根本上改變數(shù)據(jù)在你的React應用中如何流動。

ReactLink: 前后對比

這是一個簡單的表單示例,沒有使用ReactLink

var NoLink = React.createClass({
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  handleChange: function(event) {
    this.setState({message: event.target.value});
  },
  render: function() {
    var message = this.state.message;
    return <input type="text" value={message} onChange={this.handleChange} />;
  }
});

這段代碼運行地很好,數(shù)據(jù)如何流動是非常清晰的,但是,如果表單有大量的字段,代碼就會很冗長了。讓我們使用ReactLink來減少打字輸入:

var WithLink = React.createClass({
  mixins: [React.addons.LinkedStateMixin],
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  render: function() {
    return <input type="text" valueLink={this.linkState('message')} />;
  }
});

LinkedStateMixin給你的React組件添加一個叫做linkState()的方法。linkState()返回一個ReactLink對象,包含React state當前的值和一個用來改變它的回調(diào)函數(shù)。

ReactLink對象可以在樹中作為props被向上傳遞或者向下傳遞,so it's easy (and explicit) to set up two-way binding between a component deep in the hierarchy and state that lives higher in the hierarchy.

注意,對于checkbox的value屬性,有一個特殊的行為,如果checkbox被選中(默認是on),value屬性值將會在表單提交的時候發(fā)送出去。當checkbox被選中或者取消選中的時候,value屬性是不會更新的。對于checkbox,你應該使用checkLink而不是valueLink

<input type="checkbox" checkedLink={this.linkState('booleanValue')} />

底層原理(Under the Hood)

對于ReactLink,有兩塊兒:你創(chuàng)建ReactLink實例的地方和你使用它的地方。為了證明ReactLink是多么的簡單,讓我們單獨地重寫每一塊兒,以便顯得更加明了。

不帶ReactLink的LinkedStateMixin(ReactLink Without LinkedStateMixin)

var WithoutMixin = React.createClass({
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  handleChange: function(newValue) {
    this.setState({message: newValue});
  },
  render: function() {
    var valueLink = {
      value: this.state.message,
      requestChange: this.handleChange
    };
    return <input type="text" valueLink={valueLink} />;
  }
});

如你所見,ReactLink對象是非常簡單的,僅僅有一個valuerequestChange屬性。LinkedStateMixin也同樣簡單:它僅占據(jù)這些字段,用來自于this.state的值和一個調(diào)用this.setState()的回調(diào)函數(shù)。(And LinkedStateMixin is similarly simple: it just populates those fields with a value from this.state and a callback that calls this.setState().)

不帶valueLink的ReactLink(ReactLink Without valueLink)

var WithoutLink = React.createClass({
  mixins: [React.addons.LinkedStateMixin],
  getInitialState: function() {
    return {message: 'Hello!'};
  },
  render: function() {
    var valueLink = this.linkState('message');
    var handleChange = function(e) {
      valueLink.requestChange(e.target.value);
    };
    return <input type="text" value={valueLink.value} onChange={handleChange} />;
  }
});

valueLink屬性也很簡單。它簡單地處理onChange事件,然后調(diào)用this.props.valueLink.requestChange(),同時也用this.props.valueLink.value替換this.props.value。就這么簡單!