vue中的vuex

news2024/11/18 5:53:09

  在Windows的应用程序开发中,我们习惯了变量(对象)声明和使用方式,就是有全局和局部之分,定义好了全局变量(对象)以后在其他窗体中就可以使用,但是窗体之间的变量(对象)无法共享,如果需要可以通过参数传递的方式进行。

  在JavaScript编程中,很在意全局变量的定义使用,尽量避免全局变量的定义和使用,以防止出现可能的“变量污染”,比如其他应用随意修改全局变量。

  在vue中,如果只是一般的小程序或者个人独立开发的程序,全局变量(对象)不多,也可以直接在main.js或者App.vue中定义,然后在其他组件中直接使用定义好的变量(对象:参数和方法)。

  一、如果按照以往的想法,在其他组件中怎样使用main.js中或者其他组件中定义好的参数和方法?
  1、全局的变量、方法和属性需要挂载到vue的原型才能为其他组件使用。全局的变量、方法和属性需要一个显式定义,以便能够在全局范围内使用。

  例如,声明全局的变量或者方法:

Vue.prototype.$GlobalMethods = {
  MyChangeName: function (newName) {
    this.MyObj.name = newName;
  }
};

Vue.prototype.$GlobalVar='2222';

  这样就可以在其他组件使用定义好的变量或者方法:

//使用方法
this.$GlobalMethods.MyChangeName.call(this.$root, 'Jane123');
//使用变量
this.$GlobalVar='dddd';

  上面的方法是JavaScript本身具有的方法,虽然可以使用,但是vue是响应式的,这里变量的改变却不是响应式的,对于稍微大一些的程序或者团队开发的程序,这样的做法不可行。

  2、在main.js或者App.vue中定义的组件、变量、方法、属性都是局部的,除非通过如 props、$emit、Vuex 状态管理等向下与向上传递或者通过this.root来访问,否则并不能为其他组件使用。
  在main.js文件中,在创建一个根 Vue 实例后启动整个 Vue 应用。在这个文件中定义的变量、函数或 Vue 实例的其他配置仅属于该 Vue 实例。虽然这个根实例挂载的组件和子组件可以通过 this.$root访问到根实例的属性和方法,但这些属性和方法并不自动变为全局可用。
  在main.js中定义如下:

new Vue({
  data:{
    MyObj:{
      name:'John1',
      age:3
    }    
  },
  methods:{
      changeName(name){
        this.MyObj.name=name;
      }
  },
  router,
  store,
  render: h => h(App)
}).$mount('#app')

  在其他组件中使用:

this.$root.MyObj.name='修改后的名字';
this.$root.MyObj.age='222222';  
this.$root.changeName('PSP');

  3、全局组件,需要通过Vue.component('global-component01', {  // 组件配置 })来进行。

  4、在 Vue中的组件数据是隔离的,一个组件内部定义的data是无法被另一个组件直接访问和修改的。
  在前面的学习中,知道通过下面的几种方式来访问组件数据:
  ⑴. 事件总线(Event Bus)
  适用于小型应用,创建一个事件总线并在两个组件间通过它通信。在 Vue 2 中,你可以使用一个空的 Vue 实例作为中央事件总线。
  ⑵ 父子组件通信
  通过props把数据传给子组件,通过自定义事件或sync修饰符让子组件通知父组件进行相应的更新。
  ⑶ 通过$refs引用
  添加ref属性,在方法中直接调用子组件实例的方法或修改它的数据。
  上面的方式方法,前面写过文章《Vue组件化编程的组件通信》、《三种简洁易行的方法解决基于Vue.js的组件通信》。

  对于大型应用或者基于团队的开发,推荐使用 Vuex,Vuex提供更清晰和可维护的状态管理。

  二、使用vuex

  在使用vue create 项目名称创建项目时选择了VueX,就可以使用它来进行变量的共享操作。VueX 是一个用于 Vue.js 应用程序的状态管理模式和库,它可以集中管理应用程序的各种状态,包括变量、函数(方法)、组件等。

  修改store目录下的index.js:

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    age:0
  },
  mutations: {
    AddAge (state, num) {
      state.age += num;
    },
    ReduceAge (state, num) {
      state.age -= num;
    }
  },
  actions: {
    AddAge ({ commit }, num) {
      commit('AddAge', num);
    },
    ReduceAge ({ commit }, num) {
      commit('ReduceAge', num);
    }
  },
  getters: {
    age: state => state.age
  }
});

  修改HomeView.vue内容:

<template>
    <div>
        <h1>年龄:{{ age }}</h1>
        <input type="number" v-model="num" />
        <button @click="increment">增加年龄</button>  
        <button @click="decrement">减少年龄</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      num: 1
    };
  },
  computed: {
    age () {
      return this.$store.getters.age;
    }
  },
  methods: {
    increment () {
      this.$store.dispatch('AddAge', this.num);
    },
    decrement () {
      this.$store.dispatch('ReduceAge', this.num);
    }
  }
};
</script>

  结果显示:

  使用VueX进行组件之间的变量、方法函数的共享操作,看起来还是挺繁琐的。具体的使用也是因人因项目而宜,不是硬性要求。
  1、使用state对象来定义状态。
  2、mutations对象包含用于修改状态的方法。
  3、actions对象包含用于触发mutations的方法。
  4、getters对象包含用于获取状态的方法。
  5、组件使用时通过触发mutations定义好的方法来完成操作。

  下面是对多个变量的定义与使用。
  定义:

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

Vue.use(Vuex)

export default new Vuex.Store({
  state:{
        id:123,
        name:'John',
        age:1 
  },  
  mutations: {//修改
    ChangeAge (state, num) {
      state.age = num;
    },
  },
  actions: {
  },
  getters: {
    
  }
});

  使用:

<template>
    <div>
        <h1>ID:{{id }}</h1>
        <h1>姓名:{{ $store.state.name }}</h1>
        <h1>年龄:{{ age }}</h1>
        <input type="number" v-model="age">
  </div>
</template>

<script>
export default {
  computed: {
    id(){
      return this.$store.state.id;
    },
    age: {
      get(){
        return this.$store.state.age;
      },
      set(value){
        this.$store.commit('ChangeAge',value)
      }      
    }
  }
};
</script>


  对于多个变量也可以封装在一个对象中。

export default new Vuex.Store({
  state(){
    return {
      MyObj:{
        name:'John',
        age:1
      }
    }    
  },
  mutations: {
    AddAge (state, num) {
      state.MyObj.age += num;
    },
    ReduceAge (state, num) {
      state.MyObj.age -= num;
    }
  },
  actions: {
    AddAge ({ commit }, num) {
      commit('AddAge', num);
    },
    ReduceAge ({ commit }, num) {
      commit('ReduceAge', num);
    }
  },
  getters: {
    age: state => state.MyObj.age
  }
});

  三、使用mapState辅助函数

  mapState辅助函数是Vue.js提供的用于将store中的状态映射到组件的计算属性computed中。它简化了在组件中访问store中的状态的过程。
  通过mapState辅助函数可以将store中的状态定义为组件的计算属性,而不需要显式地访问store.state。
  当参数是数组时,每个元素可以是一个字符串或是一个函数。如果是字符串,它会作为映射后的计算属性名;如果是函数,函数中可以访问state,并返回一个计算属性值。
  当参数是对象时,可以使用键-值形式,其中键是计算属性名,值是一个函数。这个函数接受state作为第一个参数,可以直接访问state并返回一个计算属性值。
  比如上面的显示可以改写为:

<template>
    <div>
        <h1>ID:{{id }}</h1>
        <h1>姓名:{{ $store.state.name }}</h1>
        <h1>年龄:{{ age }}</h1>
        <input type="number" @input="ChangeAge" :value="age">
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
    computed: mapState(['id','name','age']),
    methods:{
        ChangeAge(e){
            this.$store.commit('ChangeAge',e.target.value)
        }
    }
};
</script>

  上面是采用数组的方式,下面是采用对象的方式:

<template>
    <div>
        <h1>ID:{{ MyID }}</h1>
        <h1>姓名:{{ name }}</h1>
        <h1>年龄:{{ ChangeAge }}</h1>
        <input type="number" v-model="num">
  </div>
</template>

<script>
import { mapState } from 'vuex';

export default {
    data(){
      return { num:1 }
    },
    computed:mapState({
      MyID:state=>state.id,
      name:'name',
      ChangeAge(state){
        return state.age+this.num
      }
    })
};
</script>

  得到的效果也是一样的。
  在计算属性的书写中,如果还有其他的计算方法或者属性,那么就需要使用对象展开符。

    computed:{
        count(){ return 1 },
        ...mapState({
        MyID:state=>state.id,
        name:'name',
        ChangeAge(state){
          return state.age+this.num
        }
      })
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++学习记录 多态—案例2—电脑组装

#include<iostream> using namespace std;//抽象不同的零件//抽象的cpu类 class Cpu { public://抽象的计算函数virtual void calculate() 0; };//抽象的显卡类 class VideoCard { public://抽象的显示函数virtual void display() 0; };//抽象的内存条类 class Memory …

【MySQL】聚合函数和内置函数

文章目录 1 :peach:聚合函数:peach:2 :peach:group by子句的使用:peach:3 :peach:内置函数:peach:3.1 :apple:日期函数:apple:3.2 :apple:字符串函数:apple:3.3 :apple:数学函数:apple: 4 :peach:其它函数:peach: 1 &#x1f351;聚合函数&#x1f351; 函数说明COUNT([DISTIN…

【大数据】Flink 架构(三):事件时间处理

《Flink 架构》系列&#xff08;已完结&#xff09;&#xff0c;共包含以下 6 篇文章&#xff1a; Flink 架构&#xff08;一&#xff09;&#xff1a;系统架构Flink 架构&#xff08;二&#xff09;&#xff1a;数据传输Flink 架构&#xff08;三&#xff09;&#xff1a;事件…

(十四)测频NE555应用

文章目录 NE555简介NE555原理图如何对NET_SIG&#xff08;P34&#xff09;引脚计脉冲测频应用部分代码现象 NE555简介 NE555是一种集成电路&#xff0c;其内部结构包括比较器、RS触发器、电压比较器和输出级三个主要功能模块。是由硬件直接产生的脉冲 NE555一些的常见应用&am…

Orion-14B-Chat-Plugin本地部署的解决方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

PGsql 解析json及json数组

创建测试数据 drop table if exists json_test; create table json_test as select 111 as id, {"nodes":{"1692328028076":{"nodeId":"1692328028076","nodeName":"测试表1","nodeType":"DATACO…

Golang 流媒体服务器lalserver使用指南

目录 安装 使用 1.推流 2.播放 官方地址 安装 1.下载源码 wget https://github.com/q191201771/lal/releases/download/v0.36.7/lal_v0.36.7_linux.zipunzip lal_v0.36.7_linux.zip cd lal_v0.36.7_linux 2.启动 ./bin/lalserver -c ./conf/lalserver.conf.json 使用 …

Linux部署lomp环境,安装typecho、WordPress博客

部署lomp环境&#xff0c;安装typecho、WordPress博客 一、环境要求1.1.版本信息1.2.准备阿里云服务器【新用户免费使用三个月】1.3.准备远程工具【FinalShell】 二、Linux下安装openresty三、Linux下安装Mysql四、安装Apache【此步骤可省略】4.1.安装Apache服务及其扩展包4.2.…

【React教程】(2) React之JSX入门与列表渲染、条件渲染详细代码示例

目录 JSX环境配置基本语法规则在 JSX 中嵌入 JavaScript 表达式在 JavaScript 表达式中嵌入 JSXJSX 中的节点属性声明子节点JSX 自动阻止注入攻击在 JSX 中使用注释JSX 原理列表循环DOM Elements 列表渲染语法高亮 条件渲染示例1&#xff1a;示例2&#xff1a;示例3&#xff08…

使用Docker安装Jenkins,并能够在该Jenkins中使用Docker

1. 构建Dockerfile 试错1 参考https://medium.com/manav503/how-to-build-docker-images-inside-a-jenkins-container-d59944102f30 按照文章里所介绍的&#xff0c;实现在Jenkins容器环境中依然能够调用Docker&#xff0c;需要做到以下几步 下载Jenkins镜像将环境中的docke…

解析PDF二维码:数字时代文件管理的创新之道

随着数字时代的来临&#xff0c;文件管理方式正经历着翻天覆地的变革。在这个变革的浪潮中&#xff0c;PDF二维码作为一种创新的技术手段&#xff0c;正逐渐引起人们的关注。本文将深入探讨PDF二维码的概念、应用领域以及在文件管理中的前景。 一、PDF二维码的概念 PDF二维码…

2024-01-29 ubuntu 用脚本设置安装交叉编译工具链路径方法,设置PATH环境变量

一、设置PATH环境变量的方法,建议用~/.bash_profile的方法&#xff0c;不然在ssh登录的时候可能没有设置PATH. 二、下面的完整的脚本&#xff0c;里面的echo "export PATH$build_toolchain_path:\$PATH" >> $HOME/.bashrc 就是把交叉编译路径写写到.bashrc设置…

笔记本从零安装ubuntu系统+多种方式远程控制

文章目录 前言ubuntu启动盘Windows远程Ubuntu安装XrdpXrdp卡顿问题解决Xrdp 二次登录会死机的问题Xrdp 卡顿问题 MobaXtermRustDesk 外网远程VNC 远程SSH远程其它设置 总结 前言 我有台老笔记本&#xff0c;上大学第一年的时候买的&#xff0c;现在已经不怎么好用了。打算刷个…

IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由&#xff0c;第一种缺省路由是由 level-1 路由器在特定条件下自动产生的&#xff0c;它的下一跳是离它最近的 &#xff08;cost 最小&#xff09;level-1-2路由器。第二种缺省路由是 IS-IS 路由器上使用 default-route-advertise 命令产生并发布的。 本次实…

最后50个CC龙年红包封面,免费速领!还有更多......高中生也卷起Steam来了

微信视频号之前是送了我3张新年红包封面&#xff0c;一共是150个&#xff0c;但不太会操作浪费了100个&#xff0c;只能我自己用来送老铁了。 晓衡又做了一条 Cocos 小可爱 CC 封面红包&#xff0c;特别适合送女生或给小朋友们&#xff0c;点击视频领取&#xff01;还好微信又送…

Vue学习之使用开发工具创建项目、gitcode管理项目

Vue学习之使用开发工具创建项目、gitcode管理项目 翻阅与学习了vue的开发工具&#xff0c;通过对比最终采用HBuilderX作为开发工具&#xff0c;以下章节对HBuilder安装与基础使用介绍 1. HBuilder 下载 从HbuildX官网&#xff08;http://www.dcloud.io/hbuilderx.html&#…

Servlet板块:文件上传下载操作 来自【汤米尼克的JAVAEE全套教程专栏】

Servlet板块&#xff1a;文件上传下载操作 一、文件上传&#xff08;1&#xff09;前端内容&#xff08;2&#xff09;后端内容 二、文件下载&#xff08;1&#xff09;前端的超链接下载&#xff08;2&#xff09;后端下载 一、文件上传 &#xff08;1&#xff09;前端内容 使…

Qt应用软件【协议篇】Modbus详细介绍

文章目录 概述Modbus 485协议概述在工业自动化中的应用 通信模式数据模型功能码 Modbus RTU示例 1&#xff1a;读取保持寄存器示例 2&#xff1a;写入单个线圈示例 3&#xff1a;写入多个保持寄存器报文传输 Modbus ASCII报文示例报文传输 Modbus TCP报文示例报文传输 概述 在…

《HTML 简易速速上手小册》第7章:HTML 多媒体与嵌入内容(2024 最新版)

文章目录 7.1 在HTML中嵌入视频和音频7.1.1 基础知识7.1.2 案例 1&#xff1a;嵌入视频文件7.1.3 案例 2&#xff1a;嵌入音频文件7.1.4 案例 3&#xff1a;创建一个视频和音频混合的播放列表 7.2 使用 <iframe> 嵌入外部内容7.2.1 基础知识7.2.2 案例 1&#xff1a;嵌入…

如何使用保留可探测字段参数的方法解决视频监控管理平台EasyCVR无法启动的问题

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…