2017-06-14 121 views
0

我爲我的申請創建了actionreducers。我正在嘗試創建一個新的待辦事項,並希望使用redux將其保存在狀態中。如何使用REDX在待辦事項列表中添加待辦事項

動作/ index.js

let taskID = 0; 

export const addTodo = text => { 
    return { type: "ADD_TODO", text, id: taskID++ }; 
}; 

減速器/ todos.js

const todo = (state = {}, action) => { 
    switch (action.type) { 
    case "ADD_TODO": 
     return { 
     id: action.id, 
     text: action.text, 
     status: false 
     }; 
    default: 
     return state; 
    } 
}; 

export default todo; 

減速器/ index.js

import { combineReducers } from "redux"; 
import todos from "./todos"; 

const todoApp = combineReducers({ todo }); 

export default todoApp; 

index.js

import React from "react"; 
import ReactDOM from "react-dom"; 
import App from "./App"; 
import registerServiceWorker from "./registerServiceWorker"; 
import "./index.css"; 

import { Provider } from "react-redux"; 
import { createStore } from "redux"; 
import todoApp from "./reducers/todos"; 

let store = createStore(todoApp); 

ReactDOM.render(
    <Provider store={store}><App /></Provider>, 
    document.getElementById("root") 
); 
registerServiceWorker(); 

App.js

import React, { Component } from "react"; 
import logo from "./logo.svg"; 
import "./App.css"; 

import AppBar from "material-ui/AppBar"; 
import FloatingActionButton from "material-ui/FloatingActionButton"; 
import MuiThemeProvider from "material-ui/styles/MuiThemeProvider"; 
import * as strings from "./Strings"; 
import * as colors from "./Colors"; 
import styles from "./Styles"; 
import ContentAdd from "material-ui/svg-icons/content/add"; 
import Dialog from "material-ui/Dialog"; 
import FlatButton from "material-ui/FlatButton"; 
import * as injectTapEventPlugin from "react-tap-event-plugin"; 
import TextField from "material-ui/TextField"; 
import { List, ListItem } from "material-ui/List"; 
import { connect } from "react"; 
import { addTodo } from "./actions/index"; 

const AppBarTest =() => 
    <AppBar 
    title={strings.app_name} 
    iconClassNameRight="muidocs-icon-navigation-expand-more" 
    style={{ backgroundColor: colors.blue_color }} 
    />; 

class App extends Component { 
    constructor(props) { 
    injectTapEventPlugin(); 
    super(props); 
    this.state = { 
     open: false, 
     todos: [], 
     notetext: "" 
    }; 
    this.handleChange = this.handleChange.bind(this); 
    } 

    handleOpen =() => { 
    this.setState({ open: true }); 
    }; 

    handleClose =() => { 
    this.setState({ open: false }); 
    }; 

    handleCreateNote =() => { 
    let todos = [...this.state.todos]; 
    todos.push({ 
     id: todos.length, 
     text: this.state.notetext, 
     completed: false 
    }); 
    this.setState({ todos: todos },() => { 
     // setState is async, so this is callback 
    }); 
    this.handleClose(); 
    }; 

    handleChange(event) { 
    this.setState({ [event.target.name]: event.target.value }); 
    } 

    _renderTodos() { 
    return this.state.todos.map(event => { 
     return (
     <ListItem 
      primaryText={event.text} 
      key={event.id} 
      style={{ width: "100%", textAlign: "center" }} 
      onTouchTap={this._handleListItemClick.bind(this, event)} 
     /> 
    ); 
    }); 
    } 

    _handleListItemClick(item) { 
    console.log(item); 
    } 

    render() { 
    return (
     <MuiThemeProvider> 
     <div> 
      <AppBarTest /> 
      <FloatingActionButton 
      style={styles.fab} 
      backgroundColor={colors.blue_color} 
      onTouchTap={this.handleOpen} 
      > 
      <ContentAdd /> 
      </FloatingActionButton> 
      <Dialog 
      open={this.state.open} 
      onRequestClose={this.handleClose} 
      title={strings.dialog_create_note_title} 
      > 
      <TextField 
       name="notetext" 
       hintText="Note" 
       style={{ width: "48%", float: "left", height: 48 }} 
       defaultValue={this.state.noteVal} 
       onChange={this.handleChange} 
       onKeyPress={ev => { 
       if (ev.key === "Enter") { 
        this.handleCreateNote(); 
        ev.preventDefault(); 
       } 
       }} 
      /> 

      <div 
       style={{ 
       width: "4%", 
       height: "1", 
       float: "left", 
       visibility: "hidden" 
       }} 
      /> 

      <FlatButton 
       label={strings.create_note} 
       style={{ width: "48%", height: 48, float: "left" }} 
       onTouchTap={this.handleCreateNote} 
      /> 
      </Dialog> 

      <List style={{ margin: 8 }}> 
      {this._renderTodos()} 
      </List> 

     </div> 
     </MuiThemeProvider> 
    ); 
    } 
} 

export default App; 

我想保存裏面handleCreateNote功能新的待辦事項,我不知道如何使用商店,這裏分派到保存的狀態。誰能幫我 ?

+0

我可以推薦https://learnredux.com/,它可以處理使用redux創建應用程序的幾乎所有內容。 – EatYaFood

回答

1

變化

export default App;

function mapStateToProps(state) { 
    return { 
     todo: todo 
    } 
} 
export default connect(mapStateToProps, actions)(App) 

你也應該使用

import * as actions from './action/index'; 

畢竟這些導入的所有動作修改這個功能如下: -

handleCreateNote =() => { 
    let todos = [...this.state.todos]; 
    let newTodo = { 
     id: todos.length, 
     text: this.state.notetext, 
     completed: false 
    }; 
    todos.push(newTodo); 
    this.setState({ todos: todos },() => { 
     // setState is async, so this is callback 
    }); 
    this.props.addTodo(this.state.notetext); 
    this.handleClose(); 
    }; 

您的添加待辦事項的邏輯也不正確。 所以,你的行動創造者應該是這樣的

let taskID = 0; 

export const addTodo = text => { 
    return { 
    type: "ADD_TODO", 
    text: text, 
    id: taskId++ 
    }; 
}; 

現在也減速器需要改變,那麼這應該是這樣的: -

const todo = (state = [], action) => { 
    switch (action.type) { 
    case "ADD_TODO": 
     let newTodo = { 
     id: action.id, 
     text: action.text, 
     status: false 
     }; 
     return [...state, newTodo] 
    default: 
     return state; 
    } 
}; 

export default todo; 

我希望這helps.Not最好的實現,但將解決您的問題。

+0

我想檢查'handleCreateNote'裏面的redux狀態值是什麼方式? –

+0

你可以做this.props.todo來檢查狀態。 – VivekN

+0

如果我想檢查完整的商店,那麼有什麼辦法嗎?正如我有'讓store = createStore(todoApp);'在'index.js'中,並且我想在另一個js文件中訪問它以進行調試 –