我正在尝试使用的第二个参数setState
来传递回调函数,但看起来(据我所知)服务器端渲染器完全忽略了这个参数。我正在使用Gatsby,它利用服务器端渲染来构建基于 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');
};
该更新程序的方法ReactUpdateQueue.js
(根据调用堆栈)如下所示:
enqueueSetState: function (publicInstance, partialState)
我不完全理解 React 的构建过程,但我相信方法/文件来自源中的这个文件:
/src/renderers/shared/server/ReactPartialRenderer.js
我唯一能找到定义这个函数的地方是这里:
/src/isomorphic/modern/class/ReactNoopUpdateQueue.js
enqueueSetState: function(
publicInstance,
partialState,
callback,
callerName,
) {
warnNoop(publicInstance, 'setState');
}
setState
这看起来像正确的方法签名,但当我在代码中调试调用时,它不会出现在调用堆栈中的任何位置。这似乎不是客户端呈现的 React 组件的问题(我将尝试设置一个简单的存储库来显示此问题,但它在 CodePen 等上似乎不可复制)我知道我可以componentDidUpdate
使用完成我需要做的事情,但在我的例子中回调更方便,我讨厌留下这样一个未解之谜。:)