Vue.jsで別のインスタンスのメソッドへデータを渡す方法

Vue.jsで、ボタンをクリックしたときに、別のVueインスタンスのメソッドにデータを渡す実装を行った。

jsを使用することでリロードを発生させずに再描画することが目標

 

イメージした完成形

  1. wordpressの投稿カテゴリをボタンとして表示
  2. そのボタンをクリックしたら、投稿内容を変更する

 

動作ロジック

  1. 初期に全投稿データから表示数分だけ取得して描画【Vue.js(投稿取得)】
  2. カテゴリIDとボタンの順番を取得【PHPを使用】
  3. 取得したデータを配列として保存【Vue.jsを使用】
  4. 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は使用できません。