React 0.14 發布,拆分為 react 和 react-dom
React 0.14 正式發布,此版本包括一些重要的改進,主要是簡化代碼編寫,提供更好的支持環境,比如 React Native。
Reactjs 0.14 獲取:
-
React
Dev build with warnings: https://fb.me/react-0.14.0.js
Minified build for production: https://fb.me/react-0.14.0.min.js -
React with Add-Ons
Dev build with warnings: https://fb.me/react-with-addons-0.14.0.js
Minified build for production: https://fb.me/react-with-addons-0.14.0.min.js -
React DOM (include React in the page before React DOM)
Dev build with warnings: https://fb.me/react-dom-0.14.0.js
Minified build for production: https://fb.me/react-dom-0.14.0.min.js
React 「一分為二」
原本的 react package 被拆分為 react 及 react-dom 兩個 package。其中 react package 中包含 React.createElement、 .createClass、 .Component, .PropTypes, .Children 這些 API,而 react-dom package 中包含 ReactDOM.render、 .unmountComponentAtNode、 .findDOMNode。
原本在服務端渲染用的兩個 API .renderToString 和 .renderToStaticMarkup 被放在了 react-dom/server 中。
改變之后的結構,一個基本的 React 組件變成了這樣:
var React = require('react');
var ReactDOM = require('react-dom');var MyComponent = React.createClass({
render: function() {
return <div>Hello World</div>;
}
});
ReactDOM.render(<MyComponent />, node); 此外,原本 React.addons 下面的工具全部變成了獨立的 package:
-
react-addons-clone-with-props
-
react-addons-create-fragment
-
react-addons-css-transition-group
-
react-addons-linked-state-mixin
-
react-addons-perf
-
react-addons-pure-render-mixin
-
react-addons-shallow-compare
-
react-addons-test-utils
-
react-addons-transition-group
-
react-addons-update
-
ReactDOM.unstable_batchedUpdates (在
react-dom中)
當然,原本的 API 在 v0.14 版中仍然可以使用,只不過會有 warning,最終會在 v0.15 版的時候完全移除。
refs 變成了真正的 DOM 節點
當我們需要獲取 React 組件上某個 DOM 節點時,React 提供了 refs 方法方便我們快速引用。為了方便我們使用,React 還「貼心」地對 refs 做了一層封裝,使用 this.refs.xxx.getDOMNode() 或 React.findDOMNode(this.refs.xxx) 可以獲取到真正的 DOM 節點。
結果發現大家真正需要的就是 DOM 節點本身,封裝了半天完全是浪費感情。
于是在 v0.14 版中 refs 指向的就是 DOM 節點,同時也會保留 .getDOMNode() 方法(帶 warning),最終在 v0.15 版中去除該方法。
var Zoo = React.createClass({
render: function() {
return <div>Giraffe name: <input ref="giraffe" /></div>;
},
showName: function() {
// 之前:
// var input = this.refs.giraffe.getDOMNode();
//
// v0.14 版:
var input = this.refs.giraffe;
alert(input.value);
}
}); 需要注意的是,如果你給自定義的 React 組件(除了 DOM 自帶的標簽,如 div、p 等)添加 refs,表現和行為與之前一致。
無狀態的函數式組件
其實在實際業務系統中使用 React 時,我們會寫很多只有 render 方法的 React 組件。為了減少冗余的代碼量,React v0.14 中引入了 無狀態的函數式組件(Stateless functional components) 的概念。先看看長啥樣:
// 一個 ES6 箭頭函數定義的無狀態函數式組件var Aquarium = (props) => {
var fish = getFish(props.species); return <Tank>{fish}</Tank>;
};// 或者更加簡化的版本var Aquarium = ({species}) => (
<Tank>
{getFish(species)}
</Tank>
);// 最終使用方式: <Aquarium species="rainbowfish" /> 可以看到,沒有 React.createClass,也沒有顯式的 render,寫起來更加輕松了。
當然,新語法也有需要注意的地方:
-
沒有任何生命周期方法,如
componentDidMount等 -
不能添加 refs
-
可以通過給函數添加屬性定義
propTypes和defaultProps
react-tools 及 JSXTransformer.js 已棄用
擁抱 Babel 吧同學們!
編譯器優化
在 Babel 5.8.23 及更新的版本中,新增了兩項專門針對 React 的優化配置,僅推薦在生產環境中開啟,因為優化后會導致代碼的報錯更加撲朔迷離(本來報錯就已經很難定位了……)。
-
optimisation.react.inlineElements將 JSX 元素轉換為對象而非使用React.createElement -
optimisation.react.constantElements針對擁有完全靜態子樹的組件,將其創建過程提升到頂層(Top level),從而減少對React.createElement方法的調用
其它變化
-
React.initializeTouchEvents已棄用 -
由于 refs 的相關變化(見上文),
TestUtils.findAllInRenderedTree及相關的方法不再接受 DOM 組件作為參數,只能傳入自定義的 React 組件 -
props一旦創建永遠不可修改,因此.setProps及.replaceProps已廢棄 -
children不可以傳對象類型,推薦傳入數組,或使用React.createFragment方法(其實就是轉換為了數組) -
React.addons.classSet已經移除,使用classnamespackage 替代
將要發生的改變
在 v0.15 版中,下列內容將會發生改變:
-
this.getDOMNode()方法將會廢棄,推薦使用React.findDOMNode() -
setProps及replaceProps將會廢棄 -
React.addons.cloneWithProps已廢棄,推薦使用React.cloneElements,新方法不會自動 mergeclassName及style -
React.addons.CSSTransitionGroup將不再監聽 transition 事件,因此使用者需要顯式指定動畫的 timeout,如:transitionEnterTimeout={500}。 -
ES6 組件類必須 extends React.Component(如果使用 React.createClass 語法則不受影響)
-
在多次 render 中重用并改變 style 對象已經被棄用(這一點不是太明白,中心思想貌似是不要 mutate object?)
更多內容請看發行說明。
內容轉載自:http://undefinedblog.com/react-v0-14/