当前位置: 首页 > 知识库问答 >
问题:

从组件调用Vuex映射状态时未定义

景凌
2023-03-14

所以,每次vuex中的状态不为null时,我都试图更新组件中的一些数据。我用laravel设置了一个API路由,在用户登录后返回用户信息。

API路线:

Route::group(['middleware' => ['auth:api']], function () {
    Route::get('profil', 'Api\UserController@profil')->name('profile'); // will returning user info
}

Vuex:

export default new Vuex.Store({
    state: {
        token: localStorage.getItem('token') || "",
        user: {}
    },
    getters: {
        isAuth: state => {
            return state.token != "" && state.token != null
        }
    },
    mutations: {
        SET_TOKEN(state, payload) {
            state.token = payload
        },
        SET_AUTH_USER(state, payload) {
            state.user = payload
        }
    }
})

所以在我的应用程序中。vue,在created方法中,如果令牌存在,我将使用http响应作为有效负载提交SET_AUTH_USER。

应用程序。vue:

<template>
  <div id="app-layout">
    <section-advices></section-advices>
</template>

<script>
    import SectionAdvices from "./SectionAdvices"


    export default {
        name: "app-layout",
        components: {
            SectionAdvices
        },
        created() {
            if (this.$store.state.token !== (null || "")) { //check token in vuex state
                this.$http
                    .get("/profil")
                    .then(res => {
                        if (res.status === 200) {
                            this.$store.commit("SET_AUTH_USER", res.data.data); //set $store.state.user with response
                        } else {
                            this.$store.commit("SET_AUTH_USER", null); // set with null
                        }
                     })
                     .catch(err => {
                         console.log(err);
                     });
            }
        }
    }
</script>

到目前为止,一切正常。每次我刷新页面,只要我的本地存储中有一个令牌,用户对象将永远拥有用户信息。

部分建议。vue:

<template>
    <section class="advices">
        <input type="text" v-model="name">
        <input type="text" v-model="email">
    </section>
</template>

<script>
    import { mapState, mapGetters, mapActions, mapMutations } from "vuex";
        export default {
            name: "section-advices",
            data(){
                return{
                    name: null,
                    email: null
                }
            },
            computed:{
                ...mapState(["user"]),
                ...mapGetters(["isAuth"]),
            },
            created() {
                if(this.isAuth) { //its returning true. the codes below was executed
                    this.name = this.user.name // gives name data with "undefined"
                    this.form.email = this.user.email // it's "undefined" too
                 }
             }
        }
</script>

SectionAdvisions组件中的名称和电子邮件都设置为“未定义”,尽管在Vue开发工具中,用户对象确实具有这些值。我是否在应用程序中调用了api。vue在错误的生命周期内?

共有2个答案

唐元凯
2023-03-14

我找到了解决方案,那就是:

正如@dreijntjens所建议的,我在我的“部分dvices.vue”中添加了观察者

...
watch: {
    // watching for store.state.user changes
    user: {
        handler: "fillForm", // call the method
        immediate: true // this watcher will exec immediately after the comp. created
    }
 },
 methods: {
    fillForm() {
        if(this.isAuth) { // this is not necessary, just want to make sure. Once isAuth === true, codes below will be executed
            this.form.name = this.user.name
            this.form.email = this.user.email
        }
    }
 }

所以,真正的问题是,什么时候。vue创建并获取数据,存储。状态用户仍然是一个空对象。我的API调用在此步骤之后运行,这是毫无意义的。所以,我确实需要watcher来查看用户状态中的任何更改,并在此之后更新其组件中的本地数据。

淳于凯
2023-03-14

可以尝试使用getter获取状态数据吗?因为生命周期。组件页面呈现时,首先设置getter

 类似资料:
  • 我试图在用户轻击或长按时在映射中的某个地方放一个标记,我在方法中放一个toast并登录以了解发生了什么,我注意到这些方法从未被调用,我做错了什么?我正在使用最新的osmdroid和osmbonuspack版本,并且运行良好,下面是我的代码:

  • 本文向大家介绍Vuex 在Vue 组件中获得Vuex 状态state的方法,包括了Vuex 在Vue 组件中获得Vuex 状态state的方法的使用技巧和注意事项,需要的朋友参考一下 Vuex使用单一状态树(一个对象就包含了全部的应用层级状态),它作为唯一数据源存在,每个应用仅仅有一个store实例。 单一状态树使得我们能够直接定位任一特定的状态片段,在调试过程中也能轻易地取得整个当前应用状态的快

  • 参考 Nuxt Vuex store 的实现,Lavas 支持以模块方式组织 Vuex 的状态树。 对于开发者来说,只需要在项目根目录下 /store 文件夹中创建单独的模块文件,Lavas 会将这些单独的模块组合起来,生成最终的 Vuex.Store 实例。 下面我们以模板项目中已有的负责页面切换的 pageTransition 模块为例,介绍具体使用方法。如果您对 Vuex 尤其是模块特性还不

  • 对于每个大项目来说,使用状态树 (store) 管理状态 (state) 十分有必要。这就是为什么 Nuxt.js 内核实现了 Vuex。 在Vue School 上观看关于Nuxt.js 和 Vuex 的免费课程 使用状态树 Nuxt.js 会尝试找到应用根目录下的 store 目录,如果该目录存在,它将做以下的事情: 引用 vuex 模块 将 vuex 模块 加到 vendors 构建配置中去

  • java.io.ioException:映射项中的类型不匹配:应为org.apache.hadoop.io.text,已收到org.apache.hadoop.mapred.maptask$MapOutputBuffer.Collect(Maptask.java:870)在org.apache.hadoop.mapred.maptask$NewOutputCollector.Write(Mapta

  • 编辑:这是在添加到购物车按钮onclick事件时执行的函数: addToCart action creator如下所示: