vue.js - vue router tutorial
Vuex getters-properties Fallo al usar vue-router: no pudieron ser reactivos (3)
¿Estás actualizando isLogin cualquier lugar? Está iniciando sesión en un usuario configurando una propiedad no existente en el state llamado userid , y no configurando state.isLogin ningún lado. No sé si la configuración de esa propiedad no declarada funcionará, y también generalmente en Vue, una variable debe declararse desde el principio para que responda. Debería verse así:
const state = {
isLogin: false,
userid:0
}
const mutations = {
login(state, userid){
state.userid = userid;
state.isLogin = true;
}
}
Primero, hay user.js , que es uno de los módulos para store.js
const state = {
isLogin: false
}
const mutations = {
login(state, userid){
state.userid = userid;
}
}
export default {
state,
mutations
}
Usando Vue-router, creé un componente de aplicación e store.js .
Y luego viene el Componente login.vue . Lo siguiente es parte de los códigos:
<script>
export default {
vuex: {
actions: {
login // this action changes the state of
// isLogin by dispatch `login` mutation
}
},
methods: {
btnClick(){
// here calls the login action
}
}
}
</script>
Noté que el método btnClick puede funcionar en este componente. Cambió el store.state.user.isLogin .
Pero aquí hay otro componente a.vue escuchando el estado isLogin :
<template>
...
<a
v-if="isLogin"
v-link="''#''">
...
</a>
...
</template>
<script>
// import something
export default {
vuex: {
getters: {
isLogin: ({ user }) => user.isLogin
}
}
}
</script>
Cuando btnClick alternó en login.vue , isLogin cambió. Pero parece que aunque el getter isLogin en a.vue fue cambiado, el v-if en <a> no pudo ser reactivo, porque el <a> no apareció.
Intenté probar si la store se inyecta a componentes secundarios y el resultado es que ya pasó. Además, he intentado usar computed lugar de getters para escuchar isLogin , y tampoco fue reactiva. cuando se agrega isLogin en watch atributos de watch , no se pudo ver.
Y hay una cosa que estoy bastante seguro: el Vue.use(Vuex) no se pierde.
Me preguntaba si fue el Vue-router el causante del problema.
Y parece que nadie ha hecho preguntas sobre vuex con vue-router ...
Estoy usando vuex con vue-router y vue-resource (si estás autenticando usuarios, supongo que estás haciendo solicitudes HTTP) y funciona muy bien.
Creo que tu problema es tu declaración getter. Los Getters reciben el state dentro del objeto de la store , y en la declaración de su tienda no veo que la opción isLogin sea una propiedad del user . Yo cambiaría tu getter a esto.
vuex: {
getters: {
isLogin: state => state.isLogin
}
}
como dice Jeff, para mi problema, también hago un módulo, así que tenemos que hacerlo así state.user.isLogin