vuex官方文档: 点击打开链接
1、Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式
(1).vuex解决了组件之间同一状态的共享问题 (解决了不同组件之间的数据共享)
(2).组件里面数据的持久化。
小项目尽量不要使用用vuex
2、vuex的使用:(1).src目录下面新建一个vuex的文件夹
(2).vuex 文件夹里面新建一个store.js
3、安装vuex
cnpm install vuex --save
4、在刚才创建的store.js引入vue 引入vuex 并且use vuex
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
5、定义数据
/*1.state在vuex中用于存储数据*/
var state={
count:1
}
6、定义方法 mutations里面放的是方法,方法主要用于改变state里面的数据
var mutations={
incCount(){
++state.count;
}
}
暴露给外部使用
const store = new Vuex.Store({
state,
mutations
})
export default store;
7、组建里面使用vuex:
(1).引入 store
import store from '../vuex/store.js';
(2).注册
export default{
data(){
return {
msg:'我是一个home组件',
value1: null,
}
},
store,
methods:{
incCount(){
this.$store.commit('incCount'); /*触发 state里面的数据*/
}
}
}
(3).获取state里面的数据
this.$store.state.数据
(4).触发 mutations 改变 state里面的数据
this.$store.commit('incCount');
8、实例代码:
(1).src/vuex/store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex);
/*1.state在vuex中用于存储数据*/
var state={
count:1
}
/*2.mutations里面放的是方法,方法主要用于改变state里面的数据
*/
var mutations={
incCount(){
++state.count;
}
}
//vuex 实例化 Vuex.store
const store = new Vuex.Store({
state,
mutations
})
export default store;
(2).主页中使用store改变数据,文件位置src/components/Home.vue
<template>
<div id="home">
我是首页组件 -- {{this.$store.state.count}}
<br>
<button @click="incCount()">增加数量+</button>
</div>
</template>
<script>
//1. 引入store 建议store的名字不要变
//import MyStore from '../vuex/store.js'
import store from '../vuex/store.js';
//2.注册
export default{
data(){
return {
msg:'我是一个home组件',
value1: null,
}
},
store, //如果改了,应该使用这样的格式:store:MyStore
methods:{
incCount(){
//改变vuex store里面的数据
this.$store.commit('incCount'); /*触发 mutations 改变 state里面的数据*/
}
}
}
</script>
<style lang="scss" scoped>
</style>
(3),新闻组件使用store,改变数据,文件位置:src/components/News.vue
<template>
<div id="news">
我是新闻组件 --{{this.$store.state.count}}
<br>
<button @click="incCount()">增加数量</button>
</div>
</template>
<script>
//1. 引入store
import store from '../vuex/store.js';
export default{
data(){
return {
msg:'我是一个新闻组件'
}
},
store,
methods:{
incCount(){
this.$store.commit('incCount');
}
}
}
</script>
<style lang="scss" scoped>
.list{
li{
height:3.4rem;
line-height:3.4rem;
boder-bottom:1px solid #eee;
font-size:1.6rem;
a{
color:#666;
}
}
}
</style>
(4).隔离开的路由,文件位置:src/router/router.js
import Vue from 'vue';
//配置路由
import VueRouter from 'vue-router';
Vue.use(VueRouter);
//1.创建组件
import Home from '../components/Home.vue';
import News from '../components/News.vue';
import User from '../components/User.vue';
//2.配置路由 注意:名字
const routes = [
{ path: '/home', component: Home },
{ path: '/news', component: News, name: 'news' },
{ path: '/user', component: User },
{ path: '*', redirect: '/home' } /*默认跳转路由*/
]
//3.实例化VueRouter 注意:名字
const router = new VueRouter({
mode: 'history', /*hash模式改为history*/
routes // (缩写)相当于 routes: routes
})
//5 <router-view></router-view> 放在 App.vue
export default router;
(5).main.js文件:
import Vue from 'vue';
import App from './App.vue';
//引入公共的scss 注意:创建项目的时候必须用scss
// import './assets/css/basic.scss';
import router from './router/router.js';
//4、挂载路由
new Vue({
el: '#app',
router,
render: h => h(App)
})
(6).根组件:App.vue
<template>
<div id="app">
<header class="header">
<router-link to="/home">首页</router-link>
<router-link to="/news">新闻</router-link>
</header>
<hr>
<router-view></router-view>
</div>
</template>
<script>
export default {
data () {
return {
msg:'欢迎来到vue,我是根组件'
}
}
}
</script>
<style >
.header{
height:4.4rem;
background:#000;
color:#fff;
line-height:4.4rem;
text-align:center;
a{
color:#fff;
padding:0 2rem
}
}
</style>