React 服务器端渲染器省略了 setState 回调函数?
React server side renderer omits setState callback function?
我正在尝试使用 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 的构建过程,但我相信 method/file 来自源代码中的 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
版本被调用而不是正确的版本,但是删除了对 react 的引用(并添加 gatsby-plugin-react-next,它通过简单地指向 webpack 来完成我们想要的到较新的版本)解决了这个问题。
至少这是一个更好地熟悉 React 内部结构的借口。也许这会在将来为其他人节省一些时间。
我正在尝试使用 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 的构建过程,但我相信 method/file 来自源代码中的 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
版本被调用而不是正确的版本,但是删除了对 react 的引用(并添加 gatsby-plugin-react-next,它通过简单地指向 webpack 来完成我们想要的到较新的版本)解决了这个问题。
至少这是一个更好地熟悉 React 内部结构的借口。也许这会在将来为其他人节省一些时间。