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

如何强制Dojo2 Widget重新渲染?表单提交时VDOM重渲染需求

在Dojo2 Widget中表单提交后触发重新渲染的方法

Dojo2的Widget是基于**状态(state)和属性(properties)**的响应式设计,当这两者发生变化时,组件会自动重新渲染VDOM并更新真实DOM。针对你的需求,有两种常用的实现方式:

1. 通过更新组件State触发重新渲染(推荐)

这是最符合Dojo2设计理念的方式,你只需要在submitForm方法中更新组件的内部状态,框架会自动触发重新渲染。

示例代码:

import { WidgetBase } from '@dojo/framework/widget-core/WidgetBase';
import { v } from '@dojo/framework/widget-core/d';

export class YourFormWidget extends WidgetBase<{}, { hasSubmitted: boolean }> {
  // 初始化组件状态
  protected getDefaultState() {
    return { hasSubmitted: false };
  }

  protected render() {
    // 这里可以根据state的变化调整渲染内容
    const submitText = this.state.hasSubmitted ? '已提交' : '提交';
    
    return v('form', { onSubmit: (event) => {
      event.preventDefault();
      this.submitForm(event.target);
    } }, [
      // 表单输入项...
      v('button', { type: 'submit' }, [submitText])
    ]);
  }

  public submitForm(input: any): void {
    console.log("want to re-render widget after this.");
    // 更新state,触发重新渲染
    this.setState({ hasSubmitted: true });
    
    // 如果需要基于之前的state更新,可以用函数式写法
    // this.setState(prevState => ({ ...prevState, hasSubmitted: true }));
  }
}

当你调用this.setState()后,Dojo2会检测到状态变更,自动调用render()方法生成新的VDOM,然后对比新旧VDOM的差异,只更新需要变化的DOM节点。

2. 强制触发重新渲染(特殊场景使用)

如果你遇到不需要更新state/props,但必须重新渲染组件的情况(比如依赖了外部可变数据),可以调用this.invalidate()方法强制组件重新渲染:

public submitForm(input: any): void {
  console.log("want to re-render widget after this.");
  // 强制触发组件重新渲染
  this.invalidate();
}

不过这种方式要谨慎使用,因为它跳过了Dojo2的响应式状态检查,可能会导致不必要的渲染,影响性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:56:16