Uniapp学习笔记-第三弹

96 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云星级博主

📌 擅长领域:全栈工程师、爬虫、ACM算法

💒 公众号:知识浅谈

🔥 联系方式vx:zsqtcc

uView UI模块的项目创建

安装方法: www.uviewui.com/components/…

uView UI的简单使用

uViewUI的组件:www.uviewui.com/components/…

uview封装vuex之后的用法

方法链接:www.uviewui.com/guide/globa…

具体实现

  1. uni-app目根目录新建'/store/index.js',并复制如下内容到其中

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    
    let lifeData = {};
    
    try{
    	// 尝试获取本地是否存在lifeData变量,第一次启动APP时是不存在的
    	lifeData = uni.getStorageSync('lifeData');
    }catch(e){
    	
    }
    //-----------------------重要点1:添加需要用就保存的vuex变量,从state中选取----------------------
    // 需要永久存储,且下次APP启动需要取出的,在state中的变量名
    let saveStateKeys = ['vuex_user', 'vuex_token'];
    
    // 保存变量到本地存储中
    const saveLifeData = function(key, value){
    	// 判断变量名是否在需要存储的数组中
    	if(saveStateKeys.indexOf(key) != -1) {
    		// 获取本地存储的lifeData对象,将变量添加到对象中
    		let tmp = uni.getStorageSync('lifeData');
    		// 第一次打开APP,不存在lifeData变量,故放一个{}空对象
    		tmp = tmp ? tmp : {};
    		tmp[key] = value;
    		// 执行这一步后,所有需要存储的变量,都挂载在本地的lifeData对象中
    		uni.setStorageSync('lifeData', tmp);
    	}
    }
    const store = new Vuex.Store({
    	//-----------------------重要点2: 添加vuex变量---------------------------
    	// 下面这些值仅为示例,使用过程中请删除
    	state: {
    		// 如果上面从本地获取的lifeData对象下有对应的属性,就赋值给state中对应的变量
    		// 加上vuex_前缀,是防止变量名冲突,也让人一目了然
    		vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {name: '明月'},
    		vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '',
    		// 如果vuex_version无需保存到本地永久存储,无需lifeData.vuex_version方式
    		vuex_version: '1.0.1',
    	},
    	mutations: {
    		$uStore(state, payload) {
    			// 判断是否多层级调用,state中为对象存在的情况,诸如user.info.score = 1
    			let nameArr = payload.name.split('.');
    			let saveKey = '';
    			let len = nameArr.length;
    			if(nameArr.length >= 2) {
    				let obj = state[nameArr[0]];
    				for(let i = 1; i < len - 1; i ++) {
    					obj = obj[nameArr[i]];
    				}
    				obj[nameArr[len - 1]] = payload.value;
    				saveKey = nameArr[0];
    			} else {
    				// 单层级变量,在state就是一个普通变量的情况
    				state[payload.name] = payload.value;
    				saveKey = payload.name;
    			}
    			// 保存变量到本地,见顶部函数定义
    			saveLifeData(saveKey, state[saveKey])
    		}
    	}
    })
    
    export default store
    
  2. uni-app目根目录新建'/store/u.mixin.js,并复制如下内容到其中,由于HX某些版本的限制,我们无法帮您自动引入"u.mixin.js',并复制如下内容到其中,由于HX某些版本的限制,我们无法帮您自动引入"u.mixin.js",您需要在main.js 中手动引入,并mixin处理。

    以下为"$u.mixin.js"文件:

    // $u.mixin.js
    
    import { mapState } from 'vuex'
    import store from "@/store"
    
    // 尝试将用户在根目录中的store/index.js的vuex的state变量,全部加载到全局变量中
    let $uStoreKey = [];
    try{
    	$uStoreKey = store.state ? Object.keys(store.state) : [];
    }catch(e){
    	
    }
    
    module.exports = {
    	created() {
    		// 将vuex方法挂在到$u中
    		// 使用方法为:如果要修改vuex的state中的user.name变量为"史诗" => this.$u.vuex('user.name', '史诗')
    		// 如果要修改vuex的state的version变量为1.0.1 => this.$u.vuex('version', '1.0.1')
    		this.$u.vuex = (name, value) => {
    			this.$store.commit('$uStore', {
    				name,value
    			})
    		}
    	},
    	computed: {
    		// 将vuex的state中的所有变量,解构到全局混入的mixin中
    		...mapState($uStoreKey)
    	}
    }
    

    以下为"main.js"文件:

    // main.js
    
    let vuexStore = require("@/store/$u.mixin.js");
    Vue.mixin(vuexStore);
    
  3. 在项目根目录的main.js中,引入"/store/index.js",并放到Vue示例中

    // main.js
    
    import store from '@/store';
    
    // 将store放入Vue对象创建中
    const app = new Vue({
    	store,
    	...App
    })
    
  4. 配置完之后使用

    1. 设置:
    前提是state里边有对应的变量名
    state: {
    	vuex_version: '1.0.0',
    	vuex_user: {
    		name: '白居易'
    	}
    }
    然后进行设置
    <script>
    	export default {
    		methods: {
    			modifyVuex() {
    				this.$u.vuex('vuex_version', '1.0.1');
    				// 修改对象的形式,中间用"."分隔
    				this.$u.vuex('vuex_user.name', '诗圣');
    			}
    		}
    	}
    </script>
    
    2. 取出vuex中的值
    
    <template>
    	<view>
    		<view>
    			版本号为:{{vuex_version}}    或者   {{this.vuex_version}}
    		</view>
    		<view>
    			<<琵琶行>>的作者为{{vuex_user.name}}
    		</view>
    		<u-button @click="modifyVuex">修改变量</u-button>
    	</view>
    </template>