首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用redux在待办事项列表中添加待办事项

如何使用redux在待办事项列表中添加待办事项
EN

Stack Overflow用户
提问于 2017-06-14 11:14:35
回答 1查看 1.5K关注 0票数 0

我已经为我的应用程序创建了actionreducers。我正在尝试创建一个新的待办事项,并希望使用redux在状态下保存它。

行动/索引.

代码语言:javascript
复制
let taskID = 0;

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

还原剂/todos.js

代码语言:javascript
复制
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;

减速器/索引.

代码语言:javascript
复制
import { combineReducers } from "redux";
import todos from "./todos";

const todoApp = combineReducers({ todo });

export default todoApp;

index.js

代码语言:javascript
复制
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

代码语言:javascript
复制
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函数中保存新的待办事项,我不知道如何使用存储,分派到这里来保存它的状态。有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-14 11:57:45

变化

export default App; To

代码语言:javascript
复制
function mapStateToProps(state) {
    return {
        todo: todo
    }
}
export default connect(mapStateToProps, actions)(App)

您还应该使用

代码语言:javascript
复制
import * as actions from './action/index';

在所有这些之后,您的此功能修改如下:

代码语言:javascript
复制
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();
  };

另外,添加待办事项的逻辑是不正确的。所以你的行动创造者应该是这样的

代码语言:javascript
复制
let taskID = 0;

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

现在减速机也需要更换,所以应该是这样的:-

代码语言:javascript
复制
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最好的实现,但将解决您的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44543187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档