diff --git a/docs/basics/ExampleTodoList.md b/docs/basics/ExampleTodoList.md
index ef8e887462..2a34f823ac 100644
--- a/docs/basics/ExampleTodoList.md
+++ b/docs/basics/ExampleTodoList.md
@@ -127,7 +127,7 @@ import Footer from '../components/Footer';
class App extends Component {
render() {
// Injected by connect() call:
- const { dispatch, visibleTodos, visibilityFilter } = this.props;
+ const { dispatch, todos, filteringCriteria, visibilityFilter } = this.props;
return (
dispatch(completeTodo(index))
} />
@@ -150,6 +151,7 @@ class App extends Component {
}
App.propTypes = {
+ filteringCriteria: PropTypes.func.isRequired,
visibleTodos: PropTypes.arrayOf(PropTypes.shape({
text: PropTypes.string.isRequired,
completed: PropTypes.bool.isRequired
@@ -161,14 +163,14 @@ App.propTypes = {
]).isRequired
};
-function selectTodos(todos, filter) {
+function selectTodos(filter) {
switch (filter) {
case VisibilityFilters.SHOW_ALL:
- return todos;
+ return function(todo){return true}
case VisibilityFilters.SHOW_COMPLETED:
- return todos.filter(todo => todo.completed);
+ return function(todo){return todo.completed};
case VisibilityFilters.SHOW_ACTIVE:
- return todos.filter(todo => !todo.completed);
+ return function(todo){return !todo.completed};
}
}
@@ -176,8 +178,9 @@ function selectTodos(todos, filter) {
// Note: use https://github.com/faassen/reselect for better performance.
function select(state) {
return {
- visibleTodos: selectTodos(state.todos, state.visibilityFilter),
- visibilityFilter: state.visibilityFilter
+ todos: state.todos,
+ visibilityFilter: state.visibilityFilter,
+ filteringCriteria: selectTodos(state.visibilityFilter)
};
}
@@ -301,17 +304,20 @@ export default class TodoList extends Component {
render() {
return (
- {this.props.todos.map((todo, index) =>
- this.props.onTodoClick(index)} />
- )}
+ {this.props.todos.map((todo, index) => {
+ if (this.props.filteringCriteria(todo)) {
+ return this.props.onTodoClick(index)}/>
+ }
+ })}
);
}
}
TodoList.propTypes = {
+ filteringCriteria: PropTypes.func.isRequired,
onTodoClick: PropTypes.func.isRequired,
todos: PropTypes.arrayOf(PropTypes.shape({
text: PropTypes.string.isRequired,
diff --git a/docs/basics/UsageWithReact.md b/docs/basics/UsageWithReact.md
index 8205c5c946..b77d577ed0 100644
--- a/docs/basics/UsageWithReact.md
+++ b/docs/basics/UsageWithReact.md
@@ -66,6 +66,7 @@ I see the following components (and their props) emerge from this brief:
- `onAddClick(text: string)` is a callback to invoke when a button is pressed.
* **`TodoList`** is a list showing visible todos.
- `todos: Array` is an array of todo items with `{ text, completed }` shape.
+ - `filteringCriteria(todo: object)` contains the rules for how TodoList should filter its list of todos.
- `onTodoClick(index: number)` is a callback to invoke when a todo is clicked.
* **`Todo`** is a single todo item.
- `text: string` is the text to show.
@@ -152,17 +153,20 @@ export default class TodoList extends Component {
render() {
return (
- {this.props.todos.map((todo, index) =>
- this.props.onTodoClick(index)} />
- )}
+ {this.props.todos.map((todo, index) => {
+ if (this.props.filteringCriteria(todo)) {
+ return this.props.onTodoClick(index)}/>
+ }
+ })}
);
}
}
TodoList.propTypes = {
+ filteringCriteria: PropTypes.func.isRequired,
onTodoClick: PropTypes.func.isRequired,
todos: PropTypes.arrayOf(PropTypes.shape({
text: PropTypes.string.isRequired,
@@ -244,6 +248,7 @@ export default class App extends Component {
text: 'Learn to connect it to React',
completed: false
}]}
+ filteringCriteria={function(todo){return true}}
onTodoClick={todo =>
console.log('todo clicked', todo)
} />
@@ -313,7 +318,7 @@ import Footer from '../components/Footer';
class App extends Component {
render() {
// Injected by connect() call:
- const { dispatch, visibleTodos, visibilityFilter } = this.props;
+ const { dispatch, todos, filteringCriteria, visibilityFilter } = this.props;
return (
dispatch(completeTodo(index))
} />
@@ -336,7 +342,8 @@ class App extends Component {
}
App.propTypes = {
- visibleTodos: PropTypes.arrayOf(PropTypes.shape({
+ filteringCriteria: PropTypes.func.isRequired,
+ todos: PropTypes.arrayOf(PropTypes.shape({
text: PropTypes.string.isRequired,
completed: PropTypes.bool.isRequired
})),
@@ -347,14 +354,14 @@ App.propTypes = {
]).isRequired
};
-function selectTodos(todos, filter) {
+function selectTodos(filter) {
switch (filter) {
case VisibilityFilters.SHOW_ALL:
- return todos;
+ return function(todo){return true}
case VisibilityFilters.SHOW_COMPLETED:
- return todos.filter(todo => todo.completed);
+ return function(todo){return todo.completed};
case VisibilityFilters.SHOW_ACTIVE:
- return todos.filter(todo => !todo.completed);
+ return function(todo){return !todo.completed};
}
}
@@ -362,8 +369,9 @@ function selectTodos(todos, filter) {
// Note: use https://github.com/faassen/reselect for better performance.
function select(state) {
return {
- visibleTodos: selectTodos(state.todos, state.visibilityFilter),
- visibilityFilter: state.visibilityFilter
+ todos: state.todos,
+ visibilityFilter: state.visibilityFilter,
+ filteringCriteria: selectTodos(state.visibilityFilter)
};
}