Reactjs React服务器端渲染器是否忽略setState回调函数?

Reactjs React服务器端渲染器是否忽略setState回调函数?,reactjs,server-side-rendering,gatsby,Reactjs,Server Side Rendering,Gatsby,我试图使用setState的第二个参数传递回调函数,但是(据我所知)服务器端渲染器似乎完全忽略了这个参数。我正在使用它利用服务器端渲染来构建一个基于React的静态站点。我的调用位于onChange处理程序中,如下所示: this.setState({ [event.target.name]: event.target.value }, () => { console.log('setState callback') }) ReactComponent.prototype.setStat

我试图使用
setState
的第二个参数传递回调函数,但是(据我所知)服务器端渲染器似乎完全忽略了这个参数。我正在使用它利用服务器端渲染来构建一个基于React的静态站点。我的调用位于
onChange
处理程序中,如下所示:

this.setState({ [event.target.name]: event.target.value }, () => { console.log('setState callback') })
ReactComponent.prototype.setState = function (partialState, callback) {
  [...]
  this.updater.enqueueSetState(this, partialState, callback, 'setState');
};
enqueueSetState: function (publicInstance, partialState)
状态按预期更新,但从未调用回调注意:无论我为第一个参数传递对象还是函数,都会遇到同样的问题。组件函数如下所示:

this.setState({ [event.target.name]: event.target.value }, () => { console.log('setState callback') })
ReactComponent.prototype.setState = function (partialState, callback) {
  [...]
  this.updater.enqueueSetState(this, partialState, callback, 'setState');
};
enqueueSetState: function (publicInstance, partialState)
该更新程序的方法位于
ReactUpdateQueue.js
(根据调用堆栈)中,如下所示:

this.setState({ [event.target.name]: event.target.value }, () => { console.log('setState callback') })
ReactComponent.prototype.setState = function (partialState, callback) {
  [...]
  this.updater.enqueueSetState(this, partialState, callback, 'setState');
};
enqueueSetState: function (publicInstance, partialState)
我不完全理解React的构建过程,但我相信方法/文件来自源代码中的文件:

/src/renderers/shared/server/ReactPartialRenderer.js
我能找到的唯一其他定义此函数的地方是:


它看起来像是正确的方法签名,但在调试代码中的
setState
调用时,它不会出现在调用堆栈中的任何位置。客户端呈现的React组件似乎没有问题(我将尝试设置一个简单的repo来显示此问题,但它在CodePen上似乎不可复制等),我知道我可以使用
componentDidUpdate
来完成我需要做的事情,但在我的实例中回调更方便,我讨厌留下这样一个悬而未决的谜团

嗯,我想出来了,结果发现,这是一个自作自受的错误,这种情况太常见了。默认的Gatsby安装使用React v15,但我们希望使用16,因此我们在
package.json
中为它添加了一个直接依赖项,该依赖项内置到生成的包中。我仍然不太明白为什么调用了上述版本的
enqueueSetState
,而不是正确的版本,但删除了react的引用(并添加了,我们只需将webpack指向较新版本即可实现这一目的)就解决了这个问题

至少,这是一个很好的借口,可以让你更加熟悉React的勇气。也许这会在将来为其他人节省一些时间