2017-11-12 17 views
0

Vuejsコンポーネントのメソッドセクション内でラムダ式を使用しています。Vuejs Arrow関数が2番目の文をトリガーしない

この例は、 です。私はalertyou()をトリガーし、アラートを取得し、「OK」をクリックします。その後、私はthis.activatedと表示されるvue開発ツールではtrueになります。

export default { 
    name: 'HelloWorld', 
    data() { 
    return { 
     msg: 'Welcome to Your Vue.js App', 
     activated: false 
    } 
    }, 
    methods: { 
     alertme:() => { alert('Clicked'); this.activated = false; }, 
     alertyou() { 
     alert('Alert You'); 
     this.activated = true 
     } 
    } 
} 

ただし、alertmeラムダをトリガーするボタンをクリックすると、警告メッセージが表示されたら、[いいえ]をクリックします。しかし、その後、これは有効です。

ここで何が起こっているのは、これがラムダの制限ですか?ラムダごとに1つのステートメントだけトリガーできますか?それとも警報が発せられたら、これは範囲を扱わなければならないのでしょうか?

+0

いいえ、矢印の機能は、1つのステートメントだけを含むことに限定されません。 console.logのアラートを変更して再度テストします。アラートを使用しないでください。これはブロッキング文です。 – WaldemarIce

+0

@WaldemarIce 'alert'は何も実行されないようブロックしません。問題は、矢印関数を使用すると親スコープに 'this'をバインドします。これはVueインスタンスではありません。彼は 'alertme'を通常の関数として定義するべきです(あるいは' alertyou'と同じように省略形を使用してください)。彼は明示的に「this」にバインドする必要はありません。 – thanksd

+0

@thanksd上記のコメントを読んでください。彼はどこに問題があるのか​​を知っています。そしてあなたは間違っています。警告はコードブロック文です。これを呼び出すと、コードの実行は文字通り一時停止します。 – WaldemarIce

答えて

1

これはラムダの制限ですか?ラムダごとに1つのステートメントだけトリガーできますか?それとも警報が発せられたら、これは範囲を扱わなければならないのでしょうか?

どちらもありません。

矢印機能は、矢印機能が作成されたときのコンテキストにthisをバインドしたままにします。この場合、thisはvueインスタンスではありません。おそらくwindow

functionキーワード(またはES6オブジェクト略語スタイル)を使用してオブジェクトに宣言された関数は、通常、関数が宣言されているオブジェクトにバインドされているthisになります。あなたはthis.activatedあなたがalertmeメソッドを宣言するalertyouと同じ構文を使用したいと思う

alertme alertyouではなく、にアクセスすることができます理由です

+0

私はそれを今得ます、どうすれば矢印関数の構文を使い続けることができますか? –

+0

なぜあなたはしたいですか? – akatakritos

+1

@christopherclark悪いニュースは、単にVueインスタンスのメソッドを定義するために矢印関数を使用できないということです。この誤解によって引き起こされた問題について、vue関連のSOタグについて多くの質問があります。 Vueは、get-goからシーンの魔法の背後にあるいくつかを使って 'this'をVueインスタンスにバインドし、単に矢印機能をサポートしていません。矢印関数を使うと、常に 'this'を親スコープのコンテキストにバインドします。あなたの場合、これはノード内の単一のファイルコンポーネントであるように見えるので、 'this'を' undefined'にバインドしています。 – thanksd

1

alertme:() => { alert('Clicked'); this.activated = false; }からalertme() { alert('Clicked'); this.activated = false; }に変更してください。 here

+0

コードと一緒に少し説明すると確かに役立ちます。 – yuriy636

+0

もちろん:メインのコメントのコメントで述べた@thanksdのように、矢印関数はこの場合、Vueインスタンスではない親スコープに 'this'をバインドします。このため、あなたは 'function alertme(){}'で初期化する通常のJavascript関数を使用する必要があります。あるいは、上記の 'alertme(){}'がES6のショートカットであることがわかります。 – jsrbn

関連する問題