v-如果对导航栏没有反应
v-if not reactive for navigation bar
我有一个具有此模板的导航栏:
<nav v-bind:class="active" v-on:click>
<v-btn v-on:click.prevent="signOut()" v-if="isLoggedIn">Sign Out</v-btn>
<router-link v-on:click.native="makeActive('home')" to="/home" v-if="isLoggedIn" class="home">Home</router-link>
<router-link v-on:click.native="makeActive('sign_up')" to="/sign_up" v-if="isLoggedIn" class="sign_up">Sign Up</router-link>
</nav>
如您所见,我使用了 v-if
指令。它正在检查登录状态。
isLoggedIn
data () {
return {
active: 'home',
isLoggedIn: this.$store.getters.isLoggedIn
}
}
所以,我正在从 vuex 商店读取数据以获得该值。但是当商店的状态发生变化时,我的导航栏不会被动更新,而是我必须刷新页面才能使元素出现或消失。
VUEX 商店
const state = {
isLoggedIn: !!localStorage.getItem("token")
};
const getters = {
isLoggedIn: state => {
return state.isLoggedIn;
}
}
const mutations = {
[LOGIN] (state) {
state.pending = true;
},
[LOGIN_SUCCESS] (state, response) {
localStorage.setItem("token", response.data.jwt)
},
[LOGOUT](state) {
localStorage.removeItem("token")
state.isLoggedIn = false
}
};
为什么这个方法没有使导航栏响应式更新
正如 Micael 在上面的评论中所建议的那样,要使 Vuex 状态 属性 表现出反应性,您需要将其设置为计算 属性。请检查 Vuex 文档 here,其中有正确的解释。
回到你的例子,isLoggedIn
应该是:
computed: {
isLoggedIn() {
return this.$store.getters.isLoggedIn
}
}
我有一个具有此模板的导航栏:
<nav v-bind:class="active" v-on:click>
<v-btn v-on:click.prevent="signOut()" v-if="isLoggedIn">Sign Out</v-btn>
<router-link v-on:click.native="makeActive('home')" to="/home" v-if="isLoggedIn" class="home">Home</router-link>
<router-link v-on:click.native="makeActive('sign_up')" to="/sign_up" v-if="isLoggedIn" class="sign_up">Sign Up</router-link>
</nav>
如您所见,我使用了 v-if
指令。它正在检查登录状态。
isLoggedIn
data () {
return {
active: 'home',
isLoggedIn: this.$store.getters.isLoggedIn
}
}
所以,我正在从 vuex 商店读取数据以获得该值。但是当商店的状态发生变化时,我的导航栏不会被动更新,而是我必须刷新页面才能使元素出现或消失。
VUEX 商店
const state = {
isLoggedIn: !!localStorage.getItem("token")
};
const getters = {
isLoggedIn: state => {
return state.isLoggedIn;
}
}
const mutations = {
[LOGIN] (state) {
state.pending = true;
},
[LOGIN_SUCCESS] (state, response) {
localStorage.setItem("token", response.data.jwt)
},
[LOGOUT](state) {
localStorage.removeItem("token")
state.isLoggedIn = false
}
};
为什么这个方法没有使导航栏响应式更新
正如 Micael 在上面的评论中所建议的那样,要使 Vuex 状态 属性 表现出反应性,您需要将其设置为计算 属性。请检查 Vuex 文档 here,其中有正确的解释。
回到你的例子,isLoggedIn
应该是:
computed: {
isLoggedIn() {
return this.$store.getters.isLoggedIn
}
}