Redux: Better way for private/public selectors
As this course suggests, private selectors are repeated as public selectors to be used on the full state.
- Private selectors used on slice.
- Public selectors used on full state.
But this will result in:
- Repeating code
- Flooding the the namespace of the public selectors
Is there a better way to organize selectors?
Original example:
Root Reducer & public selector:
// reducers/index.js
import todos, * as fromTodos from './todos';
// Reducer
export default combineReducers({
todos
});
// Private selector
getVisibleTodos(state, filter) {
return fromTodos.getVisibleTodos(state.todos, filter);
}
Slice Reducer & private selector:
// reducers/todos.js
// Reducer
export default (state, action) => {
switch(action.type){
case 'ADD_TODO':
// ...
break;
// Handle other actions ...
}
}
// Private selector
getVisibleTodos(state, filter) {
switch(filter) {
case 'all':
return todos;
case 'completed':
return state.filter(t => t.completed);
// Other cases ...
}
}
Using the selector:
const mapStateToProps = (state, {params}) => ({
todos: getVisibleTodos(state, params.filter || 'all')
});
javascript redux react-redux
add a comment |
As this course suggests, private selectors are repeated as public selectors to be used on the full state.
- Private selectors used on slice.
- Public selectors used on full state.
But this will result in:
- Repeating code
- Flooding the the namespace of the public selectors
Is there a better way to organize selectors?
Original example:
Root Reducer & public selector:
// reducers/index.js
import todos, * as fromTodos from './todos';
// Reducer
export default combineReducers({
todos
});
// Private selector
getVisibleTodos(state, filter) {
return fromTodos.getVisibleTodos(state.todos, filter);
}
Slice Reducer & private selector:
// reducers/todos.js
// Reducer
export default (state, action) => {
switch(action.type){
case 'ADD_TODO':
// ...
break;
// Handle other actions ...
}
}
// Private selector
getVisibleTodos(state, filter) {
switch(filter) {
case 'all':
return todos;
case 'completed':
return state.filter(t => t.completed);
// Other cases ...
}
}
Using the selector:
const mapStateToProps = (state, {params}) => ({
todos: getVisibleTodos(state, params.filter || 'all')
});
javascript redux react-redux
Can you provide a working example?
– David Lemon
Nov 13 '18 at 10:00
I've enhanced the example. Notice redefining the selector once as private selector and another time as a public selector. The question is about avoiding this repetition.
– Meena Alfons
Nov 13 '18 at 10:15
1
Selectors are usually pure functions so can be moved to their own module without issue. For inspiration I'd look at reselect
– Davin Tryon
Nov 13 '18 at 10:22
add a comment |
As this course suggests, private selectors are repeated as public selectors to be used on the full state.
- Private selectors used on slice.
- Public selectors used on full state.
But this will result in:
- Repeating code
- Flooding the the namespace of the public selectors
Is there a better way to organize selectors?
Original example:
Root Reducer & public selector:
// reducers/index.js
import todos, * as fromTodos from './todos';
// Reducer
export default combineReducers({
todos
});
// Private selector
getVisibleTodos(state, filter) {
return fromTodos.getVisibleTodos(state.todos, filter);
}
Slice Reducer & private selector:
// reducers/todos.js
// Reducer
export default (state, action) => {
switch(action.type){
case 'ADD_TODO':
// ...
break;
// Handle other actions ...
}
}
// Private selector
getVisibleTodos(state, filter) {
switch(filter) {
case 'all':
return todos;
case 'completed':
return state.filter(t => t.completed);
// Other cases ...
}
}
Using the selector:
const mapStateToProps = (state, {params}) => ({
todos: getVisibleTodos(state, params.filter || 'all')
});
javascript redux react-redux
As this course suggests, private selectors are repeated as public selectors to be used on the full state.
- Private selectors used on slice.
- Public selectors used on full state.
But this will result in:
- Repeating code
- Flooding the the namespace of the public selectors
Is there a better way to organize selectors?
Original example:
Root Reducer & public selector:
// reducers/index.js
import todos, * as fromTodos from './todos';
// Reducer
export default combineReducers({
todos
});
// Private selector
getVisibleTodos(state, filter) {
return fromTodos.getVisibleTodos(state.todos, filter);
}
Slice Reducer & private selector:
// reducers/todos.js
// Reducer
export default (state, action) => {
switch(action.type){
case 'ADD_TODO':
// ...
break;
// Handle other actions ...
}
}
// Private selector
getVisibleTodos(state, filter) {
switch(filter) {
case 'all':
return todos;
case 'completed':
return state.filter(t => t.completed);
// Other cases ...
}
}
Using the selector:
const mapStateToProps = (state, {params}) => ({
todos: getVisibleTodos(state, params.filter || 'all')
});
javascript redux react-redux
javascript redux react-redux
edited Nov 13 '18 at 10:14
Meena Alfons
asked Nov 13 '18 at 8:47
Meena AlfonsMeena Alfons
5231626
5231626
Can you provide a working example?
– David Lemon
Nov 13 '18 at 10:00
I've enhanced the example. Notice redefining the selector once as private selector and another time as a public selector. The question is about avoiding this repetition.
– Meena Alfons
Nov 13 '18 at 10:15
1
Selectors are usually pure functions so can be moved to their own module without issue. For inspiration I'd look at reselect
– Davin Tryon
Nov 13 '18 at 10:22
add a comment |
Can you provide a working example?
– David Lemon
Nov 13 '18 at 10:00
I've enhanced the example. Notice redefining the selector once as private selector and another time as a public selector. The question is about avoiding this repetition.
– Meena Alfons
Nov 13 '18 at 10:15
1
Selectors are usually pure functions so can be moved to their own module without issue. For inspiration I'd look at reselect
– Davin Tryon
Nov 13 '18 at 10:22
Can you provide a working example?
– David Lemon
Nov 13 '18 at 10:00
Can you provide a working example?
– David Lemon
Nov 13 '18 at 10:00
I've enhanced the example. Notice redefining the selector once as private selector and another time as a public selector. The question is about avoiding this repetition.
– Meena Alfons
Nov 13 '18 at 10:15
I've enhanced the example. Notice redefining the selector once as private selector and another time as a public selector. The question is about avoiding this repetition.
– Meena Alfons
Nov 13 '18 at 10:15
1
1
Selectors are usually pure functions so can be moved to their own module without issue. For inspiration I'd look at reselect
– Davin Tryon
Nov 13 '18 at 10:22
Selectors are usually pure functions so can be moved to their own module without issue. For inspiration I'd look at reselect
– Davin Tryon
Nov 13 '18 at 10:22
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53277038%2fredux-better-way-for-private-public-selectors%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53277038%2fredux-better-way-for-private-public-selectors%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Can you provide a working example?
– David Lemon
Nov 13 '18 at 10:00
I've enhanced the example. Notice redefining the selector once as private selector and another time as a public selector. The question is about avoiding this repetition.
– Meena Alfons
Nov 13 '18 at 10:15
1
Selectors are usually pure functions so can be moved to their own module without issue. For inspiration I'd look at reselect
– Davin Tryon
Nov 13 '18 at 10:22