Vuex实现计数器以及列表展示效果


Posted in Javascript onMarch 10, 2018

 本篇教程将以计数器及列表展示两个例子来讲解Vuex的简单用法。

本案例github

从安装到启动初始页面的过程都直接跳过。注意安装时选择需要路由。

首先,src目录下新建store目录及相应文件,结构如下:

Vuex实现计数器以及列表展示效果

index.js文件内容:

import Vue from "vue"
import Vuex from 'vuex'

Vue.use(Vuex);  //务必在new Vuex.Store之前use一下

export default new Vuex.Store({
 state:{
  count:0    //计数器的count
 },
 mutations:{
  increment(state){
   state.count++
  }
 }
})

src下的main.js里注册store

new Vue({
 el: '#app',
 router,
 store,    //注册store
 components: { App },
 template: '<App/>'
});

components文件夹内新建Num.vue组件,内容如下

<template>
 <div>
  <input type="button" value="+" @click="incr" />
  <input type="text" id="input" v-model="count"/>
  <input type="button" value="-"/>
  <br/>
  <router-link to="/list">列表demo</router-link>
 </div>
</template>

<script>
 import store from '../store'
 export default {

  computed:{
   count:{
    get:function () {
     return store.state.count
    },
    set:function (val) {
     store.state.count = val
    }
   }
  },

  methods:{
   incr(){
    // store.commit("increment")
    store.commit("increment")  //触发修改
   }
  }
 }
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>

</style>

router文件夹内配置路由:

import Vue from 'vue'
import Router from 'vue-router'
import Num from '../components/Num'
import List from '../components/List'

Vue.use(Router)

export default new Router({
 routes: [
  {
   path:'/num',
   component:Num
  },

  {
   path:"*",
   redirect:"/num"
  }
 ]
})

完成后启动,即可看到结果。计数器演示完成。

现在开始列表演示。

src目录下新建api文件夹,再新建api文件。

Vuex实现计数器以及列表展示效果

api/cover.js:

const _cover = [
 {"id": 1, "title": "iPad 4 Mini", "price": 500.01, "inventory": 2},
 {"id": 2, "title": "H&M T-Shirt White", "price": 10.99, "inventory": 10},
 {"id": 3, "title": "Charli XCX - Sucker CD", "price": 19.99, "inventory": 5}
];


export default {
 getCover(cb) {
  setTimeout(() => cb(_cover), 100);
/*  $.get("/api/data",function (data) {
   console.log(data);
  })*/

 },
}

修改store/modules/cover.js:(定义数据模型)

import cover from '../../api/cover'

const state = {
 all:[]
};

const getters={
 allCover:state=>state.all  //getter用来提供访问接口
};

const actions = {
 getAllCover({commit}){
  cover.getCover(covers=>{
   commit('setCover',covers)    //触发setCover修改。
  })
 },
 removeCover({commit},cover){
  commit('removeCover',cover)
 }
};

const mutations = {  //mutations用来修改state。
 setCover(state,covers){
  state.all = covers
 },
 removeCover(state,cover){
  console.log(cover.id);
  state.all = state.all.filter(function (OCover) {
   return OCover.id !== cover.id
  })
 }
};

export default {
 state,getters,actions,mutations
}

store内的index.js中注册数据模型:

import Vue from "vue"
import Vuex from 'vuex'
import cover from './modules/cover'

Vue.use(Vuex);  //务必在new Vuex.Store之前use一下

export default new Vuex.Store({

 modules:{
  cover     //注册cover数据模型
 },

 state:{
  count:0    //计数器的count
 },
 mutations:{
  increment(state){
   state.count++
  }
 }
})

components文件夹内新建List.vue组件,内容如下:

<template>
 <div class="list">
  <ul>
   <li v-for="cover in covers" @click="removeCover(cover)">
    {{cover.title}}
   </li>
  </ul>
  <p>
   {{covers}}
  </p>
  <h2>请尝试点击li。</h2>
  <router-link to="/num">计数器demo</router-link>

 </div>
</template>

<script>
import {mapGetters,mapActions} from 'vuex';

export default {
 computed:mapGetters({
  covers:"allCover"   //利用module的getter获得数据
 }),

 methods:mapActions([
  'removeCover'    //利用module的action删除数据
 ]),

 created(){
  this.$store.dispatch('getAllCover')  //调用cover数据模型的getAllCover action 用来初始化列表数据。
 }
}
</script>

<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
 .list{
  text-align: left;
 }
</style>

路由中注册新组件:

import Vue from 'vue'
import Router from 'vue-router'
import Num from '../components/Num'
import List from '../components/List'

Vue.use(Router)

export default new Router({
 routes: [
  {
   path:'/num',
   component:Num
  },
  {
   path:'/list',
   component:List
  },
  {
   path:"*",
   redirect:"/num"
  }
 ]
})

完成后访问http://localhost:8080/#/list,即可看到结果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
文本加密解密
Jun 23 Javascript
兼容Mozilla必须知道的知识。
Jan 09 Javascript
js点击button按钮跳转到另一个新页面
Oct 10 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
AngularJS动态绑定HTML的方法分析
Nov 07 Javascript
vue中使用cropperjs的方法
Mar 01 Javascript
Webpack devServer中的 proxy 实现跨域的解决
Jun 15 Javascript
使用async await 封装 axios的方法
Jul 09 Javascript
vue $set 给数据赋值的实例
Nov 09 Javascript
微信小程序自定义模态弹窗组件详解
Dec 24 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
Jan 12 Vue.js
在vue中使用css modules替代scroped的方法
Mar 10 #Javascript
redux-saga 初识和使用
Mar 10 #Javascript
JS获取input[file]的值并显示在页面的实现方法
Mar 09 #Javascript
vue获取当前点击的元素并传值的实例
Mar 09 #Javascript
vue.js获得当前元素的文字信息方法
Mar 09 #Javascript
vue element-ui 绑定@keyup事件无效的解决方法
Mar 09 #Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 #jQuery
You might like
Php做的端口嗅探器--可以指定网站和端口
2006/10/09 PHP
php下用GD生成生成缩略图的两个选择和区别
2007/04/17 PHP
php防止sql注入示例分析和几种常见攻击正则表达式
2014/01/12 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
如何书写高质量jQuery代码(使用jquery性能问题)
2014/06/30 Javascript
判断字符串的长度(优化版)中文占两个字符
2014/10/30 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
JS仿Windows开机启动Loading进度条的方法
2015/02/26 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
Vue监听数据渲染DOM完以后执行某个函数详解
2018/09/11 Javascript
Vue中用props给data赋初始值遇到的问题解决
2018/11/27 Javascript
微信小程序image图片加载完成监听
2019/08/31 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
[42:34]VP vs VG 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
opencv实现简单人脸识别
2021/02/19 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
美国演唱会和体育门票购买网站:Ticketnetwork
2018/10/19 全球购物
Yahoo-PHP面试题3
2012/01/14 面试题
国际政治个人自荐信范文
2013/11/26 职场文书
秘书专业自荐信范文
2013/12/26 职场文书
求职信模板怎么做
2014/01/26 职场文书
讲座主持词
2014/03/20 职场文书
中学生评语大全
2014/04/18 职场文书
2015年党员自评材料
2014/12/17 职场文书
离婚起诉书怎么写
2015/05/19 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
个人工作决心书
2015/09/22 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
交通事故协议书范本
2016/03/19 职场文书
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
nginx常用配置conf的示例代码详解
2022/03/21 Servers