You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何更新嵌套在对象中的对象数组?含React与原生JS实现

React 中使用 useState 更新房间数组的实现

初始状态设置

先初始化包含房间数组的表单状态,给每个房间分配唯一ID用于后续定位:

import { useState } from 'react';

function HotelForm() {
  const [hotelForm, setHotelForm] = useState({
    // 可添加其他表单字段(如酒店名称、地址等)
    rooms: [
      { id: Date.now(), roomType: '', price: 0, maxGuests: 2 }
    ]
  });
  // 后续逻辑函数写在此处
}

更新已有房间的输入值

编写输入变化处理函数,通过房间ID定位目标项,严格遵循React不可变状态更新原则,复制原数组并修改对应项:

const handleRoomInputChange = (roomId, field, value) => {
  setHotelForm(prevState => ({
    ...prevState,
    rooms: prevState.rooms.map(room => 
      room.id === roomId 
        ? { ...room, [field]: value } 
        : room
    )
  }));
};

在输入组件中调用该函数:

{hotelForm.rooms.map(room => (
  <div key={room.id} className="room-item">
    <input
      type="text"
      value={room.roomType}
      onChange={(e) => handleRoomInputChange(room.id, 'roomType', e.target.value)}
      placeholder="房间类型"
    />
    <input
      type="number"
      value={room.price}
      onChange={(e) => handleRoomInputChange(room.id, 'price', Number(e.target.value))}
      placeholder="价格"
    />
  </div>
))}

添加新房间

实现添加新房间的函数,生成新的唯一ID,复制原房间数组并追加空房间对象:

const handleAddRoom = () => {
  setHotelForm(prevState => ({
    ...prevState,
    rooms: [...prevState.rooms, { id: Date.now(), roomType: '', price: 0, maxGuests: 2 }]
  }));
};

添加触发按钮:

<button onClick={handleAddRoom}>添加新房间</button>

原生JavaScript实现方案

无需React框架时,直接通过原生JS维护数组并同步更新DOM:

初始化数据与DOM结构

<div id="hotel-form">
  <div class="rooms-container" id="rooms-container"></div>
  <button id="add-room-btn">添加新房间</button>
</div>
// 初始化表单数据
let hotelForm = {
  rooms: [
    { id: Date.now(), roomType: '', price: 0, maxGuests: 2 }
  ]
};

// 渲染房间列表到DOM
function renderRooms() {
  const container = document.getElementById('rooms-container');
  container.innerHTML = '';
  
  hotelForm.rooms.forEach(room => {
    const roomEl = document.createElement('div');
    roomEl.className = 'room-item';
    roomEl.dataset.roomId = room.id;
    
    roomEl.innerHTML = `
      <input type="text" value="${room.roomType}" placeholder="房间类型" class="room-type-input">
      <input type="number" value="${room.price}" placeholder="价格" class="price-input">
    `;
    
    // 绑定输入事件
    roomEl.querySelector('.room-type-input').addEventListener('input', (e) => {
      updateRoom(room.id, 'roomType', e.target.value);
    });
    roomEl.querySelector('.price-input').addEventListener('input', (e) => {
      updateRoom(room.id, 'price', Number(e.target.value));
    });
    
    container.appendChild(roomEl);
  });
}

// 更新房间数据
function updateRoom(roomId, field, value) {
  hotelForm.rooms = hotelForm.rooms.map(room => 
    room.id === roomId ? { ...room, [field]: value } : room
  );
}

// 添加新房间并重新渲染
function addRoom() {
  hotelForm.rooms.push({ id: Date.now(), roomType: '', price: 0, maxGuests: 2 });
  renderRooms();
}

// 页面加载完成后初始化渲染
renderRooms();
document.getElementById('add-room-btn').addEventListener('click', addRoom);

内容的提问来源于stack exchange,提问作者night_thinker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 02:16:09