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

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

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

相关文章

20240129收获

今天终于发现《八部金刚功》第五部我一直做的是错的&#xff0c;嗨。这里这个写法非常聪明&#xff0c;创立的数组&#xff0c;以及用obj[key] item[key]这样的写法&#xff0c;这个写法充分展示了js常规写法中只有等号右边会去参与运算&#xff0c;等号左边就是普通的键的写法…

项目实现网页分享QQ空间功能

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供“点击转发按钮&#x…

TensorFlow2实战-系列教程9:RNN文本分类1

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 1、文本分类任务 1.1 文本分类 数据集构建&#xff1a;影评数据集进行情感分析&…

Hana SQL+正则表达式

目录 一、Pre 前言 二、知识点拆解 1&#xff09;case when…then…else 2&#xff09;json_value 函数 拓展资料 3&#xff09;CAST 函数 拓展资料 4) ROUND 函数 5&#xff09;occurences_regexpr 函数 拓展资料 6&#xff09;正则表达式 拓展资料 三、整合分析…

10s 内得到一个干净、开箱即用的 Linux 系统

安装 使用官方脚本安装我的服务器不行 官方脚本 mkdir instantbox && cd $_ bash <(curl -sSL https://raw.githubusercontent.com/instantbox/instantbox/master/init.sh) 下面是我的完整安装过程 mkdir /opt/instantbox cd /opt/instantbox 1.脚本文件 (这个没…

[PHP]严格类型

PHP: 类型声明 - Manual

【学网攻】 第(15)节 -- 标准ACL访问控制列表

系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么? 二、实验 1.引入 实验拓扑图 实验配置 测试PC2能否Ping通PC3 配置ACL访问控制 实验验证 PC1 Ping PC3 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认…

Spring Boot导出EXCEL 文件

主要功能:实现java导出excel到本地 JDK版本&#xff1a;openJDK 20.0.1 依赖pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchem…

Java 面试题之 IO(一)

字节流 文章目录 字节流InputStream&#xff08;字节输入流&#xff09;OutputStream&#xff08;字节输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 InputStream&#xff08;字节输入流&#xff09; InputStream用于从源头&#xff08;通常是…

Centos Cron设置定时任务

这本是很简单的问题&#xff0c;但是我服务器重装系统两次&#xff0c;遇到的问题都不一样&#xff0c;所以记录一下 1.首先要确保服务器上有 cron 服务 sudo systemctl status crond2.设置时区 sudo timedatectl set-timezone Asia/Shanghai3.重启crond 服务使crond服务的时…

Xds (eXtensible Discovery Service)理解

Xds &#xff08;eXtensible Discovery Service&#xff09;理解 概念介绍 XDS&#xff1a;全称是 eXtensible Discovery Service&#xff0c;中文译为”可扩展的服务发现“。是一个扩展性的协议&#xff0c;可以用于配置和控制 Envoy 代理的各个方面&#xff0c;包括路由规则…

Leetcode 206 反转链表

反转链表 准备工作1&#xff09;ListNode基本结构2&#xff09;初始化ListNode集合 解法一&#xff1a;遍历创建新节点解法二&#xff1a;两组List&#xff0c;面向对象操作解法三&#xff1a;递归调用解法四&#xff1a;直接移动解法五&#xff1a;解法二的面向过程 Leetcode …

Ubuntu 20.04 Server 使用命令行设置 IP 地址

1、编辑 /etc/netplan/ 目录下的配置文件00-installer-config.yaml (修改之前&#xff0c;把原来的文件备份) 按照对应的配置进行修改IP地址和网关 2、运行命令使其生效 sudo netplan apply 修改完成后&#xff0c;永久有效。重启后配置不会丢失

【智能家居入门之微信小程序控制下位机】(STM32、ONENET云平台、微信小程序、HTTP协议)

实现微信小程序控制单片机外设动作 一、使用ONENET可视化组件控制单片机外设动作二、使用微信小程序控制单片机外设动作三、总结 本篇博客话接上文&#xff1a; https://blog.csdn.net/m0_71523511/article/details/135892908 上一篇博客实现了微信小程序接收单片机上传的数据…

三、防御保护---防火墙安全策略篇

三、防御保护---防火墙安全策略篇 一、什么是安全策略二、安全策略的组成1.匹配条件2.动作3.策略标识 三、防火墙的状态检测和会话表1.会话表2.状态检测技术 四、ASPF--隐形通道五、用户认证1.用户认证的分类2.认证方式3.认证策略4.认证域 一、什么是安全策略 传统的包过滤防火…

Mysql 更新数据

MySQL中使用UPDATE语句更新表中的记录&#xff0c;可以更新特定的行或者同时更新所有的行。基本语法结构如下&#xff1a; UPDATE table_name SET column_name1 value1,column_name2 value2,……, column_namen valuen WHERE(condition); column_name1,column_name2,……,…

mcu专用看门狗复位芯片(如MAX706)

mcu专用看门狗复位芯片&#xff08;如MAX706&#xff09; 为什么要使用电压复位芯片RESET引脚WDO引脚MR引脚WDI引脚 国产替代型号应用电路1 推荐电路&#xff08;用一个跳线帽使能/关闭看门狗功能&#xff0c;调试MCU时防止看门狗芯片随便触发复位功能&#xff09;&#xff0c;…

智能时代:自然语言生成SQL与知识图谱问答实战

语义解析 前言语义解析的应用场景总结概论语义解析和大模型的关系延伸阅读 前言 语义解析技术可以提高人机交互的效率和准确性&#xff0c;在自然语言处理、数据分析、智能客服、智能家居等领域都有广泛的应用前景。特别是在大数据时代&#xff0c;语义解析能够帮助企业更快速…

Unity中使用Ultraleap的InteractionButton组件

本节在上一节基础上进行&#xff0c;上一小结参考如下&#xff1a; Unity中创建Ultraleap 3Di交互项目 本节工程文件如下&#xff1a; Unity中使用Ultraleap的InteractionButton组件 本节结构有所更改&#xff0c;主要是参考官方示例结构进行重新调整&#xff0c;和上一小节相…

硬件知识(2) 手机的传感器-sensor

#灵感# 看看小米在干啥 手机型号&#xff1a;Redmi Note 13 Pro&#xff0c;解读一下它宣传的手机卖点。 目录 宣传1&#xff1a;1/1.4" 大底&#xff0c;f/1.65 大光圈&#xff0c; 宣传2&#xff1a;支持 2 亿像素超清直出&#xff0c;分辨率高达 16320 x 12240 宣…