2017-12-19 2 views
2

バックエンドにリクエストして結果をページに表示するvueアプリケーションを設定しようとしています。私は、この例VueとAxiosがリクエストして結果を表示します

new Vue({ 
    data: { 
     message: '{}' 
    }, 
    el: '.login-app', 
}); 

Vue.component('message-section', { 
    template: '<div>Message Section</div>' 
}); 

Vue.component('login-component', { 
    template: '<div><button v-on:click="login(\'[email protected]\', \'passwd\')">Login</button></div>', 
    methods: { 
     login: function (username, password) { 
      axios.post("http://192.168.1.10:8080/login", {username: username, password: password}) 
       .then(response => {this.message = response.data}) 
     } 
    } 
}); 

などのインデックスまで調理:

<!DOCTYPE html> 

<html lang="en"> 
    <head> 
    <meta charset="utf-8"> 
    <title>Vue Test</title> 
    </head> 
    <body> 
    <div class="login-app"> 
     {{ message }} 
     <message-section></message-section> 
     <login-component></login-component> 
    </div> 
    <script src="/static/testvue.bundle.js"></script> 
    </body> 
</html> 

「成功」または何のようなものを、ユーザー名/パスワードを送信し、取り戻す必要があるシンプルなアプリであるという考えをことができること表示。しかし、私はvueとjavascriptに全く慣れていないので、私は立ち往生しています。私はどのように応答をどこに表示させるかわかりません。私はそこに{{メッセージ}}を持っていますが、何もしません。表示されるのは、Vueオブジェクトの「メッセージ」属性の{}がレンダリングされていることです。これらのユーザー/パスはハードコードされています...私はフォームフィールドで動作させる方法がわかりません。

私はので、私はそれはそれは、複数の「モジュール」または任意に分けていますので、どのようにVueのプロジェクトを構築することができ、さらに...

を働いている知っているものの、バックエンドに送信されたばかりのデータを見ることができますか?

編集

:そうのような一成分のみがありますので、私はそれを変更した場合

:その後、何もすべてでレンダリングしていない

new Vue({ 
    data: { 
     message: '{}' 
    }, 
    el: '.login-app', 
    methods: { 
     login: function (username, password) { 
      axios.post("http://192.168.91.30:8080/login", {username: username, password: password}) 
       .then(response => {this.message = response.data}) 
     } 
    } 

}) 

<div class="login-app"> 
    {{ message }} 
    <button v-on:click="login(\'[email protected]\', \'passwd\')">Login</button> 
</div> 

...これは、それらを入れている必要があります同じコンテナの中にあっても、何でも構いません。

+0

は 'message'では、あなたのルートVueの中で宣言されたデータのプロパティですが、あなたは持っていないコンポーネントからそれを設定しようとしていますそれに直接アクセスできます。通常、子コンポーネントから値を変更する場合は、その値を親に送信する必要があります。 – Bert

+0

私はそれが何を意味するのか分かりません...しかし私はちょっと私の質問を編集しました – MichaelB

答えて

1

編集したコードは次のとおりです。

console.clear() 
 

 
new Vue({ 
 
    data: { 
 
    message: '{}' 
 
    }, 
 
    el: '#login-app', 
 
    methods: { 
 
    login: function(username, password) { 
 
     axios.post("https://httpbin.org/post", {username, password}) 
 
     .then(response => this.message = response.data.json) 
 
    } 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.17.1/axios.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.min.js"></script> 
 

 
<div id="login-app"> 
 
    {{ message }} 
 
    <button v-on:click="login('[email protected]', 'passwd')">Login</button> 
 
</div>

ここでは、コンポーネントから取り組んでいます。この第2の例で

console.clear() 
 

 
Vue.component('login-component', { 
 
    template: ` 
 
    <div> 
 
     <button v-on:click="login('[email protected]', 'passwd')">Login</button> 
 
    </div>`, 
 
    methods: { 
 
    login: function(username, password) { 
 
     axios.post("https://httpbin.org/post", {username, password}) 
 
     .then(response => this.$emit('login-success', response.data.json)) 
 
    } 
 
    } 
 
}); 
 

 
new Vue({ 
 
    data: { 
 
    message: '{}' 
 
    }, 
 
    el: '#login-app', 
 
    methods: { 
 
    onSuccess(message) { this.message = message } 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.17.1/axios.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.11/vue.min.js"></script> 
 

 
<div id="login-app"> 
 
    {{ message }} 
 
    <login-component @login-success="onSuccess"></login-component> 
 
</div>

messageのデータプロパティであることに注意。ルートVue。 login-componentは、messageに直接アクセスできません。つまり、コンポーネントのでajax呼び出しが行われた場合、messageに設定するには、コンポーネントから値を送出する必要があります。コードでは、成功イベントをパラメータとして渡してカスタムイベントを発生させることにより、コードを実行します。login-success親は、次の構文を使用して、そのイベントをリッスン:

問題の核心はここにある
<login-component @login-success="onSuccess"></login-component> 
+0

最初の例では、私が "編集した"ものから変更したように見えるのは、.login-appを#login-appに変更し、.jsonをresponse.dataに追加することだけです。ドットとハッシュの違いは何ですか? – MichaelB

+0

@MichaelBクラスに複数の要素がある可能性があるため、クラスにVueを作成する必要はありません。それはちょうど悪い習慣です。 '#login-app'は、' login-app'の* id *を持つ要素を選択するCSSセレクタです。私の変更を無視しても問題ありません。それらはあなたの*サーバーを呼び出す方法がないので、POSTを扱う汎用サイトを使うように呼び出しを更新しただけです。 – Bert

+0

したがって、2番目のケースでは、@ login-successというイベントをリスンするように親に指示し、それを聞くと、独自のonSuccessメソッドを実行します。次に、子からlogin-successイベントを "送出"し、Ajaxの戻り値を引数として渡します。 – MichaelB

1

コンポーネントに問題がありますlogin-componentは、ルートVueアプリケーションに属しているmessageプロパティにアクセスできません。この問題を解決するために

一つの方法は、単に代わりにコンポーネントにmessageを入れている:

Vue.component('login-component', { 
    template: '<div><button v-on:click="login(\'[email protected]\', \'passwd\')">Login</button></div>', 
    data() { 
    return { message: '' } 
    }, 
    methods: { 
    login: function (username, password) { 
     axios.post("http://192.168.1.10:8080/login", {username: username, password: password}) 
     .then(response => {this.message = response.data}) 
     } 
    } 
}); 

しかしmessage場合login-componentはもっぱらへのアクセス権を持っているプロパティではありません、あなたはVuexまたは放出を検討する必要がありますカスタムイベント(thisおよびthis)。

+0

右、私の悪い、それを指摘していただきありがとうございます。 – kevguy

関連する問題