在 React 中使用方法装饰器时绑定 this
Bind this when using method decorators in React
如何绑定this
和transform-decorators-legacy
Babel插件?
例如我有一些简单的装饰器。装饰器工作,但 this
在组件的方法上未定义。
fucntion myDecorator(target, name, descriptor) {
var oldValue = descriptor.value;
descriptor.value = function() {
...// Doing some stuff here I need the decorator for
...// (for example logging on every method call)
return oldValue.apply(null, arguments);
};
return descriptor;
}
class MyClass extends React.Component {
@myDecorator
myMethod() {
...// this.props... is unavailable here(`this` is undefined)
}
}
如果我尝试将@myDecorator 与一些 @autobind 装饰器一起使用,我会得到
TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
,因为
A data descriptor is a property that has a value, which may or may not be writable. An accessor descriptor is a property described by a getter-setter pair of functions. A descriptor must be one of these two flavors; it cannot be both.
在我的示例中,我不能使用 value()
和 get()
。
构造函数中的绑定 (this.myMethod = thid.myMethod.bind(this)
) 似乎也没有帮助,因为您绑定了未修饰的方法。
是不是.bind
ing修饰方法的问题
但是你错过了一些东西。即使您在 constructor
中执行了 .bind
您的 myMethod
到 class,当您调用它时,无论从何处,myDecorator
都会修改执行范围。
oldValue.apply(null, arguments)
基本上,您将目标范围 (MyClass
) 替换为 null
。
那么你想要的是:
oldValue.apply(this, arguments)
看到这个fiddle:http://jsfiddle.net/free_soul/0n6v1dtp/
这就是我设法解决这个问题的方法:
使用提到的 @autobind 装饰器的代码:
function myDecorator(target, key, descriptor) {
let fn = descriptor.value;
return {
configurable: true,
get() {
let boundFn = fn.bind(this);
Reflect.defineProperty(this, key, {
value: boundFn,
configurable: true,
writable: true
});
return function() {
...// Doing some stuff here I need the decorator for
...// (for example logging on every method call)
return boundFn.apply(this, arguments)
};
}
};
}
如何绑定this
和transform-decorators-legacy
Babel插件?
例如我有一些简单的装饰器。装饰器工作,但 this
在组件的方法上未定义。
fucntion myDecorator(target, name, descriptor) {
var oldValue = descriptor.value;
descriptor.value = function() {
...// Doing some stuff here I need the decorator for
...// (for example logging on every method call)
return oldValue.apply(null, arguments);
};
return descriptor;
}
class MyClass extends React.Component {
@myDecorator
myMethod() {
...// this.props... is unavailable here(`this` is undefined)
}
}
如果我尝试将@myDecorator 与一些 @autobind 装饰器一起使用,我会得到
TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute
,因为
A data descriptor is a property that has a value, which may or may not be writable. An accessor descriptor is a property described by a getter-setter pair of functions. A descriptor must be one of these two flavors; it cannot be both.
在我的示例中,我不能使用 value()
和 get()
。
构造函数中的绑定 (this.myMethod = thid.myMethod.bind(this)
) 似乎也没有帮助,因为您绑定了未修饰的方法。
是不是.bind
ing修饰方法的问题
但是你错过了一些东西。即使您在 constructor
中执行了 .bind
您的 myMethod
到 class,当您调用它时,无论从何处,myDecorator
都会修改执行范围。
oldValue.apply(null, arguments)
基本上,您将目标范围 (MyClass
) 替换为 null
。
那么你想要的是:
oldValue.apply(this, arguments)
看到这个fiddle:http://jsfiddle.net/free_soul/0n6v1dtp/
这就是我设法解决这个问题的方法: 使用提到的 @autobind 装饰器的代码:
function myDecorator(target, key, descriptor) {
let fn = descriptor.value;
return {
configurable: true,
get() {
let boundFn = fn.bind(this);
Reflect.defineProperty(this, key, {
value: boundFn,
configurable: true,
writable: true
});
return function() {
...// Doing some stuff here I need the decorator for
...// (for example logging on every method call)
return boundFn.apply(this, arguments)
};
}
};
}