uni-app 全局变量的几种实现方式

公用模块

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

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

示例如下:
在 uni-app 项目根目录下创建 common 目录,然后在 common 目录下新建 helper.js 用于定义公用的方法。

 1 const websiteUrl = ‘http://uniapp.dcloud.io‘;
 2 const now = Date.now || function () {
 3     return new Date().getTime();
 4 };
 5 const isArray = Array.isArray || function (obj) {
 6     return obj instanceof Array;
 7 };
 8
 9 export default {
10     websiteUrl,
11     now,
12     isArray
13 } 

接下来在 pages/index/index.vue 中引用该模块

 1 <script>
 2     import helper from ‘../../common/helper.js‘;
 3
 4     export default {
 5         data() {
 6             return {};
 7         },
 8         onLoad(){
 9             console.log(‘now:‘ + helper.now());
10         },
11         methods: {
12         }
13     }
14 </script>

这种方式维护起来比较方便,但是缺点就是每次都需要引入。

挂载 Vue.prototype

将一些使用频率较高的常量或者方法,直接扩展到 Vue.prototype 上,每个 Vue 对象都会“继承”下来。

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

示例如下:
在 main.js 中挂载属性/方法

Vue.prototype.websiteUrl = ‘http://uniapp.dcloud.io‘;
Vue.prototype.now = Date.now || function () {
    return new Date().getTime();
};
Vue.prototype.isArray = Array.isArray || function (obj) {
    return obj instanceof Array;
};  

然后在 pages/index/index.vue 中调用

 1 <script>
 2     export default {
 3         data() {
 4             return {};
 5         },
 6         onLoad(){
 7             console.log(‘now:‘ + this.now());
 8         },
 9         methods: {
10         }
11     }
12 </script>

这种方式,只需要在 main.js 中定义好即可在每个页面中直接调用。

Tips

  • 每个页面中不要在出现重复的属性或方法名。
  • 建议在 Vue.prototype 上挂载的属性或方法,可以加一个统一的前缀。比如 $url、global_url 这样,在阅读代码时也容易与当前页面的内容区分开。

globalData

小程序中可以在 App 上声明全局变量,但在 Vue 中没有,uni-app 中在 App.vue 可以定义在 globalData 属性上,也可以使用 API 读写这个值。

这个方式支持vue和nvue共享数据。是目前nvue和vue共享数据的一种比较好的方式。

定义: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。

Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

HBuilderX 2.2.5+起,支持vue和nvue之间共享。参考

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

举例说明:

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

const store = new Vuex.Store({
    state: {
        login: false,
        token: ‘‘,
        avatarUrl: ‘‘,
        userName: ‘‘
    },
    mutations: {
        login(state, provider) {
            console.log(state)
            console.log(provider)
            state.login = true;
            state.token = provider.token;
            state.userName = provider.userName;
            state.avatarUrl = provider.avatarUrl;
        },
        logout(state) {
            state.login = false;
            state.token = ‘‘;
            state.userName = ‘‘;
            state.avatarUrl = ‘‘;
        }
    }
})  

然后,需要在 main.js 挂载 Vuex

import store from ‘./store‘
Vue.prototype.$store = store  

最后,在 pages/index/index.vue 使用

 1 <script>
 2     import {
 3         mapState,
 4         mapMutations
 5     } from ‘vuex‘;
 6
 7     export default {
 8         computed: {
 9             ...mapState([‘avatarUrl‘, ‘login‘, ‘userName‘])
10         },
11         methods: {
12             ...mapMutations([‘logout‘])
13         }
14     }
15 </script>  
 

详细示例,请下载附件,在 HBuilderX 中运行。

示例操作步骤:
未登录时,提示去登录。跳转至登录页后,点击“登录”获取用户信息,同步更新状态后,返回到个人中心即可看到信息同步的结果。

注意:对比前面的方式,该方式更加适合处理全局的并且值会发生变化的情况。

注意事项

    • .vue 和 .nvue 并不是一个规范,因此一些在 .vue 中适用的方案并不适用于 .nvue。
    • Vue 上挂载属性,不能在 .nvue 中使用。
    • .nvue 不支持 vuex
    • 如果希望 .vue 和 .nvue 复用一些方法的话,需要采用公用模块的方案,分别在 .vue 和 .nvue 文件中引入。

原文地址:https://www.cnblogs.com/HopeInTheDark/p/11498483.html

时间: 2024-10-21 14:19:51

uni-app 全局变量的几种实现方式的相关文章

全局变量的几种实现方式

注:本文仅对这几种方式进行简短的阐述,作为记录. 我们在写代码时免不了要对一些变量进行一些存储,但有时这些变量或常量使用到的频率又非常高,不论从优化代码解决冗余还是少给自己添不必要的麻烦看,把这些重复的变量进行统一存储和管理是必要的. 1.公用模块 定义一个专用的模块,如在项目里common目录下建立一个heip.js的文件用来定义方法,然后在其他界面引入该模块或去该公用方法(可对不同的方法选择性进行引入). 如:import {getToken} from "./global"; 2

VUE 全局变量的几种实现方式

最近在学习VUE.js 中间涉及到JS全局变量,与其说是VUE的全局变量,不如说是模块化JS开发的全局变量. 1.全局变量专用模块 就是以一个特定模块来组织管理这些全局量,需要引用的地方导入该模块便好. 全局变量专用模块 Global.vue <script type="text/javascript"> const colorList = [ '#F9F900', '#6FB7B7', '#9999CC', '#B766AD', '#B87070', '#FF8F59',

JavaScript声明全局变量的三种方式

JavaScript声明全局变量的三种方式 JS中声明全局变量主要分为显式声明或者隐式声明下面分别介绍. 声明方式一: 使用var(关键字)+变量名(标识符)的方式在function外部声明,即为全局变量,否则在function声明的是局部变量.该方式即为显式声明详细如下: var test = 5; //全局变量 function a() { var cc=3; //局部变量 alert(test); } function b(){alert(test);} 声明方式二: 没有使用var,直接

手机 app 开发的几种方式 ionic 学习思路以及 ionic 新建的项目分析

手机 app 开发的几种方式 ionic 学习思路以及ionic 新建的项目分析 学习要点:1. 目前开发手机 app 的几种方式2. Ionic 学习思路简介3. Ionic CSS 框架4. ionic js 指令 路由 其他 ui 交互效果5. ionic 命令行/CLI 安装 调试 打包( 第三季 第一讲已讲)6. ionic 开发包下载 以及命令创建的项目分析 1. 目前开发手机 app 的几种方式原生/Native: 使用原生 SDK 开发 App.优点不用说, 当你有足够的资源,这

1、打印二进制机器码,程序内存分析,大端序小端序,指针数组,数组指针,数组的三种访问方式,typedef,#if-0-#endif,求数组大小,括号表达式

 1.打印二进制机器码(分别表示32位的和64位的) #include <stdio.h> /*按照8位的长度打印一个数值*/ void dis8bit(char val) { int bit = 8; while(bit--) { if(1<<bit&val){ printf("1"); } else { printf("0"); } if(!(bit%4)) printf(" "); } putchar(1

Android五种布局方式——LinearLayout、RelativeLayout、TableLayout....(四)

Android五种布局方式--LinearLayout.RelativeLayout .TableLayout.... Android使用XML声明界面布局 将程序的表现层和控制层分离 修改用户界面时,无需更改程序的源代码 可视化工具设计用户界面 Android五种布局方式 LinearLayout线性布局 AbsoluteLayout坐标布局 RelativeLayout相对布局 FrameLayout帧布局 TableLayout表格布局 GridLayout 1.LinearLayout线

ListView+CheckBox两种解决方式及原因分析

近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量较小,也没有发现什么问题. 后来数据多了. 页面须要滑动了, 发现了一个奇怪的问题,前面明明选中了,而再次滑动回去的时候居然变成未选中状态! 这是我刚開始写的那段错误的代码: @Override public View getView(int position, View convertView,

Android一个应用多个图标的几种实现方式

本文标签: Android activity-alias 新需求我的应用将有多个ICON入口..最终选择了 activity-alias , 其实实现多图标有好几种方式 1. 多Activity + intent-filter方式 因为launcher会扫描app中含有以下intent-filter属性的标签, 有的话就会将其添加到桌面.所以只要在你想添加到桌面的activity下加上以下标签即可. <intent-filter> <action android:name="a

关于popupwindow的两种实现方式

http://104zz.iteye.com/blog/1685389 android PopupWindow实现从底部弹出或滑出选择菜单或窗口 本实例弹出窗口主要是继承PopupWindow类来实现的弹出窗体,布局可以根据自己定义设计.弹出效果主要使用了translate和alpha样式实现,具体实习如下: 第一步:设计弹出窗口xml: Xml代码   <?xml version="1.0" encoding="utf-8"?> <Relativ