【问题标题】:Disable a component in a specific case in Vue.js在 Vue.js 的特定情况下禁用组件
【发布时间】:2018-07-18 10:04:39
【问题描述】:

我在寻找方法,但在任何地方都找不到我的问题的答案。

让我解释一下,我有一个页面,我在其中加载了我创建的“日期选择器”组件。我将在路由器视图中加载的大多数组件中都需要它。我的问题是,如果可能,我会在路由器视图中加载特定组件时禁用它。

<main>
  <date-picker></date-picker>
  <router-view></router-view>
</main> 

除了将我的“日期选择器”组件嵌套在他们使用的组件中之外,还有其他解决方案吗?如果有帮助,我会使用 Vuex。

提前致谢。

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-router vuex


    【解决方案1】:

    一种方法是在要显示日期选择器的路线上设置元字段requiresDatePicker: true

    const router = new VueRouter({
      routes: [
        {
          path: "/foo",
          component: Foo,
          meta: { requiresDatePicker: true }
        },
        {
          path: "/bar",
          component: Bar,
          meta: { requiresDatePicker: false }
        }
      ]
    });
    

    然后使用route 对象上的meta 属性来检查特定路由是否必须呈现日期选择器

    <main>
      <date-picker v-if="$route.meta.requiresDatePicker"></date-picker>
      <router-view></router-view>
    </main> 
    

    感谢 @Konrad K 在 cmets 中提及

    【讨论】:

    • 很好地使用了路由的元对象。然而,它可以在不涉及 Vuex 的情况下更轻松地完成。将v-if="$route.meta.requiresDatePicker" 放入date-picker 节点会更高效、更省力地完成相同的工作。
    【解决方案2】:

    在您的 vuex 中,添加一个新状态。比方说,showDatePicker:

    {
        state: {
            showDatePicker: false
        },
        mutation: {
            showDatePicker(state, show) {
                state.showDatePicker = show;
            }
        }
    }
    

    然后在你的组件中,添加一个计算属性来引用状态:

    import { mapState } from 'vuex'
    ...
    computed: {
        ...mapState(['showDatePicker'])
    }
    

    然后在日期选择器组件上添加一个条件:

     <date-picker v-if="showDatePicker"></date-picker>
    

    然后在每个页面组件上的 mounted 回调中,您可以根据是否要显示日期选择器来切换值:

    mounted() {
    
        //show
        this.$store.commit('showDatePicker', true);
    
        //hide
        this.$store.commit('showDatePicker', false);
    
    }
    

    【讨论】:

      【解决方案3】:

      最简单的方法是使用 window.location.href 并在那里检查您的路线。然后在你的组件上添加一个 v-if。像这样的:

      <main>
        <date-picker v-if = "enableDatePicker"></date-picker>
        <router-view></router-view>
      </main>
      
      <script>
      export default {
          computed: {
              enableDatePicker: {
                    return (window.location.href === myroute)
               }
          }
      }
      </script>
      

      【讨论】:

      • 只使用return (window.location.href === myroute) 肯定会更干净吗?它已经解析为 boolean,不需要单独返回
      • 回答太快了:)
      • 这仅对单个案例有用。如果只检查一个组件,如果您还扩展它以处理多个组件,它并不能真正让您灵活地随时随地切换日期选择器。
      • 我同意,但问题是在加载特定组件时切换它。不是多个组件。如果你想要,那么确实有更好的解决方案。
      • 感谢您的回答,但它似乎不起作用。我收到此错误:“未定义属性或方法“窗口”...”
      猜你喜欢
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2017-09-10
      相关资源
      最近更新 更多