Javascript 手变重

Javascript 手变重,javascript,reactjs,redux,Javascript,Reactjs,Redux,我对与Redux相关的handleChange输入有一个问题,它几乎可以工作,但不完全可以,因为当我改变状态时,在一个字段中有状态的改变。猜猜我想实现什么,但是当我在另一个字段中改变时,这个状态从第一个字段消失,并保存在第二个字段中(在下面的图片上,我展示了我的意思)。我有两个中等说服力的想法,那就是,在减速机中"value:action.payload.num|u building | |“”,并在“do”的位置,因此始终存在一些内容,然后当我执行post时,我执行修剪,以便没有空间,post

我对与Redux相关的handleChange输入有一个问题,它几乎可以工作,但不完全可以,因为当我改变状态时,在一个字段中有状态的改变。猜猜我想实现什么,但是当我在另一个字段中改变时,这个状态从第一个字段消失,并保存在第二个字段中(在下面的图片上,我展示了我的意思)。我有两个中等说服力的想法,那就是,在减速机中"value:action.payload.num|u building | |“”,并在“do”的位置,因此始终存在一些内容,然后当我执行post时,我执行修剪,以便没有空间,post将作为空值飞行,或者代替“”在同一位置执行state。num_building.value在一个字段中,state.test.value在另一个字段中,但这里是问题是,如果我键入某个内容,然后删除整个输入,则始终会有我们键入的文本的第一个字母,我不知道如何删除它:(

Slicer.js

import { createSlice } from '@reduxjs/toolkit';

export const numberBuildingSlice = createSlice({
  name: 'number_building',
  initialState: {
    num_building: { key: 'num_building', value: '' },
    test: { key: 'test', value: '' },
  },
  reducers: {
    inputChange: (state, action) => {
      return {
        ...state,
        num_building: {
          ...state.num_building,
          value: action.payload.num_building || state.num_building.value,
        },
        test: {
          ...state.test,
          value: action.payload.test || ' ',
        },
      };
    },
  },
});

export const { inputChange } = numberBuildingSlice.actions;

export const numberBuildingState = (state) => state.number_building;

export default numberBuildingSlice.reducer;
组件

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import axios from 'axios';
import {
  numberBuildingState,
  inputChange,
} from '../redux/slices/numberBuildingSlice';
import LabelInput from '../reusable-components/LabelInput';

const URL = 'http://localhost:8000/numbers-buildings/';

function AddNumberBuilding() {
  const numberBuilding = useSelector(numberBuildingState);
  const dispatch = useDispatch();
  const { value } = numberBuilding.num_building;

  const handleChange = async (event) => {
    const response = await dispatch(
      inputChange({ [event.target.name]: event.target.value }),
    );
    console.log(response);
  };

  function postNumberBuilding() {
    const jsonData = { num_building: value };
    axios
      .post(URL, jsonData)
      .then((res) => {
        console.log(res);
      })
      .catch((error) => console.error(error.response));
  }

  return (
    <div>
      <input
        name="num_building"
        onChange={handleChange}
        {...numberBuilding.num_building}
      />
      <input name="test" onChange={handleChange} {...numberBuilding.test} />
      <input type="submit" onClick={postNumberBuilding} value="Add New!" />
    </div>
  );
}

export default AddNumberBuilding;

从“React”导入React;
从“react-redux”导入{useSelector,useDispatch};
从“axios”导入axios;
进口{
编号BuildingState,
输入更改,
}来自“../redux/slices/numberBuildingSlice”;
从“../ReusableComponents/LabelInput”导入LabelInput;
常量URL=http://localhost:8000/numbers-建筑物;;
函数AddNumberBuilding(){
常量numberBuilding=useSelector(numberBuildingState);
const dispatch=usedpatch();
const{value}=numberBuilding.num_building;
const handleChange=async(事件)=>{
const response=等待调度(
inputChange({[event.target.name]:event.target.value}),
);
控制台日志(响应);
};
函数postNumberBuilding(){
const jsonData={num_building:value};
axios
.post(URL,jsonData)
。然后((res)=>{
控制台日志(res);
})
.catch((error)=>console.error(error.response));
}
返回(
);
}
导出默认AddNumberBuilding;

您正在更新reducer中的两个值,即使您只发送一个变量以在分派函数中更新

解决方案是使用动态密钥访问器

reducers: {
    inputChange: (state, action) => {
      const key = Object.keys(action.payload)[0];
      return {
        ...state,
        [key ]: {
          ...state[action.payload[key]],
          value: action.payload[key ] || state.num_building.value,
        },
      };
    },
  },

另一方面,您不需要使用扩展模式。Redux Toolkit使用它创建状态对象的代理。您只需执行以下操作:
state.num_building.value=action.payload.num_building | | state.num_building.value
非常感谢!在您的第一个版本中,当我在输入Redux sta中写入内容时,有些东西不起作用te没有得到更改,但第二个版本正在运行!再次感谢您!