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


Posted in Javascript onJune 28, 2017

回顾新闻详细页

很早我们的新闻详情页是在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>

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

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

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

其实就是更改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>

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

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

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

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

Javascript 相关文章推荐
jQuery 学习第七课 扩展jQuery的功能 插件开发
May 17 Javascript
推荐40个非常优秀的jQuery插件和教程【系列三】
Nov 09 Javascript
js Date概念详细介绍
Nov 22 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
jquery对象访问是什么及使用方法介绍
May 03 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
微信小程序中的swiper组件详解
Apr 14 Javascript
shiro授权的实现原理
Sep 21 Javascript
jQuery图片加载失败替换默认图片方法汇总
Nov 29 jQuery
JS+CSS实现炫酷光感效果
Sep 05 Javascript
JavaScript实现简单日历效果
Sep 11 Javascript
Vuex利用state保存新闻数据实例
Jun 28 #Javascript
微信浏览器禁止页面下拉查看网址实例详解
Jun 28 #Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 #Javascript
webpack学习--webpack经典7分钟入门教程
Jun 28 #Javascript
BootStrap Table前台和后台分页对JSON格式的要求
Jun 28 #Javascript
vue2项目使用sass的示例代码
Jun 28 #Javascript
微信小程序之网络请求简单封装实例详解
Jun 28 #Javascript
You might like
博士208HAF收音机实习报告
2021/03/02 无线电
javascript,php获取函数参数对象的代码
2011/02/03 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
php中switch语句用法详解
2015/08/17 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
php之可变变量的实例详解
2017/09/12 PHP
javascript 内存回收机制理解
2011/01/17 Javascript
通过JQuery实现win8一样酷炫的动态磁贴效果(示例代码)
2013/07/13 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
javascript简单比较日期大小的方法
2016/01/05 Javascript
实例讲解jquery与json的结合
2016/01/07 Javascript
jquery判断input值不为空的方法
2016/06/05 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
echarts3 使用总结(绘制各种图表,地图)
2017/01/05 Javascript
JavaScript实现单英文金山打字通
2020/07/24 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
Python运行的17个时新手常见错误小结
2012/08/07 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
python使用pyqt写带界面工具的示例代码
2017/10/23 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
行政助理岗位职责范文
2013/12/03 职场文书
领导干部对照检查材料
2014/08/24 职场文书
2014年标准化工作总结
2014/12/17 职场文书
学校运动会简讯
2015/07/20 职场文书
车间班组长竞聘书
2015/09/15 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
MySQL的存储过程和相关函数
2022/04/26 MySQL