【问题标题】:Vue: How to change a value of state and use it in other page and change page structure at starting by it?Vue:如何更改状态值并在其他页面中使用它并在启动时更改页面结构?
【发布时间】:2021-09-29 09:22:45
【问题描述】:

在这个项目中,我们可以通过点击login按钮从login.vue登录,如果成功,我们可以在dashboard.vue看到Lnb.vue

我想如果我这样编码,那么当我在Lnb.vue 中选中login.vue 中的复选框时,pageSso 将是1,那么它将不会只显示“帐户”菜单。 当我在挂载周期使用console.log(pageSso) 时,它显示pageSso0。会有什么问题?

store/store.js

export const state = () => ({
    pageSso: 0,
})
export const getters = {
    pageSso: (state) => state.pageSso,
}

export const mutations = {
    setPageSso(state, data) {
        console.log('mutations setPageSso data', data)
        state.pageSso = data
    }
}

export const actions = {
    setPageSso({
        commit
    }, data) {
        console.log('actions setPageSso data', data)
        commit('setPageSso', data)
    },

}

pages/login.vue

<template>
<input
  class="checkbox_sso"
  type="checkbox"
  v-model="sso"
  true-value="1"
  false-value="0" >SSO checkbox
  <button class="point" @click="submit">login</button>
</template>
<script>
  export default {
    data() {
      return {
        sso: '',
      }
    },
    computed: {},
    methods: {
      submit() {
        this.$store.dispatch('store/setPageSso', this.sso)
        //this.$store.dispatch('store/login', data)
      },
</script>

pages/dashboard.vue

<template>
    <div class="base flex">
        <Lnb />
        <div class="main">
            <Gnb />
            <nuxt-child />
        </div>
    </div>
</template>
<script>
    import Lnb from '@/components/Lnb'
    import Gnb from '@/components/Gnb'
    export default {
        components: {
            Lnb,
            Gnb
        },
        mounted() {},
    }
</script>

组件/Lnb.vue

<template>
  <ul>
    <li :class="{ active: navbarState == 7 ? true : false }">
      <a href="/dashboard/settings">
        <img src="../assets/images/ico_settings.svg" alt="icon" /> Settings
      </a>
    </li>
    <li v-show="pageSso != 1" :class="{ active: navbarState == 8 ? true : false }">
      <a href="/dashboard/user">
        <img src="../assets/images/ico_user.svg" alt="icon" />
        Account
      </a>
    </li>
  </ul>
</template>
<script>
  import {
    mapState
  } from 'vuex'
  export default {
    data() {
      return {}
    },
    computed: {
      ...mapState('store', {
        // navbarState: (state) => state.navbarState,

        pageSso: (state) => state.pageSso,
      }),
    },
    mounted() {
      console.log('pageSso ->', this.pageSso);
    },
    methods: {

    },
  }
</script>

【问题讨论】:

    标签: vue.js nuxt.js


    【解决方案1】:

    您的console.log(pageSso) 记录0,因为 Lnb.vue 的挂载钩子发生了一次,并且在组件插入 DOM 时发生。

    你在dashboard.vue这行无条件地将Lnb插入到DOM中:

    <Lnb />
    

    这大概是它被挂载的钩子被触发的时候。

    您的pageSso 似乎只有在您触发submit() 方法后才会更改,我猜这会在您提交登录表单时发生。

    你的 Lnb.vue 当前总是挂载的。如果您不想在 pageSso 等于 1 之前显示它,请在 dashboard.vue 中添加一个 v-if,如下所示:

    <Lnb v-if="pageSso === 1" />
    

    您目前在dashboard.vue中没有pageSso变量,您必须从商店中获取。

    注意:注意v-showv-if 指令之间的区别:v-show 仅隐藏带有display: none; 的组件,而v-if 实际上从/向其移除或插入组件DOM。使用v-show,即使您看不到该组件,它也会被挂载。使用v-if,每次条件评估为true 时,组件的挂载钩子都会触发。

    【讨论】:

    • 我现在稍微改变了我的问题。我只想将 &lt;li&gt;Account&lt;/li&gt; 更改为 sso(in login.vue) => pageSso(in store.js' and Lnb.vue`) 值。
    • 我认为pageSso 将保存在submit in login.vue 中,我们可以在项目的任何地方使用保存的值。也许这不是真的
    • 是的,store中的pageSso在你定义的时候就定义好了,在整个项目中都可以使用。在您当前的设置中,您将 pageSso 定义为 0 直到被提交方法中调度的操作更改。按照现在的方式,您始终可以看到
    • Account
    • ,直到 pageSso 在商店中更改为 1。我希望你明白你在你的 Lnb.vue/mounted 中的 console.log 只会运行一次,当它运行时,它会为零,因为你当时还没有调用 submit。
  • 如果您想将 pageSso 更改记录到控制台中,您必须将 console.log 移动到您的计算中,或者使用手表。您也可以使用 Vue 开发人员工具栏中的 Vuex 选项卡,而不是登录到控制台。
  • 抱歉,我错过了提交按钮。现在我也将源代码写到了这里,它来自原始源代码,但不起作用。单击按钮时我调用了提交,但它没有改变。无论如何,谢谢你告诉我 Vuex 选项卡的方式,我会尝试使用它
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签