1.动态导航栏:借助 vuex 实现侧栏顶栏的级联效果和刷新不复原
需要 vuex 结合本地存储保存五种东西:(登录之后获取用户信息、用户权限、用户功能列表栏等内容!并进行存储)
- 整个父子选择列表(最外层为顶栏,其余均为侧边栏) 基本结构: 其中 url 是选择项对应的路由路径,必须要有的 包括 iconUrl 也是通过一定的构造方法构造出图标 这些动态的内容都需要在数据库中进行存储!
- 当前顶栏的选择项 id 对应的侧边栏列表(首次登录之后默认为第一个顶栏的第一个侧栏)(初始化的时候,或者每次在点击顶栏选择项的时候进行变化)
- 当前选择的侧栏选择项 id(用于刷新之后保持原来的项位置不变!)(首次登录之后默认为第一个顶栏的第一个侧栏的最小子项的 id)(初始化的时候,或者每次在点击顶栏选择项或者侧栏选择项的时候进行变化)
- 当前选择的侧栏选择项 url(用于指定/main 链接时应当跳转到的路径,或者路由被拦截之后跳转到的地方,很重要的!,因为不可能在/main 这个路径,肯定是它的子路径)(首次登录之后默认为第一个顶栏的第一个侧栏的最小子项的 url)(初始化的时候,或者每次在点击顶栏选择项或者侧栏选择项的时候进行变化)
2.vuex 实现本地存储
Vuex-persistedstate 这个插件的原理结合了存储方式,只是统一配置后就不需要手动写存储方法了
使用方法:
安装:
bash
npm install vuex-persistedstate --save
在 store 下的 index.js 中引入配置:
js
import { createStore } from "vuex";
import createPersistedState from "vuex-persistedstate";
export default createStore({
state: {},
mutations: {},
actions: {},
modules: {},
plugins: [createPersistedState()],
});
这样是默认存储到 localStorage,如果想要存储到 sessionStorage,或者想要存储指定的 state:
js
import { createStore } from "vuex";
import createPersistedState from "vuex-persistedstate";
export default createStore({
state: {},
mutations: {},
actions: {},
modules: {},
plugins: [
// 把vuex的数据存储到sessionStorage
createPersistedState({
storage: window.sessionStorage,
reducer(val) {
return {
// 只存储state中的userData
userData: val.userData,
};
},
}),
],
});
本地存储与 vuex 的使用策略:
1.如果数据需要实时更新,就存储到 vuex 2.如果数据只需要持久化保存,不需要更新,就存储到本地 3.如果数据既需要实时更新也需要持久化保存,那么就使用插件实现 vuex 的持久化
3.大坑:vue 的 data 里面不能使用 this.data 中的数据
例如:
vue
<template>
<div>PrototypeManagement</div>
<div>{{ value2 }}</div>
</template>
<script>
export default {
data() {
return {
value1: "你好",
value2: this.value1 + 100, //大错特错
};
},
};
</script>
不能直接使用 data 中的数据并在 data 里面初始化(并且这样使用了报错还不会给提示,很恶心),如果想要通过 data 中的数据构造 data 可以使用计算属性,或者在 mounted 中进行构造初始化!
注意:除此之外,本地存储获取的数据,通过方法的返回值获取的数据,都可以在 data 里面直接初始化,没必要在 mounted 中进行!
4.vuex 实现动态更新:使用 computed
pageA:
触发 mutation:
js
_this.$store.commit("detail/setPlayUrl", data.data.data); //存vuex
pageB:
展示数据:
vue
<template>
<div class="bottom">
{{ a }}
<audio v-bind:src="getPlayUrl" controls="controls">
Your browser does not support the audio element.
</audio>
</div>
</template>
<script>
export default {
name: "index",
data() {
return {
// url:this.$store.state.detail.playUrl, //如果这样写的话会更新不了
a: "1", //这个在本组件里面的数据就可以更新 这个a 在created生命周期后三秒改变值就可以更新视图
};
},
computed: {
//这里需要把store 动态的数据放到computed里面才会同步更新 视图
getPlayUrl() {
return this.$store.state.detail.playUrl;
},
},
created() {
// console.log('url',this.url);
let _this = this;
setTimeout(function () {
_this.a = 10;
}, 3000);
},
};
</script>
<style scoped>
.bottom{
position: absolute;
bottom: 0;
left: 0;
width: 100%;
}
</style>
结论:
1.本组件内 data 的数据和 prop 传递过来的数据直接能同步双向绑定和更新视图
2.vuex 中 store 的数据需要放到 computed 里面实时计算才能同步更新视图