react-redux 的 todomvc

來源:互聯網
上載者:User

標籤:todomvc

下文有專案檔下載

在項目目錄中執行 npm install 安裝依賴,install  start 啟動項目,網頁會自動開啟

index.js
import React from ‘react‘import { render } from ‘react-dom‘import { createStore } from ‘redux‘import { Provider } from ‘react-redux‘import App from ‘./containers/App‘import todoApp from ‘./reducers‘let store = createStore(todoApp)let rootElement = document.getElementById(‘root‘)render(  <Provider store={store}>    <App />  </Provider>,  rootElement)
Action 建立函數和常量 actions.js
/* * action 類型 */export const ADD_TODO = ‘ADD_TODO‘;export const COMPLETE_TODO = ‘COMPLETE_TODO‘;export const SET_VISIBILITY_FILTER = ‘SET_VISIBILITY_FILTER‘/* * 其它的常量 */export const VisibilityFilters = {  SHOW_ALL: ‘SHOW_ALL‘,  SHOW_COMPLETED: ‘SHOW_COMPLETED‘,  SHOW_ACTIVE: ‘SHOW_ACTIVE‘};/* * action 建立函數 */export function addTodo(text) {  return { type: ADD_TODO, text }}export function completeTodo(index) {  return { type: COMPLETE_TODO, index }}export function setVisibilityFilter(filter) {  return { type: SET_VISIBILITY_FILTER, filter }}
Reducers reducers.js
import { combineReducers } from ‘redux‘import { ADD_TODO, COMPLETE_TODO, SET_VISIBILITY_FILTER, VisibilityFilters } from ‘./actions‘const { SHOW_ALL } = VisibilityFiltersfunction visibilityFilter(state = SHOW_ALL, action) {  switch (action.type) {    case SET_VISIBILITY_FILTER:      return action.filter    default:      return state  }}function todos(state = [], action) {  switch (action.type) {    case ADD_TODO:      return [        ...state,        {          text: action.text,          completed: false        }      ]    case COMPLETE_TODO:      return [        ...state.slice(0, action.index),        Object.assign({}, state[action.index], {          completed: true        }),        ...state.slice(action.index + 1)      ]    default:      return state  }}const todoApp = combineReducers({  visibilityFilter,  todos})export default todoApp
容器組件 containers/App.js
import React, { Component, PropTypes } from ‘react‘import { connect } from ‘react-redux‘import { addTodo, completeTodo, setVisibilityFilter, VisibilityFilters } from ‘../actions‘import AddTodo from ‘../components/AddTodo‘import TodoList from ‘../components/TodoList‘import Footer from ‘../components/Footer‘class App extends Component {  render() {    // Injected by connect() call:    const { dispatch, visibleTodos, visibilityFilter } = this.props    return (      <div>        <AddTodo          onAddClick={text =>            dispatch(addTodo(text))          } />        <TodoList          todos={visibleTodos}          onTodoClick={index =>            dispatch(completeTodo(index))          } />        <Footer          filter={visibilityFilter}          onFilterChange={nextFilter =>            dispatch(setVisibilityFilter(nextFilter))          } />      </div>    )  }}App.propTypes = {  visibleTodos: PropTypes.arrayOf(PropTypes.shape({    text: PropTypes.string.isRequired,    completed: PropTypes.bool.isRequired  }).isRequired).isRequired,  visibilityFilter: PropTypes.oneOf([    ‘SHOW_ALL‘,    ‘SHOW_COMPLETED‘,    ‘SHOW_ACTIVE‘  ]).isRequired}function selectTodos(todos, filter) {  switch (filter) {    case VisibilityFilters.SHOW_ALL:      return todos    case VisibilityFilters.SHOW_COMPLETED:      return todos.filter(todo => todo.completed)    case VisibilityFilters.SHOW_ACTIVE:      return todos.filter(todo => !todo.completed)  }}// Which props do we want to inject, given the global state?// Note: use https://github.com/faassen/reselect for better performance.function select(state) {  return {    visibleTodos: selectTodos(state.todos, state.visibilityFilter),    visibilityFilter: state.visibilityFilter  }}// 封裝 component ,注入 dispatch 和 state 到其預設的 connect(select)(App) 中;export default connect(select)(App)
展示組件 components/AddTodo.js
import React, { Component, PropTypes } from ‘react‘export default class AddTodo extends Component {  render() {    return (      <div>        <input type=‘text‘ ref=‘input‘ />        <button onClick={(e) => this.handleClick(e)}>          Add        </button>      </div>    )  }  handleClick(e) {    const node = this.refs.input    const text = node.value.trim()    this.props.onAddClick(text)    node.value = ‘‘  }}AddTodo.propTypes = {  onAddClick: PropTypes.func.isRequired}
components/Footer.js
import React, { Component, PropTypes } from ‘react‘export default class Footer extends Component {  renderFilter(filter, name) {    if (filter === this.props.filter) {      return name    }    return (      <a href=‘#‘ onClick={e => {        e.preventDefault()        this.props.onFilterChange(filter)      }}>        {name}      </a>    )  }  render() {    return (      <p>        Show:        {‘ ‘}        {this.renderFilter(‘SHOW_ALL‘, ‘All‘)}        {‘, ‘}        {this.renderFilter(‘SHOW_COMPLETED‘, ‘Completed‘)}        {‘, ‘}        {this.renderFilter(‘SHOW_ACTIVE‘, ‘Active‘)}        .      </p>    )  }}Footer.propTypes = {  onFilterChange: PropTypes.func.isRequired,  filter: PropTypes.oneOf([    ‘SHOW_ALL‘,    ‘SHOW_COMPLETED‘,    ‘SHOW_ACTIVE‘  ]).isRequired}
components/Todo.js
import React, { Component, PropTypes } from ‘react‘export default class Todo extends Component {  render() {    return (      <li        onClick={this.props.onClick}        style={{          textDecoration: this.props.completed ? ‘line-through‘ : ‘none‘,          cursor: this.props.completed ? ‘default‘ : ‘pointer‘        }}>        {this.props.text}      </li>    )  }}Todo.propTypes = {  onClick: PropTypes.func.isRequired,  text: PropTypes.string.isRequired,  completed: PropTypes.bool.isRequired}
components/TodoList.js
import React, { Component, PropTypes } from ‘react‘import Todo from ‘./Todo‘export default class TodoList extends Component {  render() {    return (      <ul>        {this.props.todos.map((todo, index) =>          <Todo {...todo}                key={index}                onClick={() => this.props.onTodoClick(index)} />        )}      </ul>    )  }}TodoList.propTypes = {  onTodoClick: PropTypes.func.isRequired,  todos: PropTypes.arrayOf(PropTypes.shape({    text: PropTypes.string.isRequired,    completed: PropTypes.bool.isRequired  }).isRequired).isRequired}


react-redux 的 todomvc

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.