VUE利用vuex模拟实现新闻点赞功能实例

发布时间 - 2026-01-11 02:06:10    点击率:

回顾新闻详细页

很早我们的新闻详情页是在news-detail.vue 组件里,获取服务器数据,然后把数据保持到组件的data 里,既然我们已经用到了vuex,学习了它的state,我们就应该想到把返回的数据交给state 来存储。

1.首先在Vuex.Store 实例化的时候:

  state:{
    user_name:"",
    newslist:[],
    newsdetail:{}
  },

增加一个newsdetail 对象,newslist 数组是我们前面用来保存新闻列表数据的。

2.下面就要看在news-detail.vue 组件里,怎么请求数据,然后交给newsdatail :

<script>
  export default{
    // 创建的时候[生命周期里]
    created(){
      this.$http.get("http://localhost/newsdetail.php?id="+this.$route.params.newsid).then(function(res){
        this.$store.state.newsdetail = res.body;
      },function(res){
        // 处理请求失败
      });
    },
  }
</script>

通过this.$store.state.newsdetail = res.body; 就把服务器返回的新闻详细数据保存起来了。

3.那么模板上怎么展示?

<div class="page-header">
  <h2>{{this.$store.state.newsdetail.title}}<small>{{this.$store.state.newsdetail.pubtime}}</small></h2>
  <p>点赞数:{{this.$store.state.newsdetail.agree}} <button class="btn btn-success">点赞</button></p>
  <p>{{this.$store.state.newsdetail.desc}}</p>
</div>

这里我们要来实现一个点赞功能

点击“点赞”按钮,就更改点击数。

其实就是更改newsdetail 里的agree 属性。

本文参考文档:https://vuefe.cn/vuex/actions.html

import Vuex from 'vuex';
Vue.use(Vuex);

const vuex_store = new Vuex.Store({
  state:{
    user_name:"",
    newslist:[],
    newsdetail:{}
  },
  mutations:{
    showUserName(state){
      alert(state.user_name);
    },
    setAgree(state,agreeNum){
      state.newsdetail.agree = agreeNum;
    }
  },
  actions:{
    agree(context,newsid){
      // 进行请求,获取点赞后的agree字段属性值
      Vue.http.post("http://localhost/agree.php",{newsid:newsid},{emulateJSON:true}).then(function (res) {
        // 处理业务
        // 调用上面setAgree方法更新点赞数
        context.commit("setAgree",res.body.agree);
      },function(){})
    }
  },
  getters:{
    getNews(state){
      return state.newslist.filter(function (news) {
        return !news.isdeleted;
      })
    }
  }
})

actions 里定义了一个方法agree 发送网络请求,获取最新的点赞数。

同时mutations 里定义了一个setAgree 方法,用来同步页面上的点赞数。

    agree(context,newsid){
      // 进行请求,获取点赞后的agree字段属性值
      Vue.http.post("http://localhost/agree.php",{newsid:newsid},{emulateJSON:true}).then(function (res) {
        // 处理业务
        // 调用上面setAgree方法更新点赞数
        context.commit("setAgree",res.body.agree);
      },function(){})
    }

重点说明:这里发送http请求,和组件里不一样,需要注意。

那么,组件里怎么调用这里的agree 方法呢?

<button class="btn btn-success" @click="submitAgree">点赞</button>
    methods:{
      submitAgree(){
        // 组件了调用actions里定义的agree方法
        this.$store.dispatch("agree",this.$store.state.newsdetail.id)
      }
    }

news-detail.vue 组件全部代码:

<template>
  <div class="news-detail">
    <div class="row">
      <div class="page-header">
        <h2>{{this.$store.state.newsdetail.title}}<small>{{this.$store.state.newsdetail.pubtime}}</small></h2>
        <p>点赞数:{{this.$store.state.newsdetail.agree}} <button class="btn btn-success" @click="submitAgree">点赞</button></p>
        <p>{{this.$store.state.newsdetail.desc}}</p>
      </div>
    </div>
  </div>
</template>

 
 

<script>
  export default{
    // 创建的时候[生命周期里]
    created(){
      this.$http.get("http://localhost/newsdetail.php?id="+this.$route.params.newsid).then(function(res){
        this.$store.state.newsdetail = res.body;
      },function(res){
        // 处理请求失败
      });
    },
    methods:{
      submitAgree(){
        // 组件了调用actions里定义的agree方法
        this.$store.dispatch("agree",this.$store.state.newsdetail.id)
      }
    }
  }
</script>

 

后端程序增加点赞数,这里就不赘述了。只需返回一个json对象:

{"status":"success","agree":100}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# vuejs实现点赞  # vue.js  # 点赞  # vue  # vue实现静态页面点赞和取消点赞功能  # 解决vue-seamless-scroll滚动加点赞衔接处数据不同步问题  # Vue transition实现点赞动画效果的示例  # Vue+Bootstrap收藏(点赞)功能逻辑与具体实现  # vue实现直播间点赞飘心效果的示例代码  # vue组件之间通信实例总结(点赞功能)  # vue开发实现评论列表  # vue实现评论列表  # Vue实现简单的发表评论功能  # vue实现文章点赞和差评功能  # 是在  # 就不  # 点击数  # 只需  # 就把  # 要来  # 看在  # 很早  # 需要注意  # 大家多多  # 后端  # 详情页  # 文档  # 增加点  # 起来了  # id  # localhost  # default  # php  # created 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高端网站建设与定制开发一站式解决方案 中企动力  如何快速搭建虚拟主机网站?新手必看指南  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何自定义建站之星网站的导航菜单样式?  网页设计与网站制作内容,怎样注册网站?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  JavaScript如何操作视频_媒体API怎么控制播放  如何快速登录WAP自助建站平台?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何在建站之星网店版论坛获取技术支持?  什么是javascript作用域_全局和局部作用域有什么区别?  linux top下的 minerd 木马清除方法  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  非常酷的网站设计制作软件,酷培ai教育官方网站?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何续费美橙建站之星域名及服务?  微信公众帐号开发教程之图文消息全攻略  如何挑选最适合建站的高性能VPS主机?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  JavaScript数据类型有哪些_如何准确判断一个变量的类型  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  微信小程序 闭包写法详细介绍  Laravel安装步骤详细教程_Laravel环境搭建指南  如何快速搭建高效WAP手机网站?  Linux系统命令中tree命令详解  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  中山网站推广排名,中山信息港登录入口?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  Laravel如何实现API资源集合?(Resource Collection教程)  如何在云主机上快速搭建多站点网站?  如何基于PHP生成高效IDC网络公司建站源码?  LinuxShell函数封装方法_脚本复用设计思路【教程】  网站制作免费,什么网站能看正片电影?  Laravel怎么使用Intervention Image库处理图片上传和缩放  制作旅游网站html,怎样注册旅游网站?  Thinkphp 中 distinct 的用法解析  微信小程序 scroll-view组件实现列表页实例代码  Laravel如何操作JSON类型的数据库字段?(Eloquent示例)  高防服务器租用如何选择配置与防御等级?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在阿里云通过域名搭建网站?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何在云主机上快速搭建网站?  香港服务器租用每月最低只需15元?  如何获取免费开源的自助建站系统源码?  Laravel如何生成URL和重定向?(路由助手函数)  Python制作简易注册登录系统  Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置