フォロー機能の実装② ~フロントエンド~

#概要
Laravel x Vue.js(Vuex)でSPAに対応したフォロー機能を実装します。
今回はVue.jsでのフロントエンドの実装になります。
前回の記事はこちら→[フォロー機能の実装①](https://qiita.com/kke1229/items/4d70d50ae7341bbead2c)

最終的なUIはこんな感じ↓
![ダウンロード (3).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643906/76a4ff06-d134-ac52-82a6-3886acda8d88.gif)

##バーション
Laravel 8.12
Vue.js 2.5.17
Vuex 3.6.0
Vue Router 3.4.9

#実装
##store
```store/follow.js
import axios from "axios";

const state={
    status: null,
};
const getters = {
    status: state =>state.status ? state.status: '',
};
const mutations = {
    setStatus(state,status){
        state.status = status;
    },
};
const actions = {
    async pushFollow(context, data){
        await axios.post('/api/follow',data).then(result=>{
            context.commit('setStatus',result.data);
        }).catch(error=>{
            console.log(error);
        })
    },
    async deleteFollow(context,data){
        await axios.delete('/api/follow', {data:data}).then(result=>{
            context.commit('setStatus', result.data);
        }).catch(error=>{
            console.log(error);
        })
    },
};

export default{
    namespaced: true,
    state,
    getters,
    mutations,
    actions
}
```

>state.statusではフォローしているかしていないかtrue,falseで確認します。
pushFollow()はフォローするボタンを押した時に発火して、result.dataにはtrueが格納、
deleteFollow()はフォロー解除ボタンをを押した時に発火して、result.dataにはfalseが格納されます。



##template
```Individual.vue
<template>
<div class="wrapper">
    <div class="containers">
        <div class="col-md-3"> 
                <div class="follow" @click="pushFollow" v-show="!followStatus" >
                    <i class="fas fa-user-plus"></i>
                </div>
                <div class="unfollow" @click="deleteFollow" v-show="followStatus">
                    <i class="fas fa-user-check"></i>
                </div>
        </div>
    </div>
</template>
<script>
export default {
    mixins: [MultipostAboidable],
    computed: {
        //相手側のユーザー情報
        postUser(){
            return this.$store.getters["individual/user"];
        },
        //自分のユーザー情報
        authUser(){
            return this.$store.getters["auth/user"];
        },
        //フォロー有無の確認
        followStatus(){
            return this.$store.getters["follow/status"];
        },
    },
    methods: {
        async pushFollow(){
            this.avoidMultipost(async()=>{
                this.$store.dispatch('follow/pushFollow', {auth_user: this.authUser.id, post_user:this.postUser.id});
            });
        },
        async deleteFollow(){
            this.avoidMultipost(async()=>{
                this.$store.dispatch('follow/deleteFollow', {auth_user: this.authUser.id, post_user:this.postUser.id});
            });
        },
    },
    mounted() {
        console.log('Individual mounted start!');
        this.$store.dispatch('follow/checkFollow', 
            {auth_user: this.authUser.id, post_user:this.postUser.id})
    },
}
</script>
<style scoped>
    .follow{
        display: inline-block;
        border: 1px solid #CFCABF;
        border-radius: 5%;
        padding:7px;
        cursor: pointer;
    }
    .unfollow{
        display: inline-block;
        border: 1px solid #CFCABF;
        border-radius: 5%;
        padding:7px;
        cursor: pointer;
    }
    .unfollow:hover{
        background-color: #2983FD;
        color: #FFF;
    }
    .follow:hover{
        background-color: #2983FD;
        color: #FFF;
    }
</style>
```


>     <div class="follow" @click="pushFollow" v-show="!followStatus" >
        <i class="fas fa-user-plus"></i>
    </div>
    <div class="unfollow" @click="deleteFollow" v-show="followStatus">
        <i class="fas fa-user-check"></i>
    </div>

followStatusがfalse(フォローしていない)の場合、フォローするボタンを設置
true(すでにフォローしている)の場合、フォロー解除ボタンを設置します。

アイコンはfontAwesomeを利用しています。


#まとめ
以上でフォローするボタンを設置することができました。