reactjs+antd版的todolist实现的四种方式(二)——redux的实现

这一版本的实现效果
请添加图片描述
谨遵数据交互的思路!!!!!!!!!
在这里插入图片描述

入口文件 index.js

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

// redux无法跨层级传递数据,这种方式局限性,不管怎样,我们先实现效果
const render = () => {
  console.log(store.getState(), "store.getState()");
  ReactDOM.render(
    <App
      data={store.getState().counterReducer}  //获取最新的store数据
      onAdd={() => store.dispatch({ type: "INCREMENT" })}
      onJianFa={() => store.dispatch({ type: "DECREMENT" })}
    />,
    document.getElementById("root")
  );
};
render();

store.subscribe(render);

//storejs

import { counterReducer } from "./reducer";
import TodoLists from "./todoReduce";
//多个reducer的拆分使用方法
import { combineReducers, createStore } from "redux";
const reducers = combineReducers({
  counterReducer,
  TodoLists,
});
const store = createStore(reducers);
export default store;

//App.js文件的props传递

import TodoComponents from "./components/TodoComponents";
import "./App.css";
function App(props) {
  let { data, addItem, deleteItem, checkItem } = props;
  return (
    <div>
      <TodoComponents
        data={data}
        addItem={addItem}
        deleteItem={deleteItem}
        checkItem={checkItem}
      ></TodoComponents>
    </div>
  );
}

export default App;

//TodoComponents.js

import React, { Component } from "react";
import "./Todo.css";
import { Button, Input, List, Checkbox, Radio } from "antd";
class TodoComponents extends Component {
  state = {
    title: "",
    radioValue: "a",
  };
  addItemToLists = () => {
    console.log(this.state.title);
    this.setState({
      title: "",
    });
    this.props.addItem({
      title: this.state.title,
      isSelect: false,
    });
  };
  changeValue = (key, e) => {
    this.setState({
      [key]: e.target.value,
    });
  };
  deleteItem = (index) => {
    this.props.deleteItem(index);
  };
  changeChecked = (index) => {
    console.log(this.state.list, "onChange");
    this.props.checkItem(index);
  };
  changeRadio = (e) => {
    const value = e.target.value;
    this.setState({
      radioValue: e.target.value,
    });
    }
  };
  render() {
    let { title, radioValue } = this.state;
    let { list } = this.props.data.TodoLists;

    //计算总数
    const totalSum = list.length;
    //计算已完成
    const hasFinished = list.filter((item) => item.isSelect).length;
    //计算未完成
    const noFinished = list.filter((item) => !item.isSelect).length;
    return (
      <div className="content">
        <Input
          value={title}
          allowClear
          onPressEnter={this.addItemToLists}
          onChange={(e) => this.changeValue("title", e)}
          style={{ width: "200px" }}
        />
        <Button onClick={this.addItemToLists} type="primary">
          确定
        </Button>
        <div style={{ width: "258px" }}>
          <List
            bordered
            dataSource={list}
            renderItem={(item, index) => {
              return (
                <div>
                  <List.Item>
                    <Checkbox onChange={() => this.changeChecked(index)} />
                    <span className={item.isSelect ? "isChecked" : ""}>
                      {item.title}
                    </span>
                    <Button onClick={() => this.deleteItem(index)}>删除</Button>
                  </List.Item>
                </div>
              );
            }}
          />
        </div>
        <div>
          <Radio.Group
            value={radioValue}
            size="large"
            onChange={this.changeRadio}
          >
            <Radio.Button value="a">
              <span>全部:{totalSum}</span>
            </Radio.Button>
            <Radio.Button value="b">
              <span>已完成:{hasFinished}</span>
            </Radio.Button>
            <Radio.Button value="c">
              <span>未完成:{noFinished}</span>
            </Radio.Button>
          </Radio.Group>
        </div>
      </div>
    );
  }
}

export default TodoComponents;

//todoReduce,js重点-----将组件内的数据计算转移到了reducer之中

function TodoLists(
  state = {
    list: [],
  },
  actions
) {
  switch (actions.type) {
    case "addItem":
      return { ...state, list: [...state.list, actions.payload] };
    case "deleteItem":
      let list = state.list;
      list.splice(actions.payload, 1);
      return { ...state, list };
    case "checkedItem":
      let lists = state.list;
      lists[actions.payload].isSelect = !lists[actions.payload].isSelect;
      return { ...state, list: lists };
    default:
      return state;
  }
}

//封装的actionCreators方法
export function addItem(data) {
  return {
    type: "addItem",
    payload: data,
  };
}
export function deleteItem(index) {
  return {
    type: "deleteItem",
    payload: index,
  };
}

export function checkedItem(index) {
  return {
    type: "checkedItem",
    payload: index,
  };
}
export default TodoLists;

总结

这样,我们实现了跟上一个版本一样的功能
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值