React:不使用&;this&;的最干净的访问组件的方式
React: Cleanest way of accessing component without using "this"
我需要访问一个嵌套在一个handler函数中的函数中的React组件。
当在嵌套函数中this
不提供对组件的引用时
所以我显式地声明它而不是通常的this.setState(...)
是否有比我下面的代码更干净的方法?
React.createClass({
uploadImage : function() {
...
var componentReference = this
xhrRequest.onreadystatechange = function()
{if(request.readyState==4) {
componentReference.setState({uploadStatus: request.status});
}
}
这就是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
最惯用的方法是使用本机.bind()
方法,不需要库:
React.createClass({
uploadImage : function() {
// ...
xhrRequest.onreadystatechange = function() {
if(request.readyState == 4) {
this.setState({ uploadStatus: request.status });
}
}.bind(this)
// ...
}
})
.bind(this)
在 .onreadystatechange
闭包中设置this
的上下文。这有点像将作用域传递给内部函数。
如果你正在使用lodash,你可以这样做:
xhrRequest.onreadystatechange = _.bind(function () {
if ( request.readyState == 4 ) {
this.setState({ uploadStatus: request.status });
}
}, this);
你可以简单地在普通的旧JS中使用Function绑定方法,如Function () {}.bind(this),然后函数中的"this"将成为你的React组件。
你可以在这里看到bind()的定义https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
你可以把onreadystatechange
处理程序放在"类"本身,从React的自动绑定中获利。
您也可以保留对setState
的引用,但我不确定这是否也是自动绑定的。试试吧。
最后但并非最不重要的是,由于您可能会使用转译器,因此您可以使用ES6箭头函数。箭头函数使用this
(词法this
)的" outer "值
- 为react组件传递道具的最佳方式
- 设置两个反应组件之间状态的正确方式
- 继承React组件的正确方式
- 以最封装的方式封装/封装ScalaJS react js组件(react stick)
- 使用*ngIf+模板变量+loadIntoLocation以编程方式将组件加载到视图中
- 通知全局事件组件的最佳方式
- 无需CSS即可设计React.js组件的最佳方式
- 以编程方式移动网格小组件
- 如何以正确的方式嵌套组件
- EXTJS 6.x到4.x以图形或其他方式查看组件的分层
- ReactJS以正确的方式绑定组件方法
- 我想使用jquery创建独立组件,这是附加事件的正确方式
- ReactJS:使用JSX以编程方式更改组件标记
- Reactjs中组件之间交互的最佳方式是什么
- AngularJS应用程序组件(模块、工厂、控制器)定义的确切工作方式
- 处理嵌套在组件中的组件的JS事件的最佳方式
- 如何在ember js中以编程方式在其他组件/视图中添加组件或视图
- 在React中,组件之间传递依赖的正确方式是什么?
- 从react组件'数组类型状态属性弹出的正确方式
- 如何在聚合物组件中以编程方式滚动