前端开发:Vuex的基本使用

简介: 前端开发:Vuex的基本使用

Vuex

为vue.js应用程序开发的状态管理模式

采用集中式存储管理应用的所有组件状态

以相应的规则保证以一种可预测的方式发生变化

应用场景

读取,多个视图依赖于同一个状态

修改,不同视图的行为需要改变同一个状态

组成部分

State 数据仓库

getter 获取数据

Mutation 修改数据

Action 提交mutation

安装Vuex

1、安装vuex包:npm install vuex

2、创建实例:new Vuex.store()

3、在main.js中将vuex实例挂载到vue对象上

import Vue from 'vue'
import App from './App.vue'
import Vuex from 'vuex'

Vue.config.productionTip = false

Vue.use(Vuex)

const store = new Vuex.Store({
    state: {
        count: 0
    }
})

new Vue({
    store,
    render: h => h(App),
}).$mount('#app')

count++示例

思路

1、state中创建count字段

2、mutations中创建一个count++的mutation

3、button新增click事件触发mutation改变count

main.js

import Vue from 'vue'

import App from './App.vue'
import Vuex from 'vuex'

Vue.config.productionTip = false

Vue.use(Vuex)

const store = new Vuex.Store({
// 状态数据
state: {
count: 0
},

// 状态改变方法
mutations: {
// 第一个参数是state, 可以接受第二个参数
increaseCount(state) {
state.count++;
}
}
})

new Vue({
store,
render: h => h(App),
}).$mount('#app')

App.vue

<template>
<div id="app">
<h1>count: { {count}}</h1>
<button @click="increaseCount">点我++</button>
</div>
</template>

<script>
export default {
name: "app",

computed: {
count() {
// 获取状态数据
return this.$store.state.count;
}
},

methods: {
increaseCount() {
// 修改状态数据
this.$store.commit("increaseCount");
}r
}
};
</script>

项目实战

业务目标

1、制作一个需要账号登录的课程学习项目

2、不同的课程需要不同的会员等级,实现购买会员的功能,课程分享

项目功能

1、通过state.userinfo控制用户登录路由限制

2、多组件共享state.userStatus 和 state.vipLevel状态

3、多组件修改state.userstatus 和 state.vipLevel状态

文件目录树

src
├── App.vue
├── main.js
├── router.js
├── store
│ ├── actions.js
│ ├── getters.js
│ ├── index.js
│ ├── mutations.js
│ └── state.js
└── views
├── Home.vue
└── Login.vue

文件代码

App.vue

<template>
<div id="app">
<router-view/>
</div>
</template>

main.js

import Vue from 'vue'
import App from './App.vue'
import store from './store'
import router from './router'
import Vant from 'vant';
import 'vant/lib/index.css';

Vue.use(Vant);

Vue.config.productionTip = false

// 前置守卫,权限校验
router.beforeEach((to, from, next) => {
if (store.state.username || to.path === "/login") {
next()
} else {
next({
path: "/login"
})
}
})


new Vue({
store,
router,
render: h => h(App)
}).$mount('#app')

router.js

import Vue from 'vue'
import Router from 'vue-router'
import Home from './views/Home.vue'

Vue.use(Router)

export default new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [{
path: '/',
name: 'Home',
component: Home
},
{
path: '/login',
name: 'Login',
component: () =>
import ('./views/Login.vue')
}
]
})

store/actions.js

export default {
buyVip({ commit }, username) {
return new Promise((resolve, reject) => {
// 模拟后端交互耗时
setTimeout(() => {
commit("setUserInfo", username)
resolve("购买成功")
}, 1000)
})
}
}

store/getters.js

export default {
getUserLevel(state) {
switch (state.username) {
case "admin":
return "管理员";

case "user":
return "会员";

default:
return "普通用户"

}
}
}

store/index.js

import Vuex from 'vuex'
import Vue from 'vue'
import state from './state'
import mutations from './mutations'
import getters from './getters'
import actions from './actions'

Vue.use(Vuex)

const store = new Vuex.Store({
state,
getters,
actions, // 异步操作
mutations // 同步操作
})

export default store

store/mutations.js

export default {
setUserInfo(state, username) {
state.username = username;
}

}

store/state.js

export default {
username: "",
password: ""
}

views/Home.vue

<template>
<div>
<h1>详情页</h1>
<p>欢迎登录:</p>
<p>{ {this.$store.getters.getUserLevel}}</p>
<p>{ {getUserLevel}}</p>
<p>{ {this.$store.state.username }}</p>
<p>{ {username}}</p>
<van-button type="primary" @click="byVip" size="large">购买会员</van-button>
</div>
</template>

<script>
import { mapGetters, mapState } from "vuex";

export default {
computed: {
// 解构
...mapGetters(["getUserLevel"]),
...mapState(["username"])
},

methods: {
byVip() {
this.$store.dispatch("buyVip", "user").then(res => {
this.$dialog.alert({
message: res
});
});
}
}
};
</script>

views/Login.vue

<template>
<div style="margin: 20px;">
<div style="text-align: center;background-color:#EEEEEE">
<h1>登录</h1>
</div>
<van-cell-group>
<van-field v-model="username" label="用户名" placeholder="请输入用户名" required />

<van-field v-model="password" @keyup.enter.native="login" label="密码" type="password" placeholder="请输入密码" required />
<div style="margin-top:30px">
<van-button type="primary" @click="login" size="large">登录</van-button>
</div>
</van-cell-group>
</div>
</template>

<script>
export default {
data() {
return {
username: "",
password: ""
};
},
methods: {
login() {
if (this.username !== "" && this.password !== "") {
this.$store.commit("setUserInfo", this.username);
this.$router.push({
path: "/"
});
} else {
this.$dialog.alert({
message: "登录失败"
});
}
}
}
};
</script>


            </div>
目录
相关文章
|
7月前
|
机器学习/深度学习 编解码 流计算
STAR: 利用时空注意力机制和动态频率损失的视频超分辨率增强框架
STAR提出了一种创新的视频超分辨率解决方案,基于文本到视频(T2V)扩散模型架构,解决现有模型过度平滑和时间一致性不足的问题。通过引入局部信息增强模块(LIEM)和动态频率(DF)损失函数,STAR有效提升了空间细节重建能力和保真度。实验表明,STAR在合成数据集和真实场景数据集上均优于现有最先进的方法,展现出优秀的细节重建、时间和空间一致性。
141 9
STAR: 利用时空注意力机制和动态频率损失的视频超分辨率增强框架
|
7月前
|
人工智能 Python
Light-A-Video:好莱坞级打光自由!上海AI Lab开源视频打光AI,无需训练秒改画面氛围,3步让阴天变夕阳
Light-A-Video 是由上海AI Lab联合交大等高校推出的无需训练的视频重照明方法,支持高质量、时间一致的光照控制,零样本生成和前景背景分离处理。
201 9
Light-A-Video:好莱坞级打光自由!上海AI Lab开源视频打光AI,无需训练秒改画面氛围,3步让阴天变夕阳
|
Web App开发 前端开发 测试技术
Xpath Helper 在新版Edge中的安装及解决快捷键冲突问题
Xpath Helper 在新版Edge中的安装及解决快捷键冲突问题
750 0
|
7月前
|
运维 Kubernetes 数据可视化
即时通讯开源项目OpenIM配置可视化-etcd配置中心
即时通讯开源项目OpenIM二次开发
249 6
|
11月前
|
敏捷开发 人工智能 安全
IT创新的六大障碍
IT创新的六大障碍
|
11月前
|
消息中间件 前端开发 安全
简化部署流程:Rainbond让Jeepay支付系统部署更轻松
简化部署流程:Rainbond让Jeepay支付系统部署更轻松
|
10月前
|
存储 人工智能 大数据
拼多多详情API的价值与应用解析
拼多多作为中国电商市场的重要参与者,其开放平台提供的商品详情API接口为电商行业带来了新的机遇和挑战。该接口允许开发者通过编程方式获取商品的详细信息,包括标题、价格、描述、图片、规格参数和库存等,推动了电商运营的智能化和高效化。本文将深入解析拼多多详情API的价值与应用,帮助商家和开发者更好地理解和利用这一宝贵资源。
476 0
|
存储 SQL 监控
一文解读如何落地企业级云上日志审计方案
近年来,随着云计算的广泛应用和企业上云的深度普及,许多企业或个人用户将各种日志托管在云上进行留存,从而进行查询、审计等操作。什么是日志审计?为什么要做日志审计?企业如何落地云上日志审计方案?带着这些问题出发,本文将以阿里云日志服务(SLS)旗下的日志审计服务为视角切入,带领读者从当今网络安全形势和法律法规要求出发,解读云计算背景下,如何构建、运行、实践一个标准的企业级云上审计方案,从而更好地保障企业或组织的云上资产、云上数据的安全,确保企业业务持续安全稳定地运行。
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
1558 0
|
弹性计算 数据安全/隐私保护
阿里云域名购买和备案流程详解
不少新手小白,不知道该怎么购买阿里云域名,以及购买后如何备案阿里云,现在小编就和大家系统讲解一下。