From 300dd89c9b9c3a98802ea8bb4c8afd4492f8fba5 Mon Sep 17 00:00:00 2001 From: andys8 Date: Tue, 10 May 2022 16:38:27 +0200 Subject: [PATCH] React.memo with argument Adding another variant of memo that allows passing a function to compare previous and new props. Solves --- src/React/Basic/Hooks.js | 1 + src/React/Basic/Hooks.purs | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/React/Basic/Hooks.js b/src/React/Basic/Hooks.js index a285755..e699f76 100644 --- a/src/React/Basic/Hooks.js +++ b/src/React/Basic/Hooks.js @@ -13,6 +13,7 @@ const useEqCache = (eq, a) => { exports.reactChildrenToArray = (children) => React.Children.toArray(children); exports.memo_ = React.memo; +exports.memoEq_ = React.memo; exports.useState_ = (tuple, initialState) => { const r = React.useState( diff --git a/src/React/Basic/Hooks.purs b/src/React/Basic/Hooks.purs index 4bb46ab..02470e2 100644 --- a/src/React/Basic/Hooks.purs +++ b/src/React/Basic/Hooks.purs @@ -8,6 +8,7 @@ module React.Basic.Hooks , reactChildrenToArray , reactChildrenFromArray , memo + , memo' , useState , useState' , UseState @@ -166,6 +167,16 @@ memo :: Effect (ReactComponent props) memo = flip Prelude.bind (runEffectFn1 memo_) +-- | Similar to `memo` but takes a function to compare previous and new props +memo' :: + forall props. + (props -> props -> Boolean) -> + Effect (ReactComponent props) -> + Effect (ReactComponent props) +memo' arePropsEqual comp = Prelude.do + c <- comp + runEffectFn2 memoEq_ c (mkFn2 arePropsEqual) + useState :: forall state. state -> @@ -359,6 +370,13 @@ foreign import memo_ :: (ReactComponent props) (ReactComponent props) +foreign import memoEq_ :: + forall props. + EffectFn2 + (ReactComponent props) + (Fn2 props props Boolean) + (ReactComponent props) + foreign import unsafeSetDisplayName :: forall props. EffectFn2 String (ReactComponent props) (ReactComponent props)