【问题标题】:Handling layouts using nested Vue.js components使用嵌套的 Vue.js 组件处理布局
【发布时间】:2018-05-22 00:10:16
【问题描述】:

过去几个月我们一直在我的公司使用 Vue.js,我们真的很喜欢它!我们使用 Element UI 作为 UI,使用 vue-router 进行路由。根据我们的数据结构,我们将路线嵌套了好几层。它看起来像这样:

App -> 
    Line ->
        Type ->
            Component1
            Component2
            Component3

我们的设计师希望能够在每个页面的基础上控制布局,甚至可以一直控制到 Component* 内部。例如,在Component1 中可能有一个带有侧边栏和页脚的布局,而在Component2 中可能没有侧边栏但页脚会被隐藏。

基于嵌套结构,我们发现这很复杂。它们不是在页面上显示为不同的块,而是相互嵌套。我们可以取消嵌套每个 Vue 路由,但是我们冒着通过许多处于同一级别的页面重复逻辑的风险。

在这样的嵌套结构中处理布局有哪些好方法?

【问题讨论】:

  • 您是否研究过slots 的概念以及它们是否适合您的用例?
  • 就像上面所说的,插槽可能会起作用。或者,您也可以将多个组件传递给您定义的route,以控制哪些组件出现在页面中。

标签: vue.js vuejs2 vue-component vue-router


【解决方案1】:

听起来布局是独立于组件构建指定的,因此您希望使其尽可能正交。

可以在meta 属性中向路由添加其他数据。

const routes = [
  { 
    path: '/', 
    name: 'Home', 
    component: Home,
    meta: { hiddenFeatures: {sidebar: true, footer: false} }
  },
  ...

在 App 组件上,观察路由变化并根据附加配置设置可见性标志。

export default {
  name: 'app',
  data() {
    return {
      ...
      hiddenFeatures: {}
    };
  },
  watch: {
    '$route': function (route) {
      this.hiddenFeatures = route.meta.hiddenFeatures || {}
    }
  },
}

在App模板中,使用条件渲染

<template>
  <div id="app">
    <div class="container-fluid">
      <sidebar v-if="!hiddenFeatures.sidebar"></sidebar>

通过正确的逻辑,您可以避免必须向每条路由添加属性,只是(例如)您想要隐藏的那些。

【讨论】:

  • 为了防止由于数据的hiddenFeatures的初始值不正确而可能出现的问题,而不是hiddenFeatures: {},它必须与hiddenFeatures: this.$route.meta.hiddenFeatures || {}一起初始化。
猜你喜欢
  • 2015-11-22
  • 2018-03-22
  • 1970-01-01
  • 2016-07-21
  • 2022-01-16
  • 2020-07-21
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多