【问题标题】:Layout components (drawer, toolbar, …) not working as component布局组件(抽屉、工具栏……)不能作为组件工作
【发布时间】:2018-07-16 02:56:02
【问题描述】:

我正在使用带有 vue-material 的 vue。

我目前正在布局我的网络应用程序的主要结构,使用md-app 作为md-[app-]drawermd-[app-]toolbarmd-[app-]content 的根。

如果我将这些组件直接放在md-app 标记中,它们就可以工作。这看起来像这样:

<template>
  <div class="md-layout-row">
    <md-app>
      <md-drawer>
        <md-list>
          <md-list-item>
            <md-icon>people</md-icon>
            <span class="md-list-item-text">Foo</span>
          </md-list-item>

          <md-list-item>
            <md-icon>view_list</md-icon>
            <span class="md-list-item-text">Bar</span>
          </md-list-item>
        </md-list>
      </md-drawer>
    </md-app>
  </div>
</template>

但出于设计目的,我尝试将每个内部部分(在本例中为 md-drawer 标签)提取到自己的 vue 组件中。

问题

我现在有我的Drawer 组件,它看起来像这样:

<template>
  <md-drawer>
    <md-list>
      <md-list-item>
        <md-icon>people</md-icon>
        <span class="md-list-item-text">Foo</span>
      </md-list-item>

      <md-list-item>
        <md-icon>view_list</md-icon>
        <span class="md-list-item-text">Bar</span>
      </md-list-item>
    </md-list>
  </md-drawer>
</template>

.. 而我的md-app(在导入 ofc 组件之后)现在看起来像这样:

<template>
  <div class="md-layout-row">
    <md-app>
      <MyDrawer />
    </md-app>
  </div>
</template>

但这根本不会渲染抽屉。为什么是这样? Vue 是否额外包装了可能与 vue-material 的 css 混淆的组件?有没有办法绕过/解决这个问题? .. 还是我只是用错了方法?

添加(编辑 1)

经过一些实验,我发现如果用md-[app-]content 标签包围MyDrawer 标签,它可以工作,但这不会导致我正在寻找的布局。

我猜md-app 正在专门寻找这些组件,并且因为它不知道如何处理MyDrawer 标记它只是忽略它?虽然MyDrawer本质上是md-drawer标签/组件?

添加(编辑 2)

我一直在阅读有关 DOM Template Parsing Caveats 的信息,我认为这应该可行,但我还没有取得任何成功。我刚刚声明了一个&lt;md-drawer is="MyDrawer" /&gt; 标签并从MyDrawer 组件中删除了主要的包装md-drawer 标签

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component vue-material


    【解决方案1】:
    1. 错误使用组件doc

    md-active - 类型 = 布尔值。用于触发抽屉可见性的选项。应该与 .sync 修饰符一起使用。默认 = 假

    Drawer 使用示例:

    <md-drawer :md-active.sync="showNavigation">
      ...
    </md-drawer>
    
    1. md-app 不正确。见Component-Naming-Conventions

    md-app 使用示例:

    <md-app>
      <my-drawer />
    </md-app>
    

    *note 但是在使用之前看下一个答案

    1. 添加(编辑 1) - 不正确。

    作为 md-app 标记的直接子级传递的任何其他标记都将被忽略。该组件将仅查找这三个标签并为它们选择正确的位置。 Documentation

    md-app 使用示例:

    <md-app md-waterfall md-mode="fixed-last">
      <md-app-toolbar class="md-large md-dense md-primary">
        <div class="md-toolbar-row">
          <div class="md-toolbar-section-start">
            <md-button class="md-icon-button" @click="menuVisible = !menuVisible">
              <md-icon>menu</md-icon>
            </md-button>
            <span class="md-title">My Title</span>
          </div>
    
          <div class="md-toolbar-section-end">
            <md-button class="md-icon-button">
              <md-icon>more_vert</md-icon>
            </md-button>
          </div>
        </div>
    
        <div class="md-toolbar-row">
          <md-tabs class="md-primary">
            <md-tab id="tab-home" md-label="Home"></md-tab>
            <md-tab id="tab-pages" md-label="Pages"></md-tab>
          </md-tabs>
        </div>
      </md-app-toolbar>
    
      <md-app-drawer :md-active.sync="menuVisible">
        <md-toolbar class="md-transparent" md-elevation="0">Navigation</md-toolbar>
        <md-list>
          <md-list-item>
            <md-icon>move_to_inbox</md-icon>
            <span class="md-list-item-text">Inbox</span>
          </md-list-item>
        </md-list>
      </md-app-drawer>
    
      <md-app-content>
        <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Error quibusdam, non molestias et! Earum magnam, similique, quo recusandae placeat dicta asperiores modi sint ea repudiandae maxime? Quae non explicabo, neque.</p>
      </md-app-content>
    </md-app>
    
    1. 添加(编辑 2) - 不正确。 is 在您的情况下无关紧要。 see using APIComponent-Naming-Conventions

    只需使用标签:&lt;md-drawer/&gt;

    更新

    如何在md-app 中使用自定义Drawer

    drawer必须包裹在md-app-drawer

    例子

    代码:

    <md-app-drawer :md-active.sync="menuVisible">
      <custom-drawer/>
    </md-app-drawer>
    

    App

    Component

    【讨论】:

    • 感谢您的回复!我会尽快处理并回复您的回复。关于你的N°2; MyDrawer 不是有效的 PascalCased 组件名称吗?关于你的 N°3;所以我需要直接使用这三个组件之一?我不能将它包装在自定义单文件组件中吗?我这边的Addtion #2正在发挥作用;如果它只接受这三个中的一个,我想我可能会说它is 在这种情况下确实是一个抽屉
    • 关于你的最后一句话just use tag xyz .. 这正是我试图通过将其分成组件来避免的。如果我将所有内容都放在一个文件中,这并不是说它不起作用..我无法将这些标签分成单个文件组件
    • 好吧,我测试了你的例子。它像预期的那样工作,因为您声明了所有内容。如果我将您的md-app-toolbar 部分放入单个文件组件模板中,将该组件包含在&lt;my-toolbar /&gt; 中并启动应用程序,那么它不会呈现任何内容。我不确定我的问题是否清楚,但这就是问题的全部。
    • 很多词...例如,特别适合您:appcomponent
    • 啊……现在我们说同一种语言^^。谢谢你。更新您的答案以匹配结论,我会接受它作为答案。结论是你必须保留一个额外的包装标签
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多