vuex 管理状态

来分析下vuex的管理状态吧,如果你用过react中的redux的管理树,那我觉得vuex对你来说很容易掌握

如果你还是不太熟悉vuex是什么,那先看下官网https://vuex.vuejs.org/zh-cn/intro.html,

看下这张图:

下面就举个例子会比较容易理解:

就拿vue的分页组件来理解吧

1. 创建 pagination.vue 文件。

<template>
    <div class="page-wrap">
      <ul v-show="prePage" class="li-page" v-tap="{methods: goPrePage}">上一页</ul>
      <ul>
        <li v-for="i in showPageBtn" :class="{active: i === currentPage, pointer: i, hover: i && i !== currentPage}"
            v-tap="{methods: goPage, i: i}">
          <a v-if="i" class="notPointer">{{i}}</a>
          <a v-else>···</a>
        </li>
      </ul>
      <ul v-show="nextPage" class="li-page" v-tap="{methods: goNextPage}">下一页</ul>
    </div>
</template>

2.组件的作用域是独立的,父组件通信通过 props 向其传递数据,分页组件通过 $emit 触发在父组件定义的事件实现和父组件的通信,因此预设从父组件获取到需显示的总数 num 为 20 , limit 为 5,当然你也可以随意设置这两个值~

let that
export default{
    data(){
      that = this
      return{
        num: 20,
        limit: 5
      }
    }
}

3.计算几个变量,在这里可以使用 vue 的计算属性 computed

// 总页数 totalPage 应该等于需显示的总数除以每页显示的个数,并向上取整,这个很好理解。
computed: {
      totalPage() {
        return Math.ceil(that.num / that.limit)
      }
    }
// 偏移量 offset,因为点击上下页、制定页码均会改变 offset 变量,父组件也需要用到这个变量发送 ajax 请求,因此使用 vuex 存储 offset。
 // pagination.vue
    computed: {
      offset() {
          return that.$store.state.offset
      }
    }
// 当前页面 currentPage,当前页面是比较重要的一个变量,显示用户当前所处页数,已知偏移量和每页显示数量可以得出当前页面是二者的余数向上取整,因为页数不从0开始,因此
computed: {
      currentPage() {
        return Math.ceil(that.offset / that.limit) + 1
      }
    }
//跳转事件,分别点击上一页、下一页和指定页码
 methods: {
      goPage(params) {
        if (params.i === 0 || params.i === that.currentPage) return
        that.$store.commit(‘GO_PAGE‘, (params.i-1) * that.limit)
        that.$emit(‘getNew‘)
      },
      goPrePage() {
        that.$store.commit(‘PRE_PAGE‘, that.limit)
        that.$emit(‘getNew‘)
      },
      goNextPage() {
        that.$store.commit(‘NEXT_PAGE‘, that.limit)
        that.$emit(‘getNew‘)
      }
    }

4.vuex 部分

  • 在此介绍一下 vuex 部分的实现,在 src 目录下(和 components 目录平级),新建 store 目录,其中 index.js 文件传入 mutation,初始化 vuex;
// vuex ?store/index.js
  import Vue from ‘vue‘
  import Vuex from ‘vuex‘
  import mutations from ‘./mutations‘

  Vue.use(Vuex);

  const state = {
    offset: 0
  };

  export default new Vuex.Store({
    state,
    mutations
  })
  • mutation-types.js 记录所有的事件名,其实这个文件最大的好处是能让我们更直观地管理所有的 vuex 方法,它的优点会在项目复杂后凸显出来,项目复杂时我们可能会使用 vuex 存储很多数据、定义很多方法,这时 mutation-types.js 就能更好更直观地管理这些方法。这也是一种设计理念嘛,有利于后期维护。

    // mutation-types.js
        export const PRE_PAGE = ‘PRE_PAGE‘
        export const NEXT_PAGE = ‘NEXT_PAGE‘
        export const GO_PAGE = ‘GO_PAGE‘
  • mutation.js 这是 vuex 的核心文件,注册了实现的所有事件,我们定义了点击上一页、下一页和跳转到指定页面的方法

    // mutation.js
      import * as types from ‘./mutation-types‘
    
      export default {
        // 分页 上一页
        [types.PRE_PAGE] (state, offset) {
          state.offset -= offset
        },
        // 分页 下一页
        [types.NEXT_PAGE] (state, offset) {
          state.offset += offset
        },
        // 分页 跳转到指定页码
        [types.GO_PAGE] (state, offset) {
          state.offset = offset
        }
      };

    最后你想要监听store里的state的变化你可以用这个2个函数,在页面里 用computed和watch来

computed: {
        initMovies() {
            return this.$store.state.movies;
        },
    },
    watch: {
        initMovies(val) {
            this.movies = val;
        }
    },

 对了 你也可以用this.$store.dispatch来触发actions里面type,最后在mutation.js里改变state。

对于复杂的项目来说,用vuex来管理,是最好的选择。

原文地址:https://www.cnblogs.com/yf-html/p/8979574.html

时间: 2024-10-02 15:02:01

vuex 管理状态的相关文章

(十六)硅谷外卖-使用 vuex 管理状态

一.下载vuex npm install --save vuex 二.定义state store/state.js export default { latitude: 40.10038, // 纬度 longitude: 116.36867, // 经度 address: {}, // 地址信息对象 categorys: [], // 分类数组 shops: [], } 三.定义mutation-types store/mutation-types.js export const RECEIV

iOS开发——修改指定文件的内存管理状态

今天项目要上线,在Archive时报错:  ARC forbids explicit message send of 'release' 'release' is unavailable: not available in automatic reference counting mode   项目中有几个第三方库用到MRC,在release时报错.在运行时没有用到这个库所以没有报错(没有确定).于是我改了那几个文件为MRC状态,成功Archive,在ARC改为-fobjc-arc,MRC为-f

angular8 + redux 管理状态

1. angular8.1.1 ----- package.json { "name": "angular-demo", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build"

Vuex,状态管理模式

对于 Vue 本人目前接触不深,只得浅层分析,Vue 是单向数据流, state,驱动应用的数据源: view,以声明方式将 state 映射到视图: actions,响应在 view 上的用户输入导致的状态变化. 子组件内部不能直接修改从父级传递过来的数据,子组件与子组件之间无法相互传递数据.如果我们想让两个子组件之间进行通信的话,可以借助子组件 A 向父组件传值,父组件接收子组件 A 的数据后再传给 B 组件这样的方式进行通信. 这就有一个尴尬的问题了,要是子组件 A 上面还有一层父组件,子

vuex 管理vue-router的传值

假设有这样的一种情况,在两个组件中.一个组件[A]主要是比如说放表格数据,而另外一个组件[B]是专门用来向组件A的表格添加数据的表单.这个时候就是两个兄弟组件之间传递数据了.首先想到的是使用兄弟组件传递数据的方法: 新建一个中间件(eventBus.js),即一个空的Vue对象.这个对象用来在兄弟组件之间传递数据.在B组件中触发事件,并且暴露数据.而在A组件中去接收B组件暴露的数据,使用如下 B: -------------------------------------------------

react中使用redux管理状态流程

1.在项目中安装redux插件 npm install redux -S 2.针对单独的view组件定义store状态存储对象,参数为对状态的更新操作函数 import { createStore } from 'redux'; const reducer = (state = 0, action) => { switch (action.type) { case 'INCREMENT': return state + 1; case 'DECREMENT': return state > 0

在使用自定义指令的时候,使用了一个引用传递的值来管理状态

就是在外部的控制器里面定义了一个变量,然后把它传给自定义组件.在自定义组件里面修改了.因为是引用传递.按道理组件里面改了,外面也会改.也会响应的是吧.但是我遇到的一个问题是.我在指令里面改了这个变量.然后在指令里面立马调用了外部控制器里面的方法此时变量的更改没有反应到外部控制器.出现了延时的状况.这时候我用$timeout为0就能解决.然后就能同步.这个坑其实我也不知道什么原因.可能和他angular里面的机制有关系吧.

vuex管理页面标题

1.在store -> mutation-types.js文件新增常量 export const UPDATE_TITLE = 'UPDATE_TITLE' 2.新增文件title.js目录结构如下 store ->moudules ->title.js import * as types from '../mutation-types' //state export const state = { navigationTitle : '' } //mutation export con

歌曲播放页面的数据vuex管理

1.state.js 1 import {playMode} from '@/common/js/config' 2 const state = { 3 singer:{}, 4 playing:false, 5 fullScreen:false, 6 playlist:[], 7 sequenceList:[], 8 mode:playMode.sequence, 9 currentIndex:-1, 10 } 11 12 export default state 2.getters.js 1