Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更改对象的值_Javascript_Reactjs - Fatal编程技术网

Javascript 更改对象的值

Javascript 更改对象的值,javascript,reactjs,Javascript,Reactjs,嗨,我有以下对象,基本上它是react应用程序中的一个状态。因此,我想要实现的是,创建一个函数,该函数可以根据在函数中传递的内容更改键的值,然后更新状态。在该函数中,我可以发送多个键来更改其值,当前发送showProduct,但也可以发送isEditable。此外,我还需要更改字符串中的id let obj = { id: "", isEditable: false, showProduct: false, shipment: false, c

嗨,我有以下对象,基本上它是react应用程序中的一个状态。因此,我想要实现的是,创建一个函数,该函数可以根据在函数中传递的内容更改键的值,然后更新状态。在该函数中,我可以发送多个键来更改其值,当前发送showProduct,但也可以发送isEditable。此外,我还需要更改字符串中的id

let obj = { id: "",
    isEditable: false,
    showProduct: false,
    shipment: false,
    create_shipment: false}
这就是我尝试过的,比如检查名称是否等于key,然后对其进行操作。这是正确的方法吗

const handler = (name,id) => {
  const prevState = {...obj}
  for (let [key, value] of Object.entries(prevState)) {
  if(key === name) {
    key = !value
  }
}
setState(prevState)
}

handler('showProduct',id)

可以使用动态键标识要更新的特定属性

const handler = (name, id) => {
  setState(prevState => ({
    ...prevState, // shallow copy state
    id: id ?? prevState.id, // updates id if not null/undefined
    [name]: !prevState[name], // toggle property by dynamic key
  }));
};

如果您想使用单个函数来更改对象的值,则需要传递两个参数。要更改的第一个键和第二个值

因此,您需要更改您的函数,如下所示:-

  const handler = (key, value) => {
    setState(prevState => ({
      ...prevState,
      [key]: value
    }));
  };

  handler("showProduct", true)
  handler("id", "newId")

不应将SetState用于对象状态值。顺便说一句,你可以使用useReducer

const initState = { 
    id: "",
    isEditable: false,
    showProduct: false,
    shipment: false,
    create_shipment: false
}

const objReducer = (state, action) =; {
  switch (action.type) {
    case "MODIFY_OBJECT":
      return {
        ...state,
        [action.payload.key]: [action.payload.value]      
};
    default:
      throw new Error();
  }
};


const [state, dispatch] = useReducer(objReducer, initState);
然后,您可以通过如下方式分派操作来修改对象:

dispatch({ type: "MODIFY_OBJECT", payload:{key: 'id', value: 'newId'}});

不是真的。另外,在哪里使用传递的id参数?这是用来替换对象的id属性的吗?您询问的是正确的方法,答案可能很宽泛。您发布的代码可以完成它的工作,但这是处理状态的最佳方式吗?更新,谢谢@tj使用状态挂钩是可以接受的。若状态更复杂并且有嵌套属性,那个么我倾向于同意usereducer可能是一个更好的选择。另外,除非有新语法,否则代码段中会出现问题,dispatch只使用一个参数,并且action对象上没有有效负载属性,因此您的reducer逻辑将抛出错误。感谢您的评论,我已编辑了我的答案:D