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 相关文章推荐
比较简单的一个符合web标准的JS调用flash方法
Nov 29 Javascript
Javascript 面向对象 继承
May 13 Javascript
js onload处理html页面加载之后的事件
Oct 30 Javascript
Bootstrap每天必学之进度条
Nov 30 Javascript
JavaScript中的事件委托及好处
Jul 12 Javascript
js 判断附件后缀的简单实现方法
Oct 11 Javascript
原生js实现轮播图
Feb 27 Javascript
swiper 自动图片无限轮播实现代码
May 21 Javascript
vue组件化中slot的基本使用方法
May 01 Javascript
vue实现搜索过滤效果
May 28 Javascript
JavaScript实现简单计算器
Mar 19 Javascript
JS原形与原型链深入详解
May 09 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版)
2012/08/21 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
Node.js开发指南中的简单实例(mysql版)
2013/09/17 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
详解Bootstrap的aria-label和aria-labelledby应用
2016/01/04 Javascript
JS中使用apply方法通过不同数量的参数调用函数的方法
2016/05/31 Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
2016/06/14 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
详解Windows下安装Nodejs步骤
2017/05/18 NodeJs
详解Javascript中new()到底做了些什么?
2018/03/29 Javascript
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
使用Node搭建reactSSR服务端渲染架构
2018/08/30 Javascript
Iview Table组件中各种组件扩展的使用
2018/10/20 Javascript
JS+css3实现幻灯片轮播图
2020/08/14 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
Vue 3自定义指令开发的相关总结
2021/01/29 Vue.js
Python中map,reduce,filter和sorted函数的使用方法
2015/08/17 Python
深入解析Python中的上下文管理器
2016/06/28 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
使用python 对验证码图片进行降噪处理
2019/12/18 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
英国最大的在线照明商店:Litecraft
2020/08/31 全球购物
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
数控技术专业毕业自荐书范文
2014/02/05 职场文书
四年大学自我鉴定
2014/02/17 职场文书
单位员工收入证明样本
2014/10/09 职场文书
法定代表人授权委托书格式
2014/10/14 职场文书
护理专业自荐信范文
2015/03/06 职场文书
大学生奖学金获奖感言(范文)
2019/08/15 职场文书
普希金诗歌赏析(6首)
2019/08/22 职场文书
python tkinter实现定时关机
2021/04/21 Python