vue中的vuex

  在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
        }
      })
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经调节的Hebbian学习用于完全测试时自适应

摘要 完全测试时自适应&#xff08;Fully test-time adaptation&#xff09;是指在推理阶段对输入样本进行序列分析&#xff0c;从而对网络模型进行自适应&#xff0c;以解决深度神经网络的跨域性能退化问题。我们从生物学合理性学习中获得灵感&#xff0c;其中神经元反应是基…

开发通用模板设计

文章目录 需求摘要1 模板描述2 模板内容介绍2.1 模块间依赖关系2.2 模板目前集成2.2.1 swaggerKnife4j2.2.1 nacosSpringBootSpringCloudAlibaba 3 项目地址4 FAQ 需求 目前在开发中&#xff0c;使用的非本人搭建的项目架子&#xff0c;存在如下问题&#xff1a; 依赖无法统一…

快速理解MoE模型

最近由于一些开源MoE模型的出现&#xff0c;带火了开源社区&#xff0c;为何&#xff1f;因为它开源了最有名气的GPT4的模型结构&#xff08;OPEN AI&#xff09;&#xff0c;GPT4为何那么强大呢&#xff1f;看看MoE模型的你就知道了。 MoE模型结构&#xff1a; 图中&#xff0…

贪吃蛇游戏的实现

一.技术要点: 贪吃蛇需要掌握: c语言函数,枚举,结构体,动态内存管理,预处理指令,链表,Win32 API等 二.Win32 API 1.Win32 API简介 windows可以帮应用程序卡其视窗,描绘图案,使用周边设备,,Win32 API就是windows32位平台上的应用程序编程接口 2.控制台程序 (1).使用cmd命令…

如何在群晖中本地部署WPS Office并实现公网远程访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

最优化基础 - (最优化问题分类、凸集)

系统学习最优化理论 什么是最优化问题&#xff1f; 决策问题&#xff1a; &#xff08;1&#xff09;决策变量 &#xff08;2&#xff09;目标函数&#xff08;一个或多个&#xff09; &#xff08;3&#xff09;一个可由可行策略组成的集合&#xff08;等式约束或者不等式约束…

【RT-DETR改进涨点】ResNet18、34、50、101等多个版本移植到ultralytics仓库(RT-DETR官方一比一移植)

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 本文是本专栏的第一篇改进,我将RT-DETR官方版本中的ResNet18、ResNet34、ResNet50、ResNet101移植到ultralytics仓库,网上很多改进机制是将基础版本的也就是2015年发布的ResNet移植到ultralytics仓库中,但是其实…

2024.1.29 GNSS 学习笔记

1.假设只对4颗卫星进行观测定位&#xff0c;卫星的截止高度角是15&#xff0c;那么如何布设这四颗卫星的位置&#xff0c;使其围成的四面体的体积得到最大&#xff0c;以获得最好定位精度&#xff1f; 答&#xff1a;3颗卫星均匀分布在最低仰角面上&#xff0c;第4颗卫星在测站…

live2D学习:表情的制作和给角色添加动作

表情的制作和给角色添加动作https://www.bilibili.com/video/BV1JE411Y7Te?p3&vd_source124076d7d88eee393a1d8bf6fc787efa 先把眼睛以外的部件进行锁定&#xff0c;可以长按鼠标左键&#xff0c;然进行框选左边的锁的部分&#xff0c;快速进行操作。 锁定的部件就没有办…

力扣712. 两个字符串的最小ASCII删除和

动态规划 思路&#xff1a; 假设 dp[i][j] 是 s1 长度 i 和 s2 长度 j 两个字符串的最小 ASCII 删除和&#xff1b;dp[i][j] 可以由&#xff1a; 如果 s1 的第 i 个字符&#xff08;s1[i - 1]&#xff09;和 s2 的第 j 个字符&#xff08;s2[j - 1]&#xff09;不相等&#xf…

这么复杂的刻度标签怎么绘制?超简单~~

今天我们开始「粉丝要求绘图系列」的第一篇推文 &#xff0c;这个系列我会筛选出需求较多的一类图进行绘制讲解&#xff0c;当然&#xff0c;绘图的数据我们尽可能的全部分享出来(即使涉及一些论文数据&#xff0c;我们也会根据情况进行虚构处理的)&#xff0c;本期的推文重要涉…

如何让wordpress首页只显示某一篇文章全部内容?在您的主页显示选择

大多数WordPress站点首页默认都是显示最新发布的文章列表&#xff0c;不过有些站点比较特殊&#xff0c;只想显示某一篇文章的全部内容&#xff0c;那么应该怎么设置呢&#xff1f; 其实&#xff0c;WordPress后台 >> 设置 >> 阅读 >> 在“您的主页显示”中…

Java规则引擎:实现高效SQL变量数据处理的关键

SQL变量加工 SQL加工背景&#xff0c;在决策配置过程中&#xff0c;一些复杂的逻辑或模型可通过自定义SQL脚本编写创建数据变量&#xff0c;通过SQL脚本可以便捷的从数据库中取数&#xff0c;并且自定义SQL支持传参&#xff0c;可满足更复杂多变的数据加工处理。 注意&#x…

《统计学习方法:李航》笔记 从原理到实现(基于python)-- 第5章 决策树

文章目录 第5章 决策树5.1 决策树模型与学习5.1.1 决策树模型5.1.2 决策树与if-then规则5.1.3 决策树与条件概率分布5.1.4 决策树学习5.2 特征选择5.2.1 特征选择问题5.2.2 信息增益5.2.3 信息增益比5.3.1 ID3算法5.3.2 C4.5的生成算法5.4 决策树的剪枝5.5 CART算法5.5.1 CART生…

步进伺服控制芯片TMC4361

TMC4361A 数据手册 步进电机运动控制器&#xff0c;支持 S 型斜坡和 sixPoint 六点式斜坡&#xff0c;进行了高速优化&#xff0c;支持动态修改运动参数。TMC4361A 包含 SPI 接口、Step/Dir 接口及闭环所需的编码器接口。 特征  简单易用的与微处理器通讯的 SPI 接口。  与…

操作系统基础:处理机调度【上】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;OS从基础到进阶 1 处理机调度&#xff08;上&#xff09;1.1 基本概念1.1.1 总览1.1.2 什么是调度1.1.3 调度的三个层次1.1.4 七状态模型1.1.5 三层调度的联系与对比1.1.6 总结 1.2 方式与…

编写交互式 Shell 脚本

在日常的系统管理和自动化任务中&#xff0c;使用 Shell 脚本可以为我们节省大量时间和精力。 文章将以输入 IP 为例&#xff0c;通过几个版本逐步完善一个案例。 原始需求 编写一个交互式的 Shell 脚本&#xff0c;运行时让用户可以输入IP地址&#xff0c;并且脚本会将输入…

linux批量查询python进程,批量关闭

我使用bash脚本启动了一个多进程的python代码&#xff0c;但是由于遗忘的问题&#xff0c;查看队列发现进程还在&#xff0c;但是我并不是使用linux的screen后台启动的&#xff0c;启动的进程丢失了&#xff0c;找不到启动这个的主进程了。我想能不能通过查询python启动命令&am…

HBuilderX插件

HBuilderX>工具插件安装 安装新插件 前往插件市场安装 1.DCloud插件市场 https://ext.dcloud.net.cn/ 2.GitHub官网 插件项目(下载zip) 本地离线包 离线安装插件 https://hx.dcloud.net.cn/Tutorial/OfflineInstall open /Applications/HBuilderX.app/Contents/HBuilderX/p…

【Linux】—— 信号的产生

本期&#xff0c;我们今天要将的是信号的第二个知识&#xff0c;即信号的产生。 目录 &#xff08;一&#xff09;通过终端按键产生信号 &#xff08;二&#xff09;调用系统函数向进程发信号 &#xff08;三&#xff09;由软件条件产生信号 &#xff08;四&#xff09;硬件…