使用Firebase将动作移动到Redux来响应Todo

如何解决使用Firebase将动作移动到Redux来响应Todo

我正在将react + redux + typescript + firebase用于一个简单的todo应用程序。如果我使用react钩子(如果可能的话,没有其他第三方库)如何将所有动作从组件移动到存储中。 组件/Todo.tsx:

import React from 'react';
import {connect} from 'react-redux';
import Switch from '@material-ui/core/Switch';
import IconButton from '@material-ui/core/IconButton';
import DeleteIcon from '@material-ui/icons/Delete';
import "./Todo.scss";
import {todosRef} from "../../firebase/firebase";

const Todo = (props: any) => {
    const classes = [''];
    const { todo } = props;
    const updateTodo = () => {
        todosRef.child(todo.id).set({...todo,done:!todo.done})
    }
    if (todo.done) {
        classes.push('_completed');
    }
    return (
        <div className="Todo">
            <Switch
                edge="end" checked={todo.done} onChange={updateTodo}
                inputProps={{ "aria-labelledby": "switch-list-label-bluetooth" }}
            />
            <p className={classes.join(' ')}>{todo.task}</p>
            <IconButton aria-label="delete" onClick={e => todosRef.child(todo.id).remove()}>
                <DeleteIcon fontSize="large" />
            </IconButton>
        </div>
    );
}
export default connect()(Todo);

components / TodoForm.tsx

import React,{ useState } from "react";
import TextField from '@material-ui/core/TextField';
import {todosRef} from "../../firebase/firebase";

const TodoForm:React.FC = () => {
    const [title,setTitle] = useState<string>("");
    const createTodo = (e: React.FormEvent<EventTarget>) => {
        e.preventDefault();
        const item = {
            task: title,done: false,};
        todosRef.push(item);
        setTitle("");
    };
    return (
        <form onSubmit={createTodo}>
            <TextField
                style={{ width: "100%" }}
                id="outlined-basic"
                value={title}
                onChange={(e:React.ChangeEvent<HTMLInputElement>) => setTitle(e.target.value)}
                label="Write task"
                variant="outlined"
            />
        </form>
    );
}
export default TodoForm;

components / TodoList.tsx:

import React,{useState,useEffect} from "react";
import Todo from "../Todo/Todo";
import Divider from '@material-ui/core/Divider';
import {todosRef} from "../../firebase/firebase";

const TodoList:React.FC = () => {
    const [todos,setTodos]  = useState<any>([]);
    useEffect(() => {
        todosRef.on('value',(snapshot) => {
            let items = snapshot.val();
            let newState = [];
            for (let item in items) {
                newState.push({
                    id: item,task: items[item].task,done: items[item].done
                });
            }
            setTodos(newState)
        });
    },[])
    return (
        <>
            {todos.map((todo: any,i: number) => (
                <React.Fragment key={todo.id}>
                    <Todo  todo={todo} />
                    {i<todos.length -1 && <Divider />}
                </React.Fragment>
            ))}
        </>
    );
}
export default TodoList;

actions / index.ts:

export const fetchTodos = (todo:any) => {
    return {
        type: 'FETCH_TODOS',payload: todo,}
}
export const addToDo = (setTodos:any) => {
    return {
        type: 'ADD_TODO',payload: setTodos,}
}

export const updateTodo = (todo:any) => {
     return {
         type: 'UPDATE_TODO',}
}

export const removeTodo = (todo:any) => {
    return {
        type: 'REMOVE_TODO',}
}

我开始描述这些动作,但是我不知道该在商店的上下文中写什么。

const initialState = {
    todos: [],setTodos: [],}
export default (state = initialState,action:any) => {
    switch (action.type) {
        case FETCH_TODOS:
            return {
                ...state,todo:action.payload
            };
        case REMOVE_TODO:
                ...
        default:
            return state;
    ...

如果您能用几个示例(而不是任何示例)指出我应该使用哪种类型,我也将不胜感激,因为我仍然不熟悉打字稿

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-