反应钩子改变状态对象值

时间:2021-04-08 07:27:43

标签: javascript reactjs react-hooks

假设我有一个状态变量,例如:

const [params,setParams] = useState({name:'bill' , surname:'mysurname'});

我想创建一个获取字符串作为输入的函数。如果字符串是我的对象键之一的值,则将对象键值设置为 "" 。

示例

  input = "bill" 
   if "bill" is a value of a key in my object then set the corresponding key's value to "" 
   I have input= " bill" and name:"bill" so set name:""

我当然想使用 setParams 来做到这一点。感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

如果您要更改所有属性,则可以以简单的方式使用 setParams

setParams({name: "New name", surname: "New surname"});

如果您只更新某些属性,通常的方法是使用带有 setParams 的展开语法,如下所示:

setParams(params => ({
    ...params,             // Reuse the previous properties
    name: "New name here", // Overwrite the new ones
}));

请注意使用回调表单,因为您正在重用状态项的一部分,因此您要确保不会因为另一个状态更新正在等待而使用陈旧状态。


在您所说的编辑中:

<块引用>

input = "账单"

如果“bill”是我对象中某个键的值,则将相应键的值设置为“”

我输入了 = " bill" 和 name:"bill" 所以设置 name:""

匹配任何属性似乎不寻常,但您只需在回调中放置一个条件:

setParams(params => {
    for (const name in params) {
        if (params[name] === input) {
            // It's a match, clear it
            params = {
                ...params,
                [name]: "",
            };
            break;
        }
    }
    return params;
});

这仅替换了第一场比赛。替换所有匹配项:

setParams(params => {
    let newParams;
    for (const name in params) {
        if (params[name] === input) {
            // It's a match, copy the params if we haven't already
            newParams = newParams || {...params};
            // Clear the property
            newParams[name] = "";
        }
    }
    return newParams;
});

如果 input 不匹配任何内容,则从回调中返回 相同 对象不会导致重新渲染,因为 React 不会看到任何变化。

答案 1 :(得分:1)

以下函数将搜索给定 obj 的值。如果它找到一个与给定的 searchValue 完全匹配的对象,它将返回 another 对象,该对象将该值设置为空字符串。如果多个值匹配,则仅替换第一个值。如果没有匹配项,则返回相同的对象。该代码假定可以使用相当现代的 Javascript 功能。

function t(obj, searchValue) {
  const foundKey = Object.keys(obj).find(key => obj[key] === searchValue);
  if (foundKey) {
    return {
      ...obj,
      [foundKey]: ''
    };
  }
  return obj;
}

答案 2 :(得分:1)

const MyComponent = (props) => {
  const {} = props;
  const [params,setParams] = useState({name:'bill' , surname:'mysurname'});
  
const myFunction = (input) => {
  if(input === params.name){
    setParams({...params, name:""});
  } 
 }
 
 if(condition){
  myFunction(someinput)
 }
 
 return <Text>name is {params.name}</Text>;
}

答案 3 :(得分:1)

你可以这样写:

  const clearParam = (key) => {
    if (Object.keys(params).includes(key)) {
      setParams((states) => ({ ...states, [key]: '' }));
    }
  };