【问题标题】:vuejs conditional wrappervuejs 条件包装器
【发布时间】:2020-01-16 01:46:00
【问题描述】:

在我的 nativescript-vue 应用程序中,我有一个名为 profileForm 的 singleFile 组件。我想以两种方式使用该组件,如果用户已登录,我希望将该组件作为我的布局组件的插槽来编辑配置文件。否则我要的是作为注册表单。

我不想创建额外的组件来处理这个问题。 所以在一种情况下,我想将我的组件包装在一个标签中,以便我可以使用 Vue.$navigateTo 导航到它,在另一种情况下,我想将它包装在一个组件中。但是组件本身有一个标签,所以在这种情况下我不再想要了。

在 django 模板中,我会这样做:

<template>
  <Page v-if="is_signup" actionBarHidden="true">
  <AppLayout v-else title="Profile">
  ...
  </AppLayout v-else>
  </Page v-if="is_signup">
</template>

当然,这在 vuejs 中是行不通的。有没有办法在 vuejs 中实现这一点?

我可以创建一个新组件并像这样包装它:

<template>
  <Page v-if="is_signup" actionBarHidden="true">
    <ProfileForm/>
  </Page>
  <AppLayout v-else title="Profile">
    <ProfileForm/>
  </AppLayout>
</template>

但我宁愿不为此任务创建新组件。

我希望得到这样的东西:

<template>
  <template :is="is_signup?'Page':'AppLayout'" :v-bind="is_signup?{actionBarHidden:true}:{title:'Profile'}">
    ...
  </template>
</template>

nativescript-vue 有这样的语法吗?

【问题讨论】:

  • 使用 vue 的工作方式。您不能将 applayout 嵌套在条件页面中......您的第二段代码是布局以这种方式工作的唯一方式。由于页面失败 v-if 渲染器永远不会进入块:这将包括应用程序。
  • 在您编辑之后,我记得在某处看到了这个:is 绑定。我认为这里已经讨论过了......在文档nativescript.org/blog/… 的任何地方都没有提到它
  • 我的方法是使用一个布尔变量,比如isLogin 并根据路由判断为真或假。
  • @VaritJPatel 我不太明白你在说什么。
  • 也许您可以提供您认为错误所在的代码sn-p?您想要做的事情在 vue 中是可能的,并且在很多资源中都有描述 - 我无法说出您的问题到底是什么可以进一步帮助您

标签: vue.js nativescript-vue


【解决方案1】:

这可以通过使用通用的component 元素来解决:

<template>
    <component :is="is_signup ? 'Page' : 'AppLayout'" actionBarHidden="true">
    ...
   </component>
</template>

https://vuejs.org/v2/guide/components.html#Dynamic-Components
请注意,传递未在组件中声明的 prop(例如,actionBarHidden 被传递给不使用它的 AppLayout)没有任何效果,并且是完全安全的。

这是一个老问题,但我发现自己处于同样的情况,所以我回来添加这个答案。编辑:@MarcRo 已经提供了相同的答案,有点隐藏在上面的评论中。

【讨论】:

  • 我也是这样做的,有助于避免大量代码重复。什么也很酷,你也可以使用普通的 html 标签,所以你可以使用 'div' als fallback
【解决方案2】:

一种方法:

如果您只有两个不同但预定义的选项,我会使用 v-if / v-else 逻辑。只是更语义化。

<template>
  <Page
    v-if="is_signup"
    :actionBarHidden="true"
  >
    <Label :text="'hello'" />
  </Page>
  <Label
    v-else
    :text="'hello'"
  />
</template>

<script>
import Label from '../components/Label.vue';
import Page from '../components/Page.vue';

export default {
  components: {
    Page,
    Label,
  },

  data() {
    return {
      is_signup: false, // you will have to find a way to set is_signup correctly
    };
  },
}
</script>

还有其他几种方法可以达到相同的效果;但是,在不了解更多要求的情况下,我只会让您选择第一个选项 :)

【讨论】:

  • 对于我在评论中缺乏解释感到抱歉。正如您在我的问题中看到的那样,我知道这个解决方案,但是,我实际上没有标签标签,我可以制作一个新组件但我不想,换句话说我不想将文本&lt;Label :text="'hello'" /&gt; 写入两次。
  • @yukashimahuksay 正如所写,这只是您描述的问题的最简单的解决方案。如果您向我们提出更具体的要求,我们可以进一步帮助您。您还可以使用 功能将组件嵌套到其他组件中。这也适用于动态组件,例如&lt;component :is="dynamicComponent"&gt;&lt;Label /&gt;&lt;/component&gt;;那么您可以将动态组件设置为 &lt;Page&gt;&lt;span&gt;
  • 问题是我猜到了我的问题的解决方案并且我的猜测是正确的:))所以事实上我已经在我的问题本身中包含了我的问题的答案:))我不知道是什么现在做。我认为这是一个有用的问题,所以我不想删除它,也许我应该编辑它并将解决方案发布为答案。
  • 另一件事是,在考虑了我认为的解决方案之后,是否也可以有 或什么都没有而不是 ?所以我在 cmets 中问过你。
  • 你不能在 Vue 中完全删除一个组件而不删除它的子/嵌套组件。
猜你喜欢
  • 2020-10-29
  • 2017-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
相关资源
最近更新 更多