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 相关文章推荐
mysql输出数据赋给js变量报unterminated string literal错误原因
May 22 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
Feb 13 Javascript
javascript验证邮件地址和MX记录的方法
Jun 16 Javascript
简要了解jQuery移动web开发的响应式布局设计
Dec 04 Javascript
原生js实现图片轮播特效
Dec 18 Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 Javascript
Vue.directive自定义指令的使用详解
Mar 10 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
Jul 12 jQuery
Three.JS实现三维场景
Dec 30 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
PHP实现添加购物车功能
2017/03/06 PHP
php注册系统和使用Xajax即时验证用户名是否被占用
2017/08/31 PHP
很酷的javascript loading效果代码
2008/06/18 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
网页中表单按回车就自动提交的问题的解决方案
2014/11/03 Javascript
JavaScript对象参数的引用传递
2016/01/14 Javascript
AngularJS基础 ng-mouseenter 指令示例代码
2016/08/02 Javascript
全面了解函数声明与函数表达式、变量提升
2016/08/09 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
jQuery中Datatables增加跳转到指定页功能
2017/02/08 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
实例详解vue.js浅度监听和深度监听及watch用法
2018/08/16 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
20道JS原理题助你面试一臂之力(必看)
2019/07/22 Javascript
Nodejs监控事件循环异常示例详解
2019/09/22 NodeJs
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
Python正则表达式使用范例分享
2016/12/04 Python
python查看模块安装位置的方法
2018/10/16 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
HTML5 解决苹果手机不能自动播放音乐问题
2017/12/27 HTML / CSS
幼儿园校车司机的岗位职责
2014/01/30 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
浅析CSS在DevTools 中架构演变
2021/10/05 HTML / CSS
Python利用zhdate模块实现农历日期处理
2022/03/31 Python
python 闭包函数详细介绍
2022/04/19 Python