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

如何在JavaScript对象属性变更后更新div内容?

优雅解决JS对象属性变更后DOM同步更新的问题

你的核心问题是:修改data对象属性后,没有触发DOM的重新渲染,导致页面内容未同步变化。现有替换子元素的方法可行,但以下几种方案更简洁、易维护:

方案1:封装渲染函数,数据变更时重执行

把渲染DOM的逻辑抽成独立函数,初始化和数据变更时都调用它。不管哪个属性修改,都能统一更新页面,代码复用性更强:

change data name:
<input id="text">

<button id="btn">change</button>
<div id="content"></div>
<script>
  const search = document.getElementById('text');
  const btn = document.getElementById('btn');
  const div = document.getElementById('content');

  const data = {
    id: '1',
    name: 'element name',
    inStock: true
  }

  // 封装渲染逻辑
  function renderData() {
    div.innerHTML = `
      <div>id of the data: ${data.id}</div>
      <div>name of the data: ${data.name}</div>
      <div>is in stock: ${data.inStock}</div>
    `;
  }

  // 初始化渲染
  renderData();

  btn.addEventListener('click', () => {
    data.name = search.value;
    // 数据更新后重新渲染
    renderData();
  })
</script>

方案2:精准更新单个目标元素

如果只需要更新name对应的内容,给该元素加唯一ID,直接修改其内容即可,无需操作整个父容器或替换子元素,性能更优:

change data name:
<input id="text">

<button id="btn">change</button>
<div id="content">
  <div>id of the data: 1</div>
  <div id="data-name">name of the data: element name</div>
  <div>is in stock: true</div>
</div>
<script>
  const search = document.getElementById('text');
  const btn = document.getElementById('btn');
  const nameElement = document.getElementById('data-name');

  const data = {
    id: '1',
    name: 'element name',
    inStock: true
  }

  btn.addEventListener('click', () => {
    data.name = search.value;
    // 直接更新目标元素的文本内容
    nameElement.textContent = `name of the data: ${data.name}`;
  })
</script>

方案3:用Proxy自动监听数据变化(进阶)

如果数据会被多处修改,或者需要实现自动同步,用ES6的Proxy监听对象属性变更,自动触发渲染。这是类似Vue等框架的核心思路,适合复杂场景:

change data name:
<input id="text">

<button id="btn">change</button>
<div id="content"></div>
<script>
  const search = document.getElementById('text');
  const btn = document.getElementById('btn');
  const div = document.getElementById('content');

  // 原始数据
  const rawData = {
    id: '1',
    name: 'element name',
    inStock: true
  }

  // 渲染函数
  function renderData() {
    div.innerHTML = `
      <div>id of the data: ${data.id}</div>
      <div>name of the data: ${data.name}</div>
      <div>is in stock: ${data.inStock}</div>
    `;
  }

  // 创建Proxy监听数据变更
  const data = new Proxy(rawData, {
    set(target, prop, value) {
      target[prop] = value;
      // 属性修改后自动触发渲染
      renderData();
      return true;
    }
  })

  // 初始化渲染
  renderData();

  btn.addEventListener('click', () => {
    // 修改数据时自动同步DOM
    data.name = search.value;
  })
</script>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:36:29