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 相关文章推荐
jMessageBox 基于jQuery的窗口插件
Dec 09 Javascript
jQeury淡入淡出需要注意的问题
Sep 08 Javascript
将查询条件的input、select清空
Jan 14 Javascript
一个css与js结合的下拉菜单支持主流浏览器
Oct 08 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
谈谈JavaScript自定义回调函数
Oct 18 Javascript
纯JavaScript基于notie.js插件实现消息提示特效
Jan 18 Javascript
基于Vue2的移动端开发环境搭建详解
Nov 03 Javascript
w3c编程挑战_初级脚本算法实战篇
Jun 23 Javascript
vue源码入口文件分析(推荐)
Jan 30 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
Sep 23 Javascript
解决vant的Toast组件时提示not defined的问题
Nov 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
简单谈谈PHP中的include、include_once、require以及require_once语句
2016/04/23 PHP
Yii框架页面渲染操作实例详解
2019/07/19 PHP
php多进程应用场景实例详解
2019/07/22 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
checkbox 多选框 联动实现代码
2008/10/22 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
js 学习笔记(三)
2009/12/29 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
javascript中this指向详解
2016/04/23 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
jQuery.cookie.js使用方法及相关参数解释
2017/03/06 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
JS代码实现电脑配置检测功能
2018/03/21 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python中实现最小二乘法思路及实现代码
2018/01/04 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
Python使用微信接入图灵机器人过程解析
2019/11/04 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
软件测试面试题
2014/01/05 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
幼儿园教师国培感言
2014/02/02 职场文书
小学开学典礼主持词
2014/03/19 职场文书
公司股份合作协议书
2014/12/07 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
使用Redis做预定库存缓存功能
2022/04/02 Redis