React Redux:如何根据将要更改的数据创建状态对象以及如何更新每个对象中的各个元素

如何解决React Redux:如何根据将要更改的数据创建状态对象以及如何更新每个对象中的各个元素

问题:我不知道如何组织状态以轻松地对其进行更改。它作为对象数组检索。它被映射到组件中,但是要对单个元素进行更新,然后找出如何在数据库中更新这些元素。

应用程序设置:React Redux Saga Node Express Postgres

fetch调用检索一个对象数组(用户详细信息),将其添加到状态对象中,然后将该数组用于映射具有4个输入的组件。我希望能够更改任何对象的任何元素并将其更新为状态。然后,我将添加访存以更新对数据库原始数据的任何更改。我正在寻找诸如网站,书籍,课程等信息,这些信息将有助于建立基础,以便我可以解决此问题。

下面供参考的是我的代码的各个部分;

数据

userData: Array(4)
0: {firstname: "shane",surname: "smith",email: "shanesmith@gmail.com",auth: false}
1: {firstname: "Sahne",surname: "Smith",email: "shane@gmail.com",auth: false}
etc....

减速器

    FETCH_ADMIN_PAGE_START,FETCH_ADMIN_PAGE_SUCCESS,FETCH_ADMIN_PAGE_FAILURE,UPDATE_ADMIN_USER_DATA,} from "../types/types";

// import utility functions

const INITIAL_STATE = {
    isFetching: false,userData: [],errorMessage: null,};

const adminReducer = (state = INITIAL_STATE,action) => {
    switch (action.type) {
        case FETCH_ADMIN_PAGE_START:
            return {
                ...state,isFetching: true,};
        case FETCH_ADMIN_PAGE_SUCCESS:
            return {
                ...state,isFetching: false,userData: action.payload.user[0],};
        case FETCH_ADMIN_PAGE_FAILURE:
            return {
                ...state,errorMessage: action.payload,};
        case UPDATE_ADMIN_USER_DATA:
            return {
                ...state,userData: [haven't found a silution],};
        default:
            return state;
    }
};

export default adminReducer; 

动作

import {
    FETCH_ADMIN_PAGE_START,} from "../types/types";

export const fetchAdminPageStart = () => ({
    type: FETCH_ADMIN_PAGE_START,});

export const fetchAdminPageSuccess = (data) => ({
    type: FETCH_ADMIN_PAGE_SUCCESS,payload: data,});

export const fetchAdminPageFailure = (errorMessage) => ({
    type: FETCH_ADMIN_PAGE_FAILURE,payload: errorMessage,});

export const updataAdminUserData = (data) => ({
    type: UPDATE_ADMIN_USER_DATA,});

组件

import * as React from "react";
import { useState,useEffect } from "react";
import { connect } from "react-redux";
import { createStructuredSelector } from "reselect";
import PropTypes from "prop-types";

// Material Ui Componnents
import AppBar from "@material-ui/core/AppBar";
import Tab from "@material-ui/core/Tab";

//Components
import UserDetailsComponent from "../../components/container-withheader/users-details.component";
// Styled Components
import { StyledTabs } from "./admin-page.styles";
// Selectors
import { selectAdminPageUserData } from "../../redux/admin-page/admin-page.selectors";
// Actions
import { updataAdminUserData } from "../../redux/admin-page/admin-page.actions";

const AdminPageComponent = ({ userDetails,updataAdminUserData }) => {
    useEffect(() => {},[]);

    // const [userData,setUserData] = useState({ users: userDetailData });

    const [selectedTab,setSelectedTab] = useState(0);

    const handleTabChange = (event,newValue) => {
        setSelectedTab(newValue);
    };

    const handleChangeData = (event) => {
        console.log(event.target.name);
        return updataAdminUserData(event.target);
    };

    const handleToggleChange = (event) => {
        console.log(event.target);
        return updataAdminUserData(event.target);
    };

    const tabArray = ["Users","Options"];
    return (
        <div>
            <AppBar position='static' color='default'>
                <StyledTabs
                    value={selectedTab}
                    onChange={handleTabChange}
                    variant='scrollable'
                    scrollButtons='auto'
                    aria-label='scrollable auto tabs example'
                >
                    {tabArray.map((tab,i) => (
                        <Tab label={tab} key={i} />
                    ))}
                </StyledTabs>
            </AppBar>

            {selectedTab === 0 && (
                <UserDetailsComponent
                    userData={userDetails}
                    handleChangeData={handleChangeData}
                    handleToggleChange={handleToggleChange}
                />
            )}
        </div>
    );
};

AdminPageComponent.propTypes = {
    userDetails: PropTypes.object,updataAdminUserData: PropTypes.func,};

const mapStateToProps = createStructuredSelector({
    userDetails: selectAdminPageUserData,});

const mapDispatchToProps = (dispatch) => ({
    updataAdminUserData: (data) => dispatch(updataAdminUserData(data)),});

export default connect(mapStateToProps,mapDispatchToProps)(AdminPageComponent);

以上的子组件

import React,{ useState } from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import FormControlLabel from "@material-ui/core/FormControlLabel";
import Switch from "@material-ui/core/Switch";
import PropTypes from "prop-types";

// Styled Components
import {
    StyledToolBar,GridContainer,RightElement,StyledTextField,StyledSwitch,} from "./users-details.styles";

const useStyles = makeStyles((theme) => ({
    root: {
        flexGrow: 1,},}));

const UserDetailsComponent = ({
    userData,handleChangeData,handleToggleChange,}) => {
    const classes = useStyles();
    const [edit,setEdit] = useState({
        editUser: true,});
    const handleEditChange = (event) => {
        setEdit({ ...edit,[event.target.name]: event.target.checked });
    };

    return (
        <div className={classes.root}>
            <br></br>
            <StyledToolBar elevation={3}>
                <GridContainer>
                    <RightElement>
                        <FormControlLabel
                            control={
                                <Switch
                                    checked={edit.editUser}
                                    onChange={handleEditChange}
                                    name='editUser'
                                />
                            }
                            label='Edit User'
                        />
                    </RightElement>
                </GridContainer>
            </StyledToolBar>
            <br></br>
            <Paper styles={{ paddingTop: "2rem" }} elevation={3}>
                <form className={classes.root} noValidate autoComplete='on'>
                    {userData.map((user,i) => (
                        <div key={i}>
                            <StyledTextField
                                name={Number(i)}
                                title={"Enter first name here"}
                                alt={"firstname"}
                                id={`firstname`}
                                input={`firstname`}
                                onChange={handleChangeData}
                                disabled={edit.editUser}
                                label='First Name'
                                value={user.firstname}
                                variant='outlined'
                            />
                            <StyledTextField
                                name={Number(i)}
                                id={"surname"}
                                disabled={edit.editUser}
                                label='Surame'
                                value={user.surname}
                                variant='outlined'
                            />
                            <StyledTextField
                                name={Number(i)}
                                id={"email"}
                                disabled={edit.editUser}
                                label='Email'
                                value={user.email}
                                variant='outlined'
                            />
                            <React.Fragment>
                                <FormControlLabel
                                    control={
                                        <StyledSwitch
                                            disabled={edit.editUser}
                                            checked={user.auth}
                                            onChange={handleToggleChange}
                                            name={Number(i)}
                                            id={"auth"}
                                        />
                                    }
                                    label='Has Administration Access'
                                />
                            </React.Fragment>
                        </div>
                    ))}
                </form>
            </Paper>
        </div>
    );
};

export default UserDetailsComponent;

如您所见,我还需要找到一种更好的方式来传递信息,以区分我希望修改的每个状态。

我不知道是否应该将数组修改为另一种类型的对象,如果这样做,该如何映射用户。什么是解决此问题的最佳做法。

最终,我只想学习或针对可以帮助我克服此问题的信息方向。任何帮助,如果万分感谢。

谢谢。

解决方法

已解决-转换为对象,名称中使用了多个值,然后拆分为数组。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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-