vue - vuex详细讲解和modules模块化的使用

这篇具有很好参考价值的文章主要介绍了vue - vuex详细讲解和modules模块化的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vuex 简介

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
通俗的来说,vuex是用于当某一状态需要在多个组件中共享,方便我们使用并追踪这些状态时使用。

1,vuex的总体结构

vuex的总体结构分为 modules下面的所有子模块和根模块(即全局状态) 这里我把rootState这个根模块放到了modules文件夹的外面,当然也可以放到里面;最后就是在index 统一进行整合。

vue - vuex详细讲解和modules模块化的使用

2,各子模块的内部结构及作用

这是vuex的内部代码结构,所有的子模块都是一样的;
state:存放数据状态;
action:指派mutation ;
mutation:修改state里面的状态;
getter:侧重于对数据的再次加工;
mdules:用于模块化;

我们更倾向于把异步请求放到action里面,当然vuex官方也有意这么做;一是为了追踪状态,二是为了做代码隔离,通常不受控的代码集中到action;受控的操作放到 mutation中,mutation只做纯函数的状态改变;

dialog.js

/**
 * 弹窗组件模块 属于子模块
 */
const state = {
  dialog: '我是dialog',
};

const actions = {
  // 把 commit属性从 context里面解构出来
  setDialog: ({ commit }, dia) => commit('commitDialog', dia),
};

// 使用 mutation更新 state
const mutations = {
  commitDialog: (state, dialog) => (state.dialog = dialog),
};

// 把数据导出时可以对数据做一些操作 但不会改变原数据
const getters = {
  currentDialog: (state) => state.dialog + '123',
};

export default {
  state,
  mutations,
  actions,
  getters,
  namespaced: true,
};
// namespaced: true  命名空间这一行一定要写,这是vuex寻找子组件的依据;

注意:这个设计和组件传值一样,是一个单向的数据流:是为了方便管理各个状态,知道状态在哪一步发生了改变,便于状态的维护和使用;

3,index 文件的结构

上面是引入各个子模块的文件,下面在modules对象里面使用,要注意根模块一定要放在modules外面,因为他是特殊的,这边用扩展运算符直接把roortState解构进来了。
注意:这里面用到了持久化缓存插件 vuex-persistedstate 解决了vuex刷新页面状态丢失的问题,通过这个插件把vuex里面的数据都储存到了localStorage里面;当然你也可以放到sessionStorage里面;只不过要这样写:
plugins: [createPersistedState({
storage: window.sessionStorage
})]

index.js

import Vue from 'vue';
import Vuex from 'vuex';
// 持久化缓存
import createPersistedState from 'vuex-persistedstate';
// 下面引入子模块
import rootState from './rootState'; // 根模块状态管理引入
import dialog from './modules/dialog';
import videoState from './modules/videoState';

Vue.use(Vuex);

export default new Vuex.Store({
  ...rootState, // 这里存放的是根模块 也就是全局模块
  modules: {
    dialog,
    videoState,
  },
  // 把vuex里面的所有数据都储存到了localStorage里面 不用担心刷新数据丢失的问题
  plugins: [createPersistedState()],
});

4,开始使用

这是对以下代码的使用说明,主要配合了vuex辅助函数来进行使用;

1,getDialog() 方法使用子模块dialog 里面的setDialog方法改变了子模块的状态;
2,getDialogGetter() 方法使用子模块dialog 里面的Getter属性获取了改变之后的数据;
Getter用于对Store中的数据进行加工,处理形成新的数据,不会修改Store中的原数据,类似计算属性。但Store中数据发生变化,Getter的数据也会跟着变化;
3,getRootState() 方法使用根组件的setRootStatue方法改变了全局状态,注意:获取根组件的方法时 后面要加上 {root:true} 来标明这是根组件;可以参考我下面的写法;
4 ,getRootState2() 方法可以直接获取根组件里面的状态;这里在业务逻辑上可以做一些判断什么的

页面中使用:

<template>
  <!-- 父组件 -->
  <div class="dialog">
    <button @click="getDialog">使用子组件dialog里面的方法改变状态</button>
    <br />
    <button class="_getter" @click="getDialogGetter">获取弹窗组件getter返回的数据</button>
    <br>
    <button class="_getter" @click="getRootState">使用根模块里面的方法</button>
    <br>
    <button class="_getter" @click="getRootState2">获取根模块里面的数据</button>
  </div>
</template>

<script>
// 1.引入辅助函数
import { mapActions, mapGetters, mapMutations, mapState } from 'vuex';
export default {
  name: '',
  mixins: [],
  components: {
  },
  props: {},
  data() {
    return {
    };
  },
  computed: {
    // mapState 和 mapGetters
    ...mapState('dialog', ['dialog']),

    // 这里想要访问根模块里面的方法  需要这样写后面加上 {root:true}
    ...mapState(['rootStatue',{root:true}]),
    ...mapGetters('dialog', ['currentDialog']),

  },
  watch: {},
  created() {},
  mounted() {},
  methods: {
    // 2,使用
    ...mapActions('dialog', ['setDialog']),

    // 这里想要访问根模块里面的方法  需要这样写后面加上 {root:true}
    ...mapActions(['setRootStatue',{root:true}]),
    
	// 使用子组件dialog里面的方法改变状态
    getDialog() {
      console.log('之前的数据:', this.dialog);
      // 3,改状态
      this.setDialog('nihao');
      //4,查看是否改动成功  改动成功
      console.log('之后的数据:', this.dialog);
    },

    // 获取getter里面的内容
    getDialogGetter() {
      let dialogGetter = this.currentDialog;
      console.log('获取getter里面返回的数据:', dialogGetter);
    },

    // 使用根模块里面的方法改变状态
    getRootState(){
      console.log('之前的数据:', this.rootStatue);
      this.setRootStatue('false')
      console.log('改变后的数据:', this.rootStatue);
    },

    // 获取根模块里面的数据
    getRootState2(){
      console.log("根模块的数据:",this.rootStatue);
    },

  },
};
</script>

<style scoped lang="scss">
.tipsDialog {
  cursor: pointer;
}
._getter {
  display: block;
  margin-top: 10px;
}
</style>

rootState根组件里面的结构

/**
 * 根模块 储存全局状态管理 
 */
 const state = {
    rootStatue:'true',
  };
  // 使用 mutation更新 state
  const mutations = {
    commitRootStatue: (state, sta) => (state.rootStatue = sta),
  
  };
  const actions = {
    setRootStatue:({commit},sta)=> commit('commitRootStatue',sta,)
  };
  
  const getters = {
    
  };
  
  export default {
    state,
    mutations,
    actions,
    getters,
    namespaced: true,
  };
  

5,总结

vuex中一共有五个状态 State Getter Mutation Action Module ;需要知道他们的关系和侧重点;

  • Action: 侧重请求数据以及对业务逻辑的判断处理等;

  • Mutation: 侧重于对state里面的状态的修改;

  • Getter : 侧重于对数据的再次加工和处理,如果你对数据的修改或使用却不想改变原数据;那么你可以使用它;

  • Modules : 侧重于对多个状态的管理和分享;文章来源地址https://www.toymoban.com/news/detail-462127.html

到了这里,关于vue - vuex详细讲解和modules模块化的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CSS Modules - CSS模块化

    参考文章: CSS Modules 用法教程-阮一峰 css module css模块化及CSS Modules使用详解 CSS 模块化的解决方案有很多,但主要有两类: 一类是 彻底抛弃 CSS,使用 JS 或 JSON 来写样式 。Radium,jsxstyle,react-style 属于这一类。 优点是能给 CSS 提供 JS 同样强大的模块化能力; 缺点是不能利用

    2024年02月05日
    浏览(44)
  • 前端框架的CSS模块化(CSS Modules)

    创作纪念日之际,来给大家分享一篇文章吧 聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些

    2024年03月27日
    浏览(48)
  • GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发

    自己亲自实践: mac安装webpack 前提:已经安装node.js,可以参考 https://blog.csdn.net/ZHOU_VIP/article/details/128807814?spm=1001.2014.3001.5501 webpack 安装 首先确认一下是否已经安装: webpack -v 如果提示  command not found: webpack ,则表示未安装。 在Mac OS上安装webpack,需要先安装Node.js和npm。建议

    2024年02月11日
    浏览(58)
  • ES6之Promise、Class类与模块化(Modules)

    Promise 是 ES6 引入的一种用于 处理异步操作 的对象。 它解决了传统回调函数(callback)模式中容易出现的 回调地狱 和代码可读性差的问题。 Promise 对象有三种状态: Pending (进行中): 初始化状态,表示异步操作还在进行中。 Fulfilled (已成功): 表示异步操作执行成功,并

    2024年02月10日
    浏览(47)
  • Node.js开发、CommondJS 、ES-Module模块化设计

    目录  Node.js是什么 基础使用 Node的REPL 全局变量  模块化设计 CommondJS规范  基础使用exports和module.exports require  CommondJS优缺点 AMD和CMD规范 ES_Module  基本使用方法 导出 导入  结合使用 默认导出 ES Module解析流程  Node与浏览器的对比  在浏览器中,HTML与CSS交给Blink处理,如果其

    2023年04月21日
    浏览(44)
  • 基于Basys2的数码管动态扫描module(verilog)的模块化设计

        目录 一、数码管工作原理  二、Verilog模块设计 1、原理 (1)动态扫描的优点: (2)动态扫描原理简介: 2、Verilog模块的设计 (1)分频器:  2、译码器模块: 3、动态扫描模块: 4、顶层模块: 三、写在最后: 在大二下学期学习《Verilog与FPGA实现》的时候鲲鲲给我们布

    2024年02月09日
    浏览(65)
  • Vue待办事项(组件,模块化)

    //html页面代码 !DOCTYPE html html     head         meta charset=\\\"utf-8\\\"         title/title         style             * {                 padding: 0;                 margin: 0;             }             ul,             ol {                 list-style: none;     

    2024年01月21日
    浏览(54)
  • Vue的模块化开发初探

    Vue是一个渐进式JavaScript框架,可以按需引入部分功能,而不必全量引入整个框架。 2.1 下载必须模块 在浏览器输入: https://unpkg.com/vue@3/dist/vue.esm-browser.js ,右键另存为,保存到demo.html文件同级目录下。 2.2 安装Live Server插件 在VSCode插件市场搜索Live Server并安装,如下图: 2.

    2024年04月10日
    浏览(60)
  • JDK 9 模块化系统 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

    博文目录 Java 9引入了模块化系统的主要原因是为了解决Java平台面临的复杂性和可维护性方面的挑战。以下是一些采用模块化系统的主要原因: 更好的代码组织:传统的Java应用程序通常由大量的JAR文件组成,这些JAR文件之间的依赖关系可能变得非常复杂。模块化系统允许开发

    2024年02月04日
    浏览(46)
  • 前端基础(Vue的模块化开发)

      前言 :前面学习了前端HTML、CSS样式、JavaScript以及Vue框架的简单适用,接下来运用前端模块化编程的思想,继续学习Vue框架,完成自己项目项目的搭建。 目录 响应式基础 ref reactive 学习成果展示 Vue项目搭建 搭建自己的vue项目 总结  关于ref和reactive,官方解释如下,另外一

    2024年02月12日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包