Vue.jsで別のインスタンスのメソッドへデータを渡す方法
WEB
Vue.jsで、ボタンをクリックしたときに、別のVueインスタンスのメソッドにデータを渡す実装を行った。
jsを使用することでリロードを発生させずに再描画することが目標
イメージした完成形
- wordpressの投稿カテゴリをボタンとして表示
- そのボタンをクリックしたら、投稿内容を変更する
動作ロジック
- 初期に全投稿データから表示数分だけ取得して描画【Vue.js(投稿取得)】
- カテゴリIDとボタンの順番を取得【PHPを使用】
- 取得したデータを配列として保存【Vue.jsを使用】
- 1で取得している投稿データを3のデータを使用して書き換える
実装方法
WordPressのカテゴリを取得
カテゴリをPHPで取得する(PHPとVue.jsを併用)
<div id="examp" class="work__categories">
<?php $terms = get_categories(); ?>
<?php foreach ($terms as $key => $term): ?>
<button type="button" @click="exampBtn(<?php echo $term->term_id; ?>, <?php echo $key; ?>)">
<?php echo $term->name; ?>
</button>
<?php endforeach; ?>
</div>
if (document.getElementById('examp')) {
var exampInstance = new Vue({
el: "#examp",
methods: {
exampBtn(catid,i) {
if(!postInstance.postsOrigin[i]) {
postInstance.postsOrigin[i] = catid
}
postInstance.btn(i)
},
},
});
}
イベントハンドリング
イベントハンドリング例
Vueでクリックした箇所とその情報を取得するために、イベントハンドリングを使用しておく
@click="exampBtn(<?php echo $term->term_id; ?>, <?php echo $key; ?>)"
ここでは、カテゴリIDと、ボタンの順番をVueで受け取れるように記入する
※ここでの【exampBtn】は、後述するJs内に書いておく、methods(function)です
WordPressの投稿を取得
WordPressのWp Rest APIを使用してVue.jsで描画
<div id="Post" class="row">
<div class="col-md-40 col-60" v-for="(post,index) in posts">
<img :src="post._embedded['wp:featuredmedia'][0].media_details.sizes.full.source_url">
</div>
</div>
if (document.getElementById('Post')) {
var postInstance = new Vue({
el: "#Post",
data() {
return {
posts: [],
postsOrigin: [],
};
},
methods: {
btn(i){
axios(BASEURL + 'posts?_embed&per_page=9&categories=' + this.postsOrigin[i] )
.then( (res) =>{
this.posts = res.data
})
},
},
mounted(){
axios(BASEURL + 'posts?_embed&per_page=9')
.then( (res) =>{
this.posts = res.data
})
},
});
}
※上記の【BASEURL】は、WP Rest APIのパスを代入しておいた変数です
カテゴリ取得部分の【インスタンス】から、投稿取得部分への【インスタンス】へデータを渡す
インスタンスからインスタンスへデータを渡す
例)
インスタンス名.データ名
今回の場合は下記
postInstance.postsOrigin
これで、exampInstance内のmethodsから、postInstanceのpostsOriginデータに取得データを代入できる
備考
今までインスタンス名を定義する際に、constを使用していました。
ですがデータを受け渡し、中身を書き換えるので、再代入不可能な変数であるconstは使用できません。
そのため、varで宣言しています。
よくvarの代わりにletで宣言するという、解説をされているサイトが多く散見されますが
letはブロックスコープのため、ブロック外からのアクセスはできません。
※本来であれば、全体に影響しないconstやletを扱うべきです。
今回はブロック外でデータをやり取りするので行った変則的な組み込みです。
今回はインスタンスで、異なるブロックへデータの受け渡しをするので、letは使用できません。