使用redux完成一个简单版的todoList

首先安装好所需要的插件 

redux

react-redux

然后在main.jsx中写入代码

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

import { Provider } from "react-redux";
import { legacy_createStore } from "redux";

const initialState = {
  todo: [],
};

function reducer(state = initialState, action) {
  let { type, args } = action;
  let todo = null;
  switch (type) {
    case "ADD_TODO":
      // 新增
      todo = [...state.todo];
      todo.push(args);
      return { ...state,todo };
    case "UPDATE_TODO":
      // 更新
      todo = [...state.todo];
      todo[args].isfinish=!todo[args].isfinish;
      return { ...state,todo };
    case "DEL_TODO":
      // 移除
      todo = [...state.todo];
      todo.splice(args,1);
      return { ...state,todo };

    default:
      return state;
  }
}

const store = legacy_createStore(reducer);

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

App.jsx中写入代码

import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
const App = () => {
  let [value, setValue] = useState("");
  let todo = useSelector(state => state.todo);
  let dispatch = useDispatch();
  // input受控
  function changeInp(e) {
    setValue(e.target.value);
  }
  // 点击添加按钮
  let add = () => {
    dispatch({
      type: "ADD_TODO",
      args: { name: value, time: Date.now(), isfinish: false },
    });
  };
  // 复选框受控
  let changeBox=(index)=>{
    dispatch({
      type: "UPDATE_TODO",
      args: index,
    });
  }
  // 删除操作
  let remove=(index)=>{
    dispatch({
      type: "DEL_TODO",
      args: index,
    });
  }
  return (
    <>
      <div>
        <div>
          <input type="text" value={value} onChange={changeInp} />
          <button onClick={add}>添加</button>
        </div>
        <div>事项共:{todo.length}个</div>
        <div>
          <p>未完成事项:</p>
          <ul>
            {todo.map((item, index) => {
              if (!item.isfinish)
                return (
                  <li key={index}>
                    <input
                      type="checkbox"
                      checked={item.isfinish}
                      onChange={changeBox.bind(null, index)}
                    />
                    <span>{item.name}</span>
                    <span>{item.time}</span>
                    <button onClick={remove.bind(null, index)}>删除</button>
                  </li>
                );
            })}
          </ul>
        </div>
        <div>
          <p>已完成事项:</p>
          <ul>
            {todo.map((item, index) => {
              if (item.isfinish)
                return (
                  <li key={index}>
                    <input
                      type="checkbox"
                      checked={item.isfinish}
                      onChange={changeBox.bind(null, index)}
                    />
                    <span>{item.name}</span>
                    <span>{item.time}</span>
                    <button onClick={remove.bind(null, index)}>删除</button>
                  </li>
                );
            })}
          </ul>
        </div>
      </div>
    </>
  );
};
export default App;

css样式自己书写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值