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 相关文章推荐
lib.utf.js
Aug 21 Javascript
jQuery布局插件UI Layout简介及使用方法
Apr 03 Javascript
js实现网页随机切换背景图片的方法
Nov 01 Javascript
使用Raygun来自动追踪AngularJS中的异常
Jun 23 Javascript
JS模式之简单的订阅者和发布者模式完整实例
Jun 30 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
Aug 11 Javascript
微信小程序 开发之快递查询功能的实现
Jan 09 Javascript
fetch 使用及如何接收JS传值
Nov 11 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
Jan 04 Javascript
javascript中函数的写法实例代码详解
Oct 28 Javascript
详解vue 不同环境配置不同的打包命令
Apr 07 Javascript
vue登录页面cookie的使用及页面跳转代码
Jul 10 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
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP读取Excel类文件
2017/05/15 PHP
javascript 面向对象全新理练之原型继承
2009/12/03 Javascript
js变换显示图片的实例
2013/04/16 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
简介JavaScript中POSITIVE_INFINITY值的使用
2015/06/05 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
JavaScript中浅讲ajax图文详解
2016/11/11 Javascript
快速入门Vue
2016/12/19 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
bootstrap动态添加面包屑(breadcrumb)及其响应事件的方法
2017/05/25 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
JavaScript中引用vs复制示例详析
2018/12/06 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
vue draggable resizable gorkys与v-chart使用与总结
2019/09/05 Javascript
python中文乱码的解决方法
2013/11/04 Python
python基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
2013/12/08 Python
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
pytorch实现CNN卷积神经网络
2020/02/19 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
两则小学生的自我评价分享
2013/11/14 职场文书
债务授权委托书范本
2014/10/17 职场文书
2014年工程师工作总结
2014/11/25 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
python实现Thrift服务端的方法
2021/04/20 Python
Python办公自动化解决world文件批量转换
2021/09/15 Python
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle