简体   繁体   English

React Redux 功能组件更新 state 不工作

[英]React Redux functional component updating state not working

My data looks like this:我的数据如下所示:

{

  '004': [
      {
          year_week: '2020-W1',
          actual_bank_amount: '6500000',
          ext_in_rental_income: '',
          ext_in_tax_refund: '',
          ext_in_dividends_income: ''
      },
      {
          year_week: '2020-W2',
          actual_bank_amount: '6500000',
          ext_in_rental_income: '',
          ext_in_tax_refund: '',
          ext_in_dividends_income: ''
      }

  ],
  '007': [
      {
          year_week: '2020-W22',
          actual_bank_amount: '65050000',
          ext_in_rental_income: '30000',
          ext_in_tax_refund: '',
          ext_in_dividends_income: ''
      }

  ]
},

I am trying to update say date for year_week '2020-W1' in '004'.我正在尝试更新“004”中 year_week“2020-W1”的说日期。

No problem with action and reducer but data is not updated in the list. action 和 reducer 没有问题,但列表中的数据没有更新。

Below is my reducer:下面是我的减速器:

case 'UPDATE':
  state.planningData[action.payload.currentSite].map((item, index) => {
    if (item.year_week === action.payload.data.year_week) {
      return Object.assign({}, item, action.payload.data);
    }
    return item;
  });
  console.log(state)

  return {
    loading: true,
    planningData: state.planningData,
    error: ''
  }

What I am doing wrong please.请问我做错了什么。 Btw when I do console log or run redux extension I see the updated state.顺便说一句,当我执行控制台日志或运行 redux 扩展时,我看到更新的 state。

Below is my action creator:以下是我的动作创作者:

export const update = (data) =>

    (dispatch, getState) => {
        console.log("Update action called" + JSON.stringify(data))
        const currentSite = getState().sites.currentSite;
        dispatch({
            type: 'UPDATE',
            payload: {
                data: data,
                currentSite: currentSite
            }

        });
    };

btw I am calling it from a editable cell component on "enter" and blur event below is my code顺便说一句,我是从“输入”上的可编辑单元格组件调用它的,下面的模糊事件是我的代码

 const save = async e => {
        try {
            const values = await form.validateFields();

            toggleEdit();
            dispatch(update({ ...record, ...values }));
        } catch (errInfo) {
            console.log('Save failed:', errInfo);
        }
    };


This isn't pretty but it works.这不是很漂亮,但它有效。 You had a bit of nested data in your state and it wasn't being updated properly.您的 state 中有一些嵌套数据,但未正确更新。


    case "UPDATE":
      let updatedPlanningData = {};
      for (let prop in state.planningData) {
        if (prop === action.payload.currentSite) {
          updatedPlanningData[action.payload.currentSite] = state.planningData[
            action.payload.currentSite
          ].map((item, index) => {
            if (item["year_week"] === action.payload.data.year_week) {
              return Object.assign({}, item, action.payload.data);
            }
            return item;
          });
        } else {
          updatedPlanningData.prop = state.planningData[prop];
        }
      }
      return {
        loading: true,
        planningData: updatedPlanningData,
        error: ""
      };

Here is example code in codesandbox这是codesandbox中的示例代码

Edit: more compact solution编辑:更紧凑的解决方案

let updatedPlanningData = {...state.planningData};

updatedPlanningData[action.payload.currentSite].map((item, index) => {
        if (item["year_week"] === action.payload.data.year_week) {
          return Object.assign(item, action.payload.data);
        }
        return item;
      });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM