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

Mobx State Tree(MST)组件调用更新方法后不重新渲染求助

问题原因

你的代码核心问题是每次PDF组件渲染时,都会创建一个全新的PDFMaker实例:

const PDF = function () {
  return <PDFMakerForm pdfmaker={PDFMaker.create()} />
}

当你在输入框调用setName更新状态时,修改的是上一次渲染生成的旧实例,但PDF组件重新渲染后,PDFMakerForm已经绑定了新的实例,旧实例的状态更新无法触发组件重新渲染。

解决方案

需要确保PDFMaker实例在组件生命周期内只创建一次,避免每次渲染都生成新实例,以下是几种可行方案:

方案1:使用useState初始化实例

利用useState的初始化函数特性,仅在组件首次渲染时创建实例:

import { observer } from 'mobx-react'
import { useState } from 'react'
import PDFMaker from '../store'

const PDFMakerForm = observer(({pdfmaker}) => {
  console.log(pdfmaker)

  return (
    <div>
      <header>
        <label>Project Name: </label>
        <input type="text"
               value={pdfmaker.name}
               onChange={(e)=>pdfmaker.setName(e.target.value)}/>
      </header>
    </div>
  )
})

const PDF = function () {
  // 仅首次渲染时执行PDFMaker.create()
  const [pdfmaker] = useState(() => PDFMaker.create())
  return <PDFMakerForm pdfmaker={pdfmaker} />
}

export default PDF

方案2:使用useRef保存实例

通过useRef持久化实例,确保组件复用同一个实例:

import { observer } from 'mobx-react'
import { useRef } from 'react'
import PDFMaker from '../store'

const PDFMakerForm = observer(({pdfmaker}) => {
  console.log(pdfmaker)

  return (
    <div>
      <header>
        <label>Project Name: </label>
        <input type="text"
               value={pdfmaker.name}
               onChange={(e)=>pdfmaker.setName(e.target.value)}/>
      </header>
    </div>
  )
})

const PDF = function () {
  const pdfmakerRef = useRef()
  // 仅在ref为空时创建实例
  if (!pdfmakerRef.current) {
    pdfmakerRef.current = PDFMaker.create()
  }
  return <PDFMakerForm pdfmaker={pdfmakerRef.current} />
}

export default PDF

方案3:全局实例(适合简单场景)

如果你的应用不需要多个独立的PDFMaker实例,可以直接在组件外部创建全局实例:

import { observer } from 'mobx-react'
import PDFMaker from '../store'

// 全局创建一次实例
const pdfmakerInstance = PDFMaker.create()

const PDFMakerForm = observer(({pdfmaker}) => {
  console.log(pdfmaker)

  return (
    <div>
      <header>
        <label>Project Name: </label>
        <input type="text"
               value={pdfmaker.name}
               onChange={(e)=>pdfmaker.setName(e.target.value)}/>
      </header>
    </div>
  )
})

const PDF = function () {
  return <PDFMakerForm pdfmaker={pdfmakerInstance} />
}

export default PDF

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:49:58