uni-app全局变量的存储和页面数据之间的传递

2023-11-15

https://ask.dcloud.net.cn/article/35021

1、变量存储

1.1使用公用模块存储 (就是一个公共的页面)

定义一个专用的模块页面,用来组织和管理这些全局的变量,也可以是方法,在需要的页面引入。

注意这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。

示例如下:
在 uni-app 项目根目录下创建 common 目录,然后在 common 目录下新建 a.js 文件然后导出(暴露出去)

// a.js 文件
const websiteUrl = 'http://uniapp.dcloud.io';  
const now = Date.now || function () {  
    return new Date().getTime();  
};  
const str = "blablabla~";
// 元素导出
export default {  
    websiteUrl,  
    now,  
    str, 
}

导入引用方式

在需要的文件中引用该模块

<script>  
	// 根据所在目录导入
    import a from './common/a.js';  

    export default {  
        data() {  
            return {};  
        },  
        onLoad(){  
            console.log('now:' + a.now());  
        },  
        methods: {  
        }  
    }  
</script>

1.2 挂载到 Vue.prototype存储

将一些使用频率较高的常量或者方法,直接扩展到 Vue.prototype 上,每个 Vue 对象都会“继承”下来,这样就可以在任意的vue文件中进行引用

注意这种方式只支持vue页面,每个页面中不要在出现重复的属性或方法名。

// 第一种直接挂载
Vue.prototype.$websiteUrl = 'http://uniapp.dcloud.io';

// 第二种将其他的文件挂载
import { a } from './a.js' 
Vue.prototype.$a = a

文件a种的内容

export const a = (sth) => { 
  return sth;
}

引用方式

<script>  
    export default {  
        data() {  
            return {};  
        },  
        onLoad(){  
            console.log('now:' + this.$websiteUrl);  // 第一种
            console.log('now:' + this.$a(balabala)); // 第二种
            // 打印输出
			// http://uniapp.dcloud.io
			// balabala  
        },  
        methods: {  
        }  
    }  
</script>

1.3使用globalData存储

官方文件:https://uniapp.dcloud.io/collocation/App.html#globaldata
小程序中有个globalData概念,可以在 App 上声明全局变量。 Vue 之前是没有这类概念的,但 uni-app 引入了globalData概念,并且在包括H5、App等平台都实现了。
在 App.vue 可以定义 globalData ,也可以使用 API 读写这个值。

globalData支持vue和nvue共享数据。

globalData是一种比较简单的全局变量使用方式。

在app.vue中定义

<script>  
    export default {  
        globalData: {  
            text: 'text'  
        },  
        onLaunch: function() {  
            console.log('App Launch')  
        },  
        onShow: function() {  
            console.log('App Show')  
        },  
        onHide: function() {  
            console.log('App Hide')  
        }  
    }  
</script>  

<style>  
    /*每个页面公共css */  
</style>  

js中操作globalData的方式如下:

赋值:getApp().globalData.text = 'test'

取值:console.log(getApp().globalData.text) // 'test'

如果需要把globalData的数据绑定到页面上,可在页面的onshow声明周期里进行变量重赋值。HBuilderX 2.0.3起,nvue页面在uni-app编译模式下,也支持onshow。

1.4 使用vuex状态管理存储

uniapp官方说明:https://uniapp.dcloud.io/tutorial/vue3-vuex.html#%E7%8A%B6%E6%80%81%E7%AE%A1%E7%90%86vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

uni-app 内置了 Vuex

HBuilderX 2.2.5+起,支持vue和nvue之间共享。说明

这里以登录后同步更新用户信息为例,简单说明下 Vuex 的用法,更多更详细的 Vuex 的内容,建议前往其官网 Vuex 学习下。我的vuex学习笔记

使用说明:

在 uni-app 项目根目录下新建 store 目录,在 store 目录下创建index.js定义状态值

// 页面路径:store/index.js 
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex);//vue的插件机制

//Vuex.Store 构造器选项
const store = new Vuex.Store({
	state:{//存放状态
		"username":"foo",
		"age":18
	}
})
export default store

main.js 中导入文件。然后,需要在 main.js 挂载 Vuex

// 页面路径:main.js
import Vue from 'vue'
import App from './App'

// 在 main.js 挂载 Vuex
import store from './store'
Vue.prototype.$store = store

// 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
const app = new Vue({
	store,
	...App
})
app.$mount()

引用方式1: 通过属性访问,需要在根节点注入 store

<!-- 页面路径:pages/index/index.vue -->
<template>
	<view>
		<text>用户名:{{username}}</text>
	</view>
</template>
<script>
	import store from '@/store/index.js';//需要引入store
	export default {
		data() {
			return {
				// 直接就可以拿到state中的状态值
				username:store.state.username 
			}
		}
	}
</script>

引用方式2 :组件中使用,通过this.$store.state.值访问到 state 里的数据。

<!-- 页面路径:pages/index/index.vue -->
<template>
	<view>
		<text>用户名:{{username}}</text>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				// 直接就可以拿到state中的状态值
				username:this.$store.state.username 
			}
		}
	}
</script>

vuex常用于:
未登录时,提示去登录。跳转至登录页后,点击“登录”获取用户信息,同步更新状态后,返回到个人中心即可看到信息同步的结果。
对比前面的方式,该方式更加适合处理全局的并且值会发生变化的情况。

vue 和 .nvue 并不是一个规范,因此一些在 .vue 中适用的方案并不适用于 .nvue。 Vue 上挂载属性,不能在 .nvue 中使用。

2、数据的传递

2.1URL的方式传递

在uniapp页面与页面之间的跳转时候,需要传递数据,一般我们通过URL的方式进行传递; 官方编程导航链接

例如:(官方示例)

url中使用字符串拼接的方式,如果有变量使用号拼接

//在起始页面跳转到test.vue页面并传递参数
uni.navigateTo({
	url: 'test?id=1&name=uniapp'+ "&sex=" + this.sex
});

数据的接收:

// 在test.vue页面接受参数
export default {
	onLoad(option) { //option为object类型,会序列化上个页面传递的参数
		console.log(option.id); //打印出上个页面传递的参数。
		console.log(option.name); //打印出上个页面传递的参数。
	}
}

提示:
url有长度限制,太长的字符串会传递失败,可改用窗体通信、全局变量,另外参数中出现空格等特殊字符时需要对参数进行编码,如下为使用encodeURIComponent对参数进行编码的示例。

2.2 使用全局变量的方式

见上变量的存储;根据项目的需求进行选用。

2.3 使用本地缓存的方式进行传递使用

将 data 存储在本地缓存中指定的 key 中,会覆盖掉原来该 key 对应的内容,这是一个同步接口。
可以直接将需要传递的数据本地存储起来,但是这种方法有很多弊端,只有在适合的情况下才能使用

使用方式

设置缓存
uni.setStorage(OBJECT). uni.setStorageSync(KEY,DATA)
从本地缓存中异步获取指定 key 对应的内容。
uni.getStorage(OBJECT) uni.getStorageSync(KEY)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uni-app全局变量的存储和页面数据之间的传递 的相关文章

  • 如何从 JavaScript 中计算 HTML 表格的渲染高度?

    调整窗口大小时 我需要知道表格有多大 以便我可以动态地很好地适应中间的所有其他内容 表格高度仅取决于动态加载的内容 如何在 JavaScript 中计算表格的渲染高度 您可以使用element offsetHeight https deve
  • Javascript 与 Python 关于 Python 'map()' 函数的比较

    Python中有一个函数叫做map这可以让你去 map someFunction x y z 并继续应用该功能的列表 是否有与此功能等效的 JavaScript 我现在刚刚学习Python 虽然我被告知javascript是函数式语言 但我
  • 在javascript中使用“return !0”有什么意义吗?

    如果您转到谷歌结果页面并运行rwt toString 你会看到这个函数的返回调用是 return 0 我想不出任何理由为什么这不会总是如此true 这只是一个简写吗true 还是还有更多事情发生 总是如此 但下载需要 2 个字节 0是 2
  • 如何使用 LinkedIn javascript sdk 检索包括所有字段的职位列表?

    我想要获取 LinkedIn 会员在其个人资料中输入的每个职位的 ID 头衔 摘要 开始日期 结束日期 当前状态和公司名称 我测试了一个查询休息控制台 https apigee com console linkedin我得到了想要的结果 查
  • 未捕获的类型错误:this.props.signinUser 不是一个函数(…)

    src actions index js import axios from axios const ROOT URL http localhost 3090 export function signinUser email passwor
  • 如何从表中选择所有偶数 id?

    我想从 MySQL 数据库的表中选择所有甚至帖子 ID 然后显示它们 我还想获取所有带有奇怪 id 的帖子并将它们显示在其他地方 我想使用 PHP 来完成此操作 因为这是我使用的服务器端语言 或者 我是否必须选择所有帖子 然后使用 Java
  • JQuery 动画文本

    找到简单 简单的动画文本是非常困难的 喜欢这个网站上的 内爆 http codecanyon net item jquery text animation full screen preview 233445 http codecanyon
  • 具有行组的 JQuery 斑马条纹表

    我通常将斑马条纹表行设置为奇数 偶数 如下所示 效果很好 table tbody tr visible even this addClass even table tbody tr visible odd this addClass odd
  • 提交前验证表单(比检查空字段更复杂)

    我有一个包含时间输入的表单 具体来说 开放时间和结束时间 当按下提交按钮时 它会转到一个 php 页面 其中这些输入将添加到数据库中 在允许提交表单之前我想检查一些事情 例如 我想确保开始时间早于 小于 结束时间 这是表格 Opens
  • JQuery DataTable 单元格从行单击

    我正在尝试在 jquery 数据表上实现一个函数 该函数返回单击行的第一列和第四列 我正在遵循这个示例 它允许我操作单击的行http datatables net examples api select single row html ht
  • 在 vue.js 模板中包含外部脚本

    我是 Vue js 和 web pack 的新手 所以我决定使用 vue cli webpack 来构建初始应用程序 我试图包含一个外部脚本 例如组件 不需要的模板中 但是 Vue 警告这是不允许的 我的 index html 文件与最初生
  • 将 NPM 包客户端与 nuxt 结合使用

    我对 nuxt 和 javascript 非常陌生 我正在尝试弄清楚如何在客户端使用我的应用程序的依赖项 我将它们列在我的 nuxt config js 中并使用 npm 安装 我也有一个文件 plugins导入它们的目录 不确定这是否好
  • Window 与 Var 声明变量[重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 中使用 var 和不使用 var 的区别 https stackoverflow com questions 1470488 difference between using v
  • 如何在 angularjs 中修剪()字符串?

    有角度特定的方法吗 如果没有 我应该使用内置的jquery 来做到这一点吗 如果我应该使用内置的jquery 如何在不使用 的情况下访问trim 函数 或者这是必要的 编辑 是的 我知道 str trim 对不起 我需要这个才能在 IE 8
  • RTCDataChannel发送方法不发送数据

    我的 RTCDataChannel 遇到一个奇怪的问题 我正在对 WebRTC 进行一些研究 并且已经可以进行 WebRTC 音频 视频聊天 现在我想使用 RTCDataChannel 添加文本聊天和文件共享 我已经像这样创建了 RTCDa
  • 为什么我需要 $(document.body) 来使用 Mootools Element 方法扩展 document.body?

    因此 在尝试让我的应用程序在最新的 IE 上运行后 结果发现 IE 不喜欢以下代码 document body getElement className Firefox 和 Chrome 响应良好 但是document bodyIE 上没有
  • 常规 JavaScript 可以与 jQuery 混合使用吗?

    例如 我可以采用这个脚本 来自 Mozilla 教程 https developer mozilla org en Canvas tutorial Basic usage
  • 如何在粘贴时获取文本区域输入字段的新值?

    我发现当我尝试从文本区域字段读取值时onpaste调用函数时 我得到字段的旧值 粘贴操作之前的值 而不是新值 粘贴操作之后的值 以下是此行为的演示 http jsfiddle net qsDnr http jsfiddle net qsDn
  • 使用 jQuery Tablesorter 操作后如何恢复当前页面?

    我正在使用 tablesorter 但无法找到有关插件 tablesorter 寻呼机的任何文档 问题是我有一个显示一些数据的表 并且在每一行中都有一个删除链接 该链接附加了要删除的元素的唯一标识符 显然 是否可以保存我正在删除的页面 然后
  • 如何在 JavaScript 中获取浮点数的小数位?

    我想要的是与 Number prototype toPrecision 几乎相反的 这意味着当我有数字时 它有多少位小数 例如 12 3456 getDecimals 4 对于任何想知道如何更快地完成此操作 无需转换为字符串 的人 这里有一

随机推荐

  • qt Connect 连接两种方式

    https blog csdn net xiezhongyuan07 article details 79247022 写的挺清楚
  • python画玫瑰图_python之windrose风向玫瑰图的用法-Go语言中文社区

    1 安装 A package is available and can be downloaded from PyPi and installed using pip install windrose Install latest deve
  • SamlSsoClient

    Copyright C 2009 Google Inc Licensed under the Apache License Version 2 0 the License you may not use this file except i
  • 显示具体化、显示实例化、隐式实例化

    讨论这三者的区别我们要先认识函数模板 函数模板是C 新增的功能 他会创建一个通用的函数以支持多种不同类型的形参 避免函数体的重复设计 在我们需要重复用到某一段代码但是需要处理不同类型的参数时 使用函数模板是很方便的一个手段他最大的特点是把数
  • 列可以设置 :formatter,对列的值进行处理

    需要对数字进行处理
  • 美图2022年财报:AIGC引领创新,多重驱动共振向上

    2022年是美图发展的关键之年 在数字化趋势加速的背景下 美图通过持续优化用户体验和不断拓展业务领域边界 进一步巩固了其行业竞争优势 近日 美图公司发布2022财年年度业绩 在收入 用户 创新等方面均取得了令人瞩目的成绩 展现了强劲的发展势
  • VMware导入vmdk文件(亲测有效)

    场景 从别的地方拷贝了一个系统镜像 后缀是vmdk格式 现在演示如何导入到本地 操作步骤 打开vmware 点击文件 新建虚拟机 2 选择自定义 高级 下一步 3 硬件兼容性 默认选择最新的行 因为和本地安装的vmware版本有关 这里演示
  • Fiddler笔记(一)

    个人学习笔记 整理不易 有帮助点个赞 笔记目录 学习笔记目录 pytest和unittest airtest weixin 42717928的博客 CSDN博客 目录 一 简单了解 二 下载安装 三 工具使用 四 HTTP协议报文结构 1
  • 【操作系统】Linux常用基础和高级命令

    目录 一 Linux内核 二 Linux发行版 操作系统 三 Linux终端 三 Linux终端命令 1 命令格式 2 常用基础命令 1 查看目录命令 2 切换目录命令 3 创建文件和目录命令 4 删除文件和目录命令 5 复制文件和目录命令
  • 使用LeNet实现图像分类任务

    本篇的主要内容是解析一下使用MindSpore深度学习框架训练LeNet网络对Mnist数据集进行分类 首先我给大家展示出本篇内容的一个示意图 帮助大家更直观的看到训练过程的一个重要步骤 如图所示 其中1 2 3 表示训练过程中的次序 下面
  • RSA密码原理详解及算法实现(六步即可掌握)

    一 RSA算法概述 rsa算法是一种非对称加密算法 其安全性是建立在大素数难以分解的基础上的 即将两个大素数相乘十分容易 但想对其乘积进行分解却很困难 所以可以将其乘积公开作为加密密钥 二 RSA算法设计理念 根据数论 寻求两个大素数比较简
  • mysql默认值语句

    添加新字段 并设置默认值 alter table test tb add column col3 varchar 20 not null DEFAULT abc 修改原有默认值 alter table test tb alter colum
  • springboot整合logback

    1 在springboot项目resource目录下 创建一个 logback spring xml 文件 2 在logback spring xml文件中添加内容
  • vscode代码统计

    1 安装插件 在vscode界面左侧 点击图中所示的菜单项 搜索Vscode counter 2 使用插件统计代码 点击顶部 View 菜单 gt 在下拉选项中选择第一项 Command Palette gt 工作区选择VscodeCoun
  • 循环机换变速箱油教程_循环机更换自动变速箱油,需要更换的车友可以先了解一下...

    前言 了解汽车知识 让每一位车主维修保养不花冤枉钱 胖哥闲置快半年的自动变速箱循环机 今天终于再次开张了 说起这玩意一年也用不了几次 没有还真不行 自动变速箱油一般6万公里更换 具体大家可根据自己的 车辆保养手册规定 自动变速箱油更换有三种
  • ffmpeg视频裁剪

    需要注意 ffmpeg 命令 s 指定了宽高后 如果为奇数宽高 101 101 则裁剪后的视频无法正常播放 不加 s则ffmpeg自动 1处理 private void cutVideo throws Exception try Strin
  • 数组及常用方法

    思维导图 数组的基本概念 什么是数组 数组是存储一个或多个数据的容积 它是一组内存空间 通常用来批量处理数据 这组内存空间的名字叫做数组2 数组的特点 对齐自身储存的数据并没有什么要求 无论是数量还是类型 数组中的每一项可以是任意一种数据类
  • Eviews导入外部Excel数据并回归分析

    本文是计量学习中学习笔记 下面直接放截图 导入数据在这一步之前 需要注意Excel中的数据文件不能有中文字符 否则会报错 回归时需要先选中被解释变量 同时按住Ctrl建依次再选中解释变量 回归结果中可以看出 3 6的参数是不过检的 这说明原
  • cadence学习笔记(5)-从其他PCB(AD、PADS)导出Allegro使用的封装库

    一 AD转Allegro封装库 1 AD转ASCLL文件 2 一定要选择ASCLL文件 3 打开Allegro软件导入刚刚生成的PCB文件 4 转化完成的PCB AD原PCB 5 导出AllegroPCB封装库 6 生成的封装库文件 二 P
  • uni-app全局变量的存储和页面数据之间的传递

    https ask dcloud net cn article 35021 目录 1 变量存储 1 1使用公用模块存储 就是一个公共的页面 1 2 挂载到 Vue prototype存储 1 3使用globalData存储 1 4 使用vu