Redux Todo 列表示例教程
发布时间:2023-04-06 14:01:45 所属栏目:教程 来源:
导读:这是我们在基础教程里开发的迷你型的任务管理应用的完整源码。
这个代码也在我们的 example 仓库可以找到。 当然也可以在浏览器通过 CodeSandbox 运行.
入口文件
index.js
import React from 'react'
这个代码也在我们的 example 仓库可以找到。 当然也可以在浏览器通过 CodeSandbox 运行.
入口文件
index.js
import React from 'react'
|
这是我们在基础教程里开发的迷你型的任务管理应用的完整源码。 这个代码也在我们的 example 仓库可以找到。 当然也可以在浏览器通过 CodeSandbox 运行. 入口文件 index.js import React from 'react' import { render } from 'react-dom' import { Provider } from 'react-redux' import { createStore } from 'redux' import rootReducer from './reducers' import App from './components/App' const store = createStore(rootReducer) render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') ) 创建 Action actions/index.js let nextTodoId = 0 export const addTodo = text => ({ type: 'ADD_Todo', id: nextTodoId++, text }) export const setVisibilityFilter = filter => ({ type: 'SET_VISIBILITY_FILTER', filter }) export const toggletodo = id => ({ type: 'TOGGLE_Todo', id }) export const VisibilityFilters = { SHOW_ALL: 'SHOW_ALL', SHOW_COMPLETED: 'SHOW_COMPLETED', SHOW_ACTIVE: 'SHOW_ACTIVE' } Reducers reducers/todos.js const todos = (state = [], action) => { switch (action.type) { case 'ADD_Todo': return [ ...state, { id: action.id, text: action.text, completed: false } ] case 'TOGGLE_Todo': return state.map(todo => todo.id === action.id ? { ...todo, completed: !todo.completed } : todo ) default: return state } } export default todos reducers/visibilityFilter.js const visibilityFilter = (state = 'SHOW_ALL', action) => { switch (action.type) { case 'SET_VISIBILITY_FILTER': return action.filter default: return state } } export default visibilityFilter reducers/index.js import { combineReducers } from 'redux' import todos from './todos' import visibilityFilter from './visibilityFilter' export default combineReducers({ todos, visibilityFilter }) 展示组件 components/Todo.js import React from 'react' import PropTypes from 'prop-types' const Todo = ({ onClick, completed, text }) => ( <li onClick={onClick} style={{ textdecoration: completed ? 'line-through' : 'none' }} > {text} </li> ) Todo.propTypes = { onClick: PropTypes.func.isrequired, completed: PropTypes.bool.isrequired, text: PropTypes.string.isrequired } export default Todo components/TodoList.js import React from 'react' import PropTypes from 'prop-types' import Todo from './Todo' const TodoList = ({ todos, toggletodo }) => ( <ul> {todos.map(todo => ( <Todo key={todo.id} {...todo} onClick={() => toggletodo(todo.id)} /> ))} </ul> ) TodoList.propTypes = { todos: PropTypes.arrayOf( PropTypes.shape({ id: PropTypes.number.isrequired, completed: PropTypes.bool.isrequired, text: PropTypes.string.isrequired }).isrequired ).isrequired, toggletodo: PropTypes.func.isrequired } export default TodoList components/Link.js import React from 'react' import PropTypes from 'prop-types' const Link = ({ active, children, onClick }) => ( <button onClick={onClick} disabled={active} style={{ marginLeft: '4px' }} > {children} </button> ) Link.propTypes = { active: PropTypes.bool.isrequired, children: PropTypes.node.isrequired, onClick: PropTypes.func.isrequired } export default Link components/Footer.js import React from 'react' import FilterLink from '../containers/FilterLink' import { VisibilityFilters } from '../actions' const Footer = () => ( <div> <span>Show: </span> <FilterLink filter={VisibilityFilters.SHOW_ALL}>All</FilterLink> <FilterLink filter={VisibilityFilters.SHOW_ACTIVE}>Active</FilterLink> <FilterLink filter={VisibilityFilters.SHOW_COMPLETED}>Completed</FilterLink> </div> ) export default Footer components/App.js import React from 'react' import Footer from './Footer' import AddTodo from '../containers/AddTodo' import VisibletodoList from '../containers/VisibletodoList' const App = () => ( <div> <AddTodo /> <VisibletodoList /> <Footer /> </div> ) export default App 容器组件 containers/VisibletodoList.js import { connect } from 'react-redux' import { toggletodo } from '../actions' import TodoList from '../components/TodoList' const getVisibletodos = (todos, filter) => { switch (filter) { case 'SHOW_COMPLETED': return todos.filter(t => t.completed) case 'SHOW_ACTIVE': return todos.filter(t => !t.completed) case 'SHOW_ALL': default: return todos } } const mapStatetoProps = state => ({ todos: getVisibletodos(state.todos, state.visibilityFilter) }) const mapdispatchToProps = dispatch => ({ toggletodo: id => dispatch(toggletodo(id)) }) export default connect( mapStatetoProps, mapdispatchToProps )(TodoList) containers/FilterLink.js import { connect } from 'react-redux' import { setVisibilityFilter } from '../actions' import Link from '../components/Link' const mapStatetoProps = (state, ownProps) => ({ active: ownProps.filter === state.visibilityFilter }) const mapdispatchToProps = (dispatch, ownProps) => ({ onClick: () => dispatch(setVisibilityFilter(ownProps.filter)) }) export default connect( mapStatetoProps, mapdispatchToProps )(Link) 其他组件 containers/AddTodo.js import React from 'react' import { connect } from 'react-redux' import { addTodo } from '../actions' const AddTodo = ({ dispatch }) => { let input return ( <div> <form onSubmit={e => { e.preventDefault() if (!input.value.trim()) { return } dispatch(addTodo(input.value)) input.value = '' }} > <input ref={node => (input = node)} /> <button type="submit">Add Todo</button> </form> </div> ) } export default connect()(AddTodo) (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
