我需要访问嵌套在处理函数中的函数中的React组件。
在嵌套函数this
中没有提供对组件的引用
所以我明确声明它而不是做通常的this.setState(...)
除了以下代码之外,还有更简洁的方法吗?
React.createClass({
uploadImage : function() {
...
var componentReference = this
xhrRequest.onreadystatechange = function()
{if(request.readyState==4) {
componentReference.setState({uploadStatus: request.status});
}
}
答案 0 :(得分:4)
这就是JavaScript的工作原理:
或
this
指向的内容。没有必要使用库(如lodash)因为ECMAScript 5.1内置了它,你可以在任何最近的浏览器中使用它(Chrome 7 +,Firefox 4 +,IE 9 +,Safari 5.1) +),请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind 如果您需要支持旧浏览器,可以自行实施bind
功能,例如参见Underscore.js' Function.prototype.bind
实施:http://underscorejs.org/#bind
答案 1 :(得分:1)
最常用的方法是使用原生.bind()
方法,不需要库:
React.createClass({
uploadImage : function() {
// ...
xhrRequest.onreadystatechange = function() {
if(request.readyState == 4) {
this.setState({ uploadStatus: request.status });
}
}.bind(this)
// ...
}
})
.bind(this)
设置this
里面.onreadystatechange
关闭内容的上下文。这有点像将范围传递给内部函数。
答案 2 :(得分:0)
如果您正在使用例如lodash,您可以这样做:
xhrRequest.onreadystatechange = _.bind(function () {
if ( request.readyState == 4 ) {
this.setState({ uploadStatus: request.status });
}
}, this);
或者,如果你使用jQuery,你可以proxy。
答案 3 :(得分:0)
你可以简单地在普通的旧JS中使用Function bind方法,比如function(){}。bind(this),然后"这个"你的函数内部将是你的React组件。
您可以在此处查看bind()的定义https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
答案 4 :(得分:0)
您可以将onreadystatechange
处理程序放在“类”本身上,从React的自动绑定中获利。
你也可以保留对setState
的引用,但我不确定它是否也是自动绑定的。试试看。
最后但同样重要的是,既然您可能正在使用转换器,则可以使用ES6箭头功能。箭头函数使用this
(词汇this
)