Skip to content

Commit 7cef07e

Browse files
authored
Merge pull request #11 from mattcgenui/support-for-custom-selectors
Added support for custom selectors
2 parents 3f2b460 + 7b7b3fc commit 7cef07e

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

src/createReduxModule.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const createReduxModule = (storeKey, initialState, reducers, store = getStore())
2727
);
2828

2929
return [
30-
() => useSelector(storeState => storeState[storeKey]),
30+
(fn = null) => useSelector(storeState => { return typeof fn === 'function' ? fn(storeState[storeKey]) : storeState[storeKey] }),
3131
mapKeys(reducers, type => payload => store.dispatch({ type: getQualifiedActionType(type), payload })),
3232
createVirtualStore(store, storeKey)
3333
];

src/tests/createReduxModule.test.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,5 +120,44 @@ describe("duplicate action names", () => {
120120
expect(getCountAState()).toEqual(1);
121121
expect(getCountBState()).toEqual(0);
122122
})
123+
});
124+
125+
126+
describe('use state subset', () => {
127+
const STORE_KEY = 'subsetModeName';
128+
const [useName, {setFirstName, setLastName}] = createReduxModule(
129+
STORE_KEY,
130+
{
131+
firstName: 'Marty',
132+
lastName: 'McFly'
133+
},
134+
{
135+
setFirstName: (state, firstName) => ({ ...state, firstName }),
136+
setLastName: (state, lastName) => ({ ...state, lastName })
137+
}
138+
)
139+
140+
const App = () => {
141+
renderCount++;
142+
return (<p>Hello {useName(({firstName}) => firstName)}!</p>)
143+
}
144+
145+
let renderCount = 0;
146+
147+
it ('initial render', () => {
148+
renderer.create(<Provider><App/></Provider>)
149+
expect(renderCount).toBe(1);
150+
})
123151

152+
// Changing first name should trigger a render
153+
it ('re-render on change', () => {
154+
renderer.act(() => { setFirstName('Emmett') })
155+
expect(renderCount).toBe(2);
156+
})
157+
158+
// Changing last name should not trigger a render
159+
it ('does not re-render on change', () => {
160+
renderer.act(() => { setLastName('Brown') })
161+
expect(renderCount).toBe(2);
162+
})
124163
});

0 commit comments

Comments
 (0)