標籤:

Hoc + props.children 實現React中的佔位組件

先看下這段代碼:

class App extends Component { render() { return ( <div> <div>1</div> <div>2</div> <div>3</div> </div> ) }}

如果我想顯示3個div,必須在最外層包裹一個容器,有時候,做flex布局,或者一些其他情況,我並不希望最外層多出這麼一個div,有沒有什麼好辦法呢?

首先,可以使用數組保存JSX來解決這個問題:

class App extends Component { render() { return ( [ <div key="one">1</div>, <div key="two">2</div>, <div key="three">3</div> ] ) }}

這樣寫即可,但是要注意,如果用數組保存JSX做渲染的時候,一定要給每個JSX片段加key值。

當然,還可以用高階組件來解決這個問題:

function Decorator(props) { return props.children}class App extends Component { render() { return ( <Decorator> <div>1</div> <div>2</div> <div>3</div> </Decorator> ) }}

巧妙的借用了props.children的數組特性,這樣三個div一樣會被正常渲染,同時外部也不需要額外加一個div包裹元素了。

然後,在16.2的React中,官方推出了Fragment這個內容,代碼還可以變成這個樣子:

import { Fragment } from Reactclass App extends Component { render() { return ( <Fragment> <div>1</div> <div>2</div> <div>3</div> </Fragment> ) }}

甚至可以進一步簡化:

class App extends Component { render() { return ( <> <div>1</div> <div>2</div> <div>3</div> </> ) }}

但是這個語法,需要大家自己升級下babel, Eslint這樣的工具,具體新語法,參考:

React v16.2.0: Improved Support for Fragments - React Blog?

reactjs.org圖標

感謝 @孟禿 提供的這個語法補充。


推薦閱讀:

如何評價數據流管理架構 Redux?
React 沒有中間件還能用嗎?
搜索延遲的簡單實現
web 開發中無處不在的狀態機
React 16.3來了:帶著全新的Context API

TAG:React |