1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

最終的なUIはこんな感じ↓
ダウンロード (3).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を利用しています。

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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?