2016-11-28 16 views
1

バインドする方法thistransform-decorators-legacyとしますBabel Plugin? たとえば、私はシンプルなデコレータを持っています。デコレータは機能しますが、コンポーネントのメソッドでthisは未定義です。私はいくつかの@autobindデコレータで@myDecorator使用しようとするReactでメソッドデコレータを使用する場合はこれをバインドします

データ記述子は、または書き込み可能であってもなくてもよい値を持つプロパティですので

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) 
    } 
} 

私は、 TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute得ます。アクセサー・ディスクリプタは、ゲッター・セッター・ペアの関数で記述されるプロパティーです。記述子は、これらの2つのフレーバのいずれかでなければなりません。それは両方になることはできません。

私の例では、私はとget()を使用できません。

デコレートされていないメソッドをバインドするので、コンストラクタ(this.myMethod = thid.myMethod.bind(this))でのバインディングは役に立ちません。

答えて

1

装飾されたメソッドの問題はありませんか?

しかし、あなたが逃したことがあります。あなたが.bindmyMethodをあなたのconstructorの中に入れたとしても、どこからでも、myDecoratorは実行範囲を変更します。

oldValue.apply(null, arguments)

基本的に、あなたはnullとターゲットスコープ(MyClass)を置き換えます。

だから何あなたが欲しいのはこれです:

oldValue.apply(this, arguments)

このフィドルを参照してください:言及@autobindデコレータからのコードを使用して :http://jsfiddle.net/free_soul/0n6v1dtp/

+0

提案したように、 'this'は' React.Component'を指していて、 'MyClお尻 ' – OlehZiniak

+0

うーん、うまくいくようだ。面白いことに、私は100%確信しています。私は同じアプローチを試みましたが、それは動作していませんでした。これは「未定義」です。なぜ 'props = this.props'という行が必要なのか説明してください。 – OlehZiniak

0

は、これは私がこの問題を解決するために管理方法です

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) 
      }; 
     } 
    }; 
} 
+0

私はこれが必要ではないと思うのですが、代わりにこれを行うことができます: 'var oldValue = descriptor.value;記述子.value = function(){戻り値oldValue.apply(これ、引数); }返り値の記述子; '私の答えの中でバイブルをチェックしてください。 –

+0

これは、あなたの例のコンストラクタで 'this'に最初にバインドするためです。これは、パラメータを必要とするデコレータでは機能しません。 –

関連する問題