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 相关文章推荐
JavaScript类和继承 this属性使用说明
Sep 03 Javascript
flash调用js中的方法,让js传递变量给flash的办法及思路
Aug 07 Javascript
javascript模拟地球旋转效果代码实例
Dec 02 Javascript
AngularJS手动表单验证
Feb 01 Javascript
JavaScript判断数字是否为质数的方法汇总
Jun 02 Javascript
EasyUI学习之Combobox下拉列表(1)
Dec 29 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
浅谈通过JS拦截 pushState和replaceState事件
Jul 21 Javascript
从零开始最小实现react服务器渲染详解
Jan 26 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
Oct 12 Javascript
如何在微信小程序中存setStorage
Dec 13 Javascript
JavaScript arguments.callee作用及替换方案详解
Sep 02 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 Coding Tips(php小技巧)[2011/04/02最后更新]
2011/05/02 PHP
php根据分类合并数组的方法实例详解
2013/11/06 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
2014/11/08 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
PHP使用curl制作简易百度搜索
2016/11/03 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
node.js中的fs.chownSync方法使用说明
2014/12/16 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
html的DOM中Event对象onblur事件用法实例
2015/01/21 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
javaScript日期工具类DateUtils详解
2017/12/08 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
详解基于Vue/React项目的移动端适配方案
2019/08/23 Javascript
Python实现一个简单的MySQL类
2015/01/07 Python
Python列表append和+的区别浅析
2015/02/02 Python
Python爬虫之正则表达式的使用教程详解
2018/10/25 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
Python中调用其他程序的方式详解
2019/08/06 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
Python内置函数及功能简介汇总
2020/10/13 Python
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
Weblogic的布署方式
2013/08/23 面试题
Linux如何压缩可执行文件
2013/10/21 面试题
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
法制宣传标语
2014/06/23 职场文书
教师党员个人整改措施
2014/10/27 职场文书
社区端午节活动总结
2015/02/11 职场文书
学校德育工作总结2015
2015/05/11 职场文书
idea 在springboot中使用lombok插件的方法
2021/08/02 Java/Android