【问题标题】:how to update FieldArray elements with redux store variable如何使用 redux 存储变量更新 FieldArray 元素
【发布时间】:2020-12-06 08:01:56
【问题描述】:
  • 我正在使用带有 FieldArray 的 redux-form。默认情况下,数组中有 1 个元素,它是从 JSON 填充的。我最多可以加 3 FieldArray 组件中的元素。

  • 在下面的代码中,'elementList' 属性来自 JSON,而且我有存储变量命名 作为“元素”和“元素列表”。我用 elementList 初始化这些存储变量 首先从 JSON 开始,然后在“添加”时不断更新存储变量 元素'被点击。我可以看到商店变量正在更新 正确但在屏幕上字段数组元素没有更新。这可能是因为字段数组中的名称属性“元素列表”可能指 JSON 元素。

    是否可以,如果我可以在名称属性中引用存储变量“elementList”或“elements” 'FieldArray'。请指教。

主页

  <div>
      <FieldArray name="elementList" component={Elements}
                  props={this.props}/>
      <button type="button" className="btn btn-primary"
              onClick={event => this.addElement(elementDTO)}>Add Element
      </button>
      <br/>
  </div>
  
  addElement(elementDTO){
        if(this.props.elements && this.props.elements!=undefined && this.props.elements.length >= 3){
            return;
        }
        this.props.addReqElement(this.props.elements);
    }

字段数组页面

const elements= ({props, meta: {error, submitFailed}}) => {
    const {fields} = props;
    return (
    {fields.map((element, index) => (
     <div> 
            //Field definitions
     </div>
))}

谢谢

更新: 从 Redux Action 和 Reducer 添加方法

 export function addReqElement(childList) {
         let state = store.getState()
         let newChild= 
            state.requestReducer.DTOobj.requestDoc;  //this is an empty element coming from backend with few properties and adding rest of the //proerties as below to create a new child 
        newChild.prop1 = null
        newChild.prop2 = null
        childList.push(newChild)
        return (dispatch) => {
            dispatch(setDoc(childList));
        }
    }
    

export function setDoc(payload) {
    return {
        type: ADD_DOC,
        payload: payload
    }
}

更新 2:我尝试删除 push 并使用了 spread operator ,但没有奏效。我也有内部数组,因为我正在使用不同的策略。我取拉父数组,它是索引并用新的内部数组更新父数组。它可以工作,但父数组我不知道我应该如何使它工作。我试图将主数组设置为表单道具并通过调度一个动作来呈现整个页面,但它不起作用。有什么建议吗?

从主数组页面:

render() {
   const {fields, parentArrayFromStore} = this.props;
    return (
       <div className="col-sm-12">
          {fields.map((doc, index) => (
           <div key={index}>
            <div className="col-sm-12">
              <FieldArray name={`${doc}.innerArrayList`} component={CustomInnerArrayComponent}/>
            </div>
            <div className="row">
               <div className="col-sm-4">
                  <button type="button" className="btn btn-primary"
                          onClick={event => this.addInnerArray(index, parentArrayFromStore ,fields.get(index).innerArrayList)}>Add Printer
                   </button>
                </div>
            </div>
        </div>
    ))}
    </div>)
            }
                
        

在动作类中

export function addInnerArray(index, parentArrayFromStore, innerArrayList) {
    let newInnerItem= {};
    newInnerItem.prop1 = null
    newInnerItem.prop2 = null
   
    innerArrayList.push(newInnerItem)
    parentArrayFromStore[index].innerArrayList = innerArrayList;

    return (dispatch) => {
        dispatch(setParentArray(parentArrayFromStore));
    }
}

export function setParentArray(payload) {
    return {
        type: ADD_DOC,
        payload: payload
    }
}

【问题讨论】:

  • 你不能在elementList 中追加新元素,或者保存elementList 的副本然后追加吗?另外,请在codesandbox / stackblitz中添加一个工作示例。
  • 您好 Rahul,我尝试创建一个新列表并附加现有列表和新子列表,但没有成功。你能提供一些样品吗?我是 UI 开发的新手,所以需要检查是否将该代码单独放在沙箱中
  • 嗨@Khushi你能用这个fn“addReqElement”中使用的语句更新你的问题吗?我建议在 mainpage 构造函数中有一个将数组作为输入的状态,并在“addReqElement”中使用 setstate 更新该状态,不要使用 push/splice 等改变状态数组

标签: javascript arrays json reactjs redux


【解决方案1】:

您好,问题在于函数中的 push 语句在更新构造函数或 reducer 中的状态时使用 concat 或 spread operator[...]> 我已经在here 上做了一个样本 请检查

onAddItem() {
        let list = [...this.state.items, {text:`Check 1`}];
        this.setState({items:list});
}

在您的情况下,您可以执行以下操作

let arr = [...childList, newChild]

然后派发arr

 dispatch(setDoc(arr));

【讨论】:

  • 谢谢,但我已经尝试过使用扩展运算符,但它失败了。仅供参考,我在这个数组中还有一个数组。这工作正常,因为我正在获取完整的父数组和父数组的索引,并在子数组中推送新的子元素。我已经用 update 2 更新了问题,我没有如何以类似的方式更新父数组,我什至尝试获取新的父数组列表并将其设置为主表单并发送完整表单的操作,但我没有获得任何成功有了这个:(谢谢你的努力
  • 在这种情况下你可以分享你的reducer吗
猜你喜欢
  • 2018-10-12
  • 2021-10-10
  • 2020-02-12
  • 2017-05-29
  • 2020-10-15
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多