React服务器端渲染器省略setState回调函数?

问题描述:

我试图使用setState的第二个参数来传递回调函数,但它显示(从我能收集的内容)服务器端渲染器完全忽略此参数。我使用Gatsby,它利用服务器端渲染来构建一个基于静态React的站点。我的电话是在onChange处理程序,如下所示:如预期React服务器端渲染器省略setState回调函数?

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'); 
}; 

这更新的方法,(根据调用堆栈),它生活在ReactUpdateQueue.js看起来是这样的:

enqueueSetState: function (publicInstance, partialState) 

我不完全理解建立过程的反应,但我相信方法/文件来自this文件中的来源:

/src/renderers/shared/server/ReactPartialRenderer.js 

唯一的其他地方,我可以找到这个函数是here

/src/isomorphic/modern/class/ReactNoopUpdateQueue.js 

enqueueSetState: function(
    publicInstance, 
    partialState, 
    callback, 
    callerName, 
) { 
    warnNoop(publicInstance, 'setState'); 
} 

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

嗯,我想通了,事实证明,情况往往如此,这是一个自我造成的错误。默认的Gatsby安装使用了React v15,但我们想要使用16,所以我们在package.json中添加了一个直接的依赖关系,它内置于生成的包中。我仍然不太明白为什么上述版本的enqueueSetState被调用而不是正确的,但删除引用作出反应(并且添加gatsby-plugin-react-next,通过简单地将webpack指向新版本,我们需要它)修复了问题。

至少这是一个很好的理由,让你更熟悉React的胆量。也许这将在未来的某个时间拯救别人。