vue+vuex+axios做收藏功能

需求:
如圖 要求點擊收藏 更新狀態(tài)


image.png

思路:
后臺給的數(shù)據(jù)是一個大數(shù)組courseData['hotCourse':{},'newCourse':{},recommendCourse:{},'storeData':[]];每一個課程是一個組件,在課程組件上綁定一個click事件collect,觸發(fā)vuex的action事件collect,并傳入當(dāng)前課程的數(shù)據(jù),調(diào)入收藏和取消收藏的接口,接口成功調(diào)用mutation改變state的storeData數(shù)據(jù),頁面依賴數(shù)據(jù)改變更新視圖。
代碼如下:

頁面:

  <div class="pro-list">
    <proList 
      :list="$store.state.dataCourse" 
      @changePage="changePage" ref="proList" 
      :display="display"
      @collect="collect"  //組件定義的事件 collect:function(data){this.$store.dispatch('collect',data}},
      @cancel="cancel">
    </proList>
  </div>

組件: (注意在collect事件上加上stop防止事件冒泡)

 <template>
<div>
<ul v-if="list.length" class="data-hot">
    <li v-for="(dataHot,index) in list" class="new-card" :key='index' @click.stop="$emit('changePage',dataHot)">
      <div class="left mu-card-media">
        <img :src='IMGURL+dataHot.course_picture' alt="">
        <div class="modal"></div>
      </div>
      <div class="right">
        <div class="title">{{dataHot.course_name}}</div>
        <div>{{$store.state.counts}}</div>
        <div class="data-hot-content new_content">{{dataHot.course_abstract}}</div>
        <div class="dataHot-bottom card_bottom">
          <span class="free" v-if="dataHot.pay">免費</span>
          <span class="unfree" v-else>¥{{dataHot.course_price}}</span>
          <div class="bottom-right">
            <b v-if="display">
            <span  v-if="$store.state.storeData.indexOf(dataHot.course_id)==-1" class="collect" @click.stop="$emit('collect',dataHot)">收藏</span>
            <span @click.stop="$emit('collect',dataHot)" class="collect isCollect" v-if="$store.state.storeData.indexOf(dataHot.course_id)!=-1">已收藏</span>
            </b>
            <span  class="comment">{{dataHot.comment_num}}</span>
          </div>
        </div>
      </div>
    </li>
</ul>
</div> 
</template>

vuex:

const state={
      storeData:{},
}
const mutation={
    // 收藏
  changeCollect(state,payload){
      if(state.storeData.indexOf(payload)==-1){
          state.storeData.push(payload);
      }else{
          let index=state.storeData.indexOf(payload)
          state.storeData.splice(index,1)
      }
    
  },
}
const action={
  // 收藏&取消收藏
      collect({commit},data){
       let isCollect=(url,data)=>{
         axios.post('/index/Activityapi/'+url,{
            course_id:data.course_id
         }).then(res=>{
       if(res.data.code==1){
          commit('changeCollect',data.course_id)
       }else{
         Vue.prototype.$toast.error('收藏失敗');
       }  
    }).catch(err=>{
        Vue.prototype.$toast.error('收藏失敗');
    })
  }
  if(localStorage.getItem('token')){
     if(state.storeData.indexOf(data.course_id)==-1){
         isCollect('storeup',data)    
     }else{
       isCollect('cancelStore',data)
    }
  }else{
     router.push('login')
  }
  },
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (1) 當(dāng)跨域請求報錯 Access-Control-Allow-Origin 訪問控制允許同源,有兩種辦法解決開...
    woow_wu7閱讀 1,897評論 1 13
  • VUE Vue :數(shù)據(jù)驅(qū)動的M V Vm框架 m :model(后臺提供數(shù)據(jù)),v :view(頁面),vM(模板...
    wudongyu閱讀 5,533評論 0 11
  • 周六在家,信手翻閱書架,得《唐伯虎》一書,重溫之余,生起一念,欲訪唐寅故居。第二天,正是六一節(jié),妻欲往海上游...
    十信草堂閱讀 218評論 0 4
  • 為什么我的筆記本會在桌面上,我不是把它放進抽屜里鎖好了嗎? 當(dāng)然我知道,我的抽屜別人也有鑰匙可以打開的。但是為什么...
    流浪癡人閱讀 242評論 0 0
  • 感賞兒子去上學(xué)沒給他零用錢也沒生氣,還高高興興去了。感賞自己能稍微控制情緒和孩子爸爸說話。 投射兒子在學(xué)校開開心心...
    伶麗閱讀 196評論 0 0

友情鏈接更多精彩內(nèi)容