У меня есть воображаемый случай, когда у меня есть функция с формой, которую я могу обновлять. Это агентство недвижимости, и оно хочет иметь возможность обновлять свои объекты, когда продавцы ...

1
Sachihiro 22 Мар 2021 в 15:52

2 ответа

Лучший ответ

Обновление объекта json с помощью оператора распространения

Чтобы использовать оператор распространения, вы должны знать уровень ключа. Предположим, у нас есть объект:

const obj = {"field1": {"field2": 1, "field3": 2}, "field4":3}

Чтобы обновить field3, вам необходимо:

obj = {...obj, field1: {...field1, field3: newValue}}

В твоем случае

В вашем случае это немного отличается, поскольку вы хотите указать key и обновить объект. Один из способов сделать это - пройти по объекту.

const updateProperty = (obj, key, newVal) => {
  let tempObj = {...obj}
  Object.keys(tempObj).forEach(k => {
    if(k===key) tempObj[k] = newVal
  })
  setPropertyObj(tempObj)
}
0
Sinan Yaman 22 Мар 2021 в 12:59

В вашем коде вы написали:

...
onChange={e => setPropertyObj({ rooms: e.target.value })}
...

Это отменяет предыдущее значение propertyObj. Что вам нужно сделать, так это сохранить предыдущее состояние с помощью оператор распространения:

onChange={e => setPropertyObj(state => ({ ...state, rooms: e.target.value })}

Или, что еще лучше, вы можете написать для этого функцию:

function handleChange(e) {
  setPropertyObj(state => ({
    ...state, 
    [e.target.name]: e.target.value
  })
}

...
<input className='ml-3' type='text' name='rooms' onChange={handleChange} defaultValue={rooms} />
...

ОБНОВЛЕНИЕ: я думаю, что к other вы имели в виду использовать остальной синтаксис при разрушении объекта. Код { other } = propertyObj означает, что вы ищете свойство с ключом other внутри propertyObj. Если вы хотите присвоить оставшиеся свойства вновь определенной переменной, вы должны добавить к ней три точки:

const { propertyId, owner, address, ...other } = propertyObj
0
pooria 22 Мар 2021 в 13:15