From 1d3738ee575a513873a1e9b61b69c2a54b7b566d Mon Sep 17 00:00:00 2001 From: eric thul Date: Sat, 27 Feb 2016 20:48:35 -0500 Subject: [PATCH] Create a stateless class with children Resolves #61 --- docs/React.md | 8 ++++++++ src/React.js | 17 ++++++++++++----- src/React.purs | 11 +++++++++++ 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/docs/React.md b/docs/React.md index b8a73b9..10014f2 100644 --- a/docs/React.md +++ b/docs/React.md @@ -318,6 +318,14 @@ createClassStateless :: forall props. (props -> ReactElement) -> ReactClass prop Create a stateless React class. +#### `createClassStateless'` + +``` purescript +createClassStateless' :: forall props. (props -> Array ReactElement -> ReactElement) -> ReactClass props +``` + +Create a stateless React class with children access. + #### `handle` ``` purescript diff --git a/src/React.js b/src/React.js index 2d42dd1..2c34c7d 100644 --- a/src/React.js +++ b/src/React.js @@ -19,15 +19,22 @@ function getRefs(this_) { } exports.getRefs = getRefs; +function childrenToArray(children) { + var result = []; + + React.Children.forEach(children, function(child){ + result.push(child); + }); + + return result; +} +exports.childrenToArray = childrenToArray; + function getChildren(this_) { return function(){ var children = this_.props.children; - var result = []; - - React.Children.forEach(children, function(child){ - result.push(child); - }); + var result = childrenToArray(children); return result; }; diff --git a/src/React.purs b/src/React.purs index a5c63fb..1036699 100644 --- a/src/React.purs +++ b/src/React.purs @@ -53,6 +53,7 @@ module React , createClass , createClassStateless + , createClassStateless' , createElement , createElementDynamic , createElementTagName @@ -296,6 +297,10 @@ foreign import createClass :: forall props state eff. ReactSpec props state eff createClassStateless :: forall props. (props -> ReactElement) -> ReactClass props createClassStateless = unsafeCoerce +-- | Create a stateless React class with children access. +createClassStateless' :: forall props. (props -> Array ReactElement -> ReactElement) -> ReactClass props +createClassStateless' k = createClassStateless \props -> k props (childrenToArray (unsafeCoerce props).children) + -- | Create an event handler. foreign import handle :: forall eff ev props state result. (ev -> EventHandlerContext eff props state result) -> EventHandler ev @@ -313,3 +318,9 @@ foreign import createElementTagNameDynamic :: forall props. TagName -> props -> -- | Create a factory from a React class. foreign import createFactory :: forall props. ReactClass props -> props -> ReactElement + +-- | Internal representation for the children elements passed to a component +foreign import data Children :: * + +-- | Internal conversion function from children elements to an array of React elements +foreign import childrenToArray :: Children -> Array React.ReactElement