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) }; }