【问题标题】:Reactivity issue in vue componentVue组件中的反应性问题
【发布时间】:2023-04-10 16:51:01
【问题描述】:

感谢阅读,我对这种反应性行为感到很困惑。我在导航栏上有按钮,根据应用组件(App.vue)中的条件显示:

<button
 type="button"
 v-if="loggedIn()"
 @click="logout"
 class="btn btn-outline-light"
>

与相关的脚本:

methods: {
   loggedIn() {
     return !(auth.getUser() == null);
   },

这里一切正常,登录后会出现注销按钮。现在我被指示将设计更改为侧边栏,并使用完全相同的 html 和脚本创建侧边栏组件 (SideBar.vue)。唯一的问题是,按钮对更改没有反应。唯一的区别是导航栏在 App.vue 中,而 SideBar 是 App 的一个组件,如下所示:

<template>
  <div id="app">
    <div id="nav">
      <nav class="navbar navbar-expand-lg navbar-light ">
        // navbar elements with reactive buttons
      </nav>
      <side-bar />
    </div>
    <main>
     <router-view />
    </main>
  </div>
</template>

编辑: 我试图在组件中使用计算属性但没有成功。 我找到了一种通过将属性从应用程序传递到侧边栏组件来使其工作的方法,但我不喜欢它,因为我可能稍后必须进行扩展。有任何想法吗?提前致谢。

【问题讨论】:

  • 你应该使用计算属性而不是方法,这不是反应性错误
  • 我也试过computed,还是不行。
  • 如果您使用计算,那么您应该在模板中省略(),即v-if="loggedIn"。还有auth.getUser() 是做什么的?我希望它不是异步方法或返回承诺的东西。
  • 谢谢特里,如果你把括号放在你身上,无论如何, auth.getUser() 不是异步的,它只是从本地存储中获取令牌(jwt)并解析它。
  • 我能说的唯一区别是,当我登录时,在 app.vue 中调用了 loggedIn(),但在 SideBar.vue 中则没有

标签: javascript vue.js


【解决方案1】:

我认为这里的结构总体上是行不通的。就像其他人说的那样,最好使用计算属性,但这不是问题所在。

基本上,一旦应用加载,您应该调用auth.getUser(),例如在您的mounted() 或created() 处理程序中;

// Sidebar.vue or your Root new Vue()
{
    data() {
        return {
            user: null,
        };
    },
    created() {
        this.user = auth.getUser();
    },
}
<button
 type="button"
 v-if="user"
 @click="logout"
 class="btn btn-outline-light">

您可以将其添加到侧边栏组件中,但通常最好在应用程序根组件上处理身份验证或使用 Vuex,因为您经常需要知道您是否在应用程序的多个部分登录。

如果您想将 created() 处理程序和用户变量添加到您的根组件,您可以像这样访问它;

<button
 type="button"
 v-if="$root.user"
 @click="logout"
 class="btn btn-outline-light">

【讨论】:

  • 感谢您指出设计缺陷。我一定会朝那个方向走。
【解决方案2】:

使用计算属性绑定 v-if,如下所示:

computed: {
  loggedIn () {
    return !(auth.getUser() === null)
  }
}

更多:https://vuejs.org/v2/guide/computed.html

【讨论】:

    【解决方案3】:

    此处不能使用计算属性,计算属性永远不会更新,因为 return !(auth.getUser() === null) 不是反应性依赖项。

    相比之下,只要发生重新渲染,方法调用将始终运行该函数。那么解决方案是按照Michael Thiessen 的记录重新渲染侧栏:

    <side-bar :key="loggedIn()"/>
    

    【讨论】:

    • 如果在应用程序的更多组件中都需要了解登录状态,则可能值得设置一个标志或一些反应性数据,以便您可以通过更常规的方式触发更新方式
    • 非常正确,我会这样做,但我只是很沮丧不理解这种行为
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2021-07-08
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2020-03-29
    相关资源
    最近更新 更多