本篇文章主要的介紹了關於react16的一些新特性,還有關於react16的詳細功能介紹。下面就讓我們一起來看這篇文章的正文內容吧
react16依靠Map和Set集合和requestAnimationFrame(一个针对动画效果的API)
- Fragments:render函数可以返回数组和字符串 - error boundaries:错误处理 - portals :支持声明性地将子树渲染到另一个DOM节点 - custom DOM attributes :ReactDom允许传递非标准属性 - improved server-side rendering:提升服务端渲染性能
Fragments
render() { return [ <li key="A"/>First item</li>, <li key="B"/>Second item</li>, <li key="C"/>Third item</li>, ]; }
詳見API
#error boundaries
之前,一旦某個元件發生錯誤,整個元件樹將會從根節點被unmount下來。 React 16修復了這一點,引入了Error Boundary的概念,中文譯為“錯誤邊界”,當某個組件發生錯誤時,我們可以通過Error Boundary捕獲到錯誤並對錯誤做優雅處理,如使用Error Boundary提供的內容替代錯誤組件。 Error Boundary可以看作是一種特殊的React元件,新增了componentDidCatch這個生命週期函數,它可以捕捉自身及子樹上的錯誤並對錯誤做優雅處理,包括上報錯誤日誌、展示出錯提示,而不是卸載整個組件樹。 (註:它並不能捕捉runtime所有的錯誤,例如元件回呼事件裡的錯誤,可以把它想像成傳統的try-catch語句)
實作:
抽像出檢查錯誤邊界公共元件:
class ErrorBoundary extends React.Component{ constructor(props){ super(props); this.state=({ ifError:false }); } componentDidCatch(err, info) { this.setState({ ifError: true }) console.log(err); } render(){ if(this.state.ifError){ return `this or its children has error`; } return this.props.children } }
建立一個簡單的包含錯誤的子元件:
class ErrorComponent extends React.Component{ render(){ const str = '123'; return str.toFixed(2); } }
使用錯誤邊界元件包裹可能出錯的元件
class MainShowComponent extends React.Component{ render(){ return ( <p> <ErrorBoundary> <ErrorComponent/> </ErrorBoundary> </p> ) } }
當被錯誤邊界元件包裹的子組件中出現錯誤,會將錯誤組件替換為字串:this or its children has error,而不會導致整體組件樹被卸載。 (想看更多就到PHP中文網React參考手冊欄位中學習)
#Portals
Portals提供了一個一流的方法來將子代呈現到父元件的DOM層次結構之外的DOM節點。
ReactDOM.createPortal( child, container );
第一個參數(child)是任何可渲染的React子元素,如元素,字串或片段。第二個參數(container)是一個DOM元素。
通常,當您從元件的render方法傳回一個元素時,它將作為最近的父節點的子元素裝載到DOM中:
render() { // React mounts a new p and renders the children into it return ( <p> {this.props.children} </p> ); }
但是,有時會將子項插入到DOM中的其他位置會很有用:
render() { // React does *not* create a new p. It renders the children into `pNode`. // `pNode` is any valid DOM node, regardless of its location in the DOM. return React.createPortal( this.props.children, pNode, ); }
有關Portals 和其事件冒泡詳見官網和CodePen範例
<p a={()=>{}}></p> //错误
this.setState( (state)=>{ if(state.curCount%2 === 0){ return {curCount:state.curCount+1} }else{ return null; } } )
this.setState( (state)=>{ if(state.curCount%2 === 0){ return {curCount:state.curCount+1} }else{ return null; } }, ()=>{ console.log(this.state.curCount); } )
和 >發生替換時,B.componentWillMount總是會在A.componentWillUnmount之前執行,在之前,A.componentWillUnmount有可能會提前執行。
ReactDOM.render(<App />, p); p.innerHTML = 'nope'; ReactDOM.render(<App />, p);//渲染一些没有被正确清理的东西
ReactDOM.render(<App />, p); ReactDOM.unmountComponentAtNode(p); p.innerHTML = 'nope'; ReactDOM.render(<App />, p); // Now it's okay
Shallow renderer(淺層渲染)不再觸發componentDidUpdate(),因為DOM的refs是不可用的。這也使得它與componentDidMount()之前版本中的呼叫一致。
Shallow renderer不再支援unstable_batchedUpdates()。
ReactDOM.unstable_batchedUpdates 現在回呼之後只有一個額外的參數。
單一檔案瀏覽器版本的名稱和路徑已經改變,以強調開發和生產版本之間的差異
#react/dist/react.js → react/umd/react.development.js
react/dist/react.min.js → react/umd/react.production.min .js
react-dom/dist/react-dom.js → react-dom/umd/react-dom.development.js
react-dom/dist/react-dom.min.js → react-dom/umd/react-dom.production.min.js
React使用手冊欄位中學習),有問題的可以在下方留言提問。
以上是React 16 新功能有哪些? react16的新功能與功能的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!