【问题标题】:vue-router replace parent view with subRoutevue-router 用 subRoute 替换父视图
【发布时间】:2017-01-20 04:52:38
【问题描述】:

我正在使用 vue-router 并且有关于 subRoutes 的问题。我想设置我的路线,所以主要路线是列表,子路线是诸如编辑/添加/等之类的东西。

我希望子路由组件替换父路由的<router-view>。我理解文档的方式和我测试的内容,看起来我应该在父组件模板中定义另一个 <router-view> 以供子路由呈现,但用户列表将保持可见。

示例路线:

'/users': {
    name: 'user-list',
    component(resolve) {
        require(['./components/users.vue'], resolve)
    },
    subRoutes: {
        '/add': {
            name: 'add-user',
            component(resolve) {
                require(['./components/users_add.vue'], resolve)
            }
        }
    }
}

主路由器视图:

<!-- main router view -->
<div id="app">
    <router-view></router-view>
</div>

用户列表:

<template>
    <a v-link="{ name: 'add-user' }">Add</a>
    <ul>
        <li>{{ name }}</li>
    </ul>
</template>

添加用户:

<template>
    <div>
        <a v-link="{ name: 'user-list' }">back</a>
        <input type="text" v-model="name">
    </div>
</template>

当我点击“添加”时,我想填写添加用户模板。这可能吗?

另外,我可以在 user-list 和 add-user 组件之间建立父子关系吗?我希望能够将道具(用户列表)传递给添加组件并将事件分派回用户列表。

谢谢!

【问题讨论】:

  • 当您转到/user 时,用户列表将呈现在您的主视图中。当你去/user/add 时会自动呈现在同一个&lt;router-view&gt; 中。这是默认行为。是的,您可以使用道具等进行亲子交流。
  • 这似乎不是我的默认行为。当我定义 subRoutes 并导航到它们时,根路由保持活动状态。当我将 subRoutes 定义为根级路由时,它可以工作:/
  • 这不是很有帮助。我向前和向后阅读文档。在 nested 一章中,它声明“渲染的组件也可以包含它自己的嵌套&lt;router-view&gt;”,但here 最后一个示例使用/c 作为&lt;router-view&gt; 的容器。这也是我看到的行为。

标签: javascript vue.js vue-router


【解决方案1】:

听起来那些编辑/添加路由不应该是子路由,就这么简单。

仅仅因为路径看起来像是嵌套并不意味着您必须实际嵌套它们。

'/users': {
    name: 'user-list',
    component(resolve) {
      require(['./components/users.vue'], resolve)
    }
},
'users/add': {
    name: 'add-user',
    component(resolve) {
      require(['./components/users_add.vue'], resolve)
    }
}

【讨论】:

  • 这就是我首先做的。问题是没有建立父子关系,因此您无法通过道具或事件在它们之间传递数据。
  • 如果你可以用它的子路由替换父路由,也没有办法用道具传递数据。您应该考虑建立一个集中式商店。
  • 这可能是真的。我确实考虑过添加一个集中式存储,但这更像是一种传统的“管理面板”类型的网络应用程序,我真的没有在整个应用程序中列出这些列表,只是从列表到添加/编辑视图并返回。我在上面发布的解决方案对此非常有效。感谢您的想法。
【解决方案2】:

所以我玩了很多次,终于弄清楚了如何实现这一点。诀窍是让列表也成为一个子路由,并让根级路由只为所有子组件提供一个&lt;router-view&gt; 容器来渲染。然后,将“列表加载”内容移动到父组件,并将列表作为道具传递给列表组件。然后,您可以通过事件告诉父级重新加载列表。

现在就是这样,它就像一个魅力。唯一的缺点是我有另一个我并不真正需要的组件。有时间我会跟进一个例子。

编辑

根据要求添加了一个示例。请注意:此代码来自 2016 - 它可能不适用于当前的 Vue 版本。他们更改了事件系统,因此父/子通信的工作方式不同。现在认为双向沟通是不好的做法(至少我在这里这样做的方式)。此外,这些天我会以不同的方式解决这个问题,并在商店中为每条路线提供自己的模块。

也就是说,这是我在 2016 年添加的示例: 让我们继续使用用户示例 - 我们有一个页面,您可以使用该页面列出/添加/编辑用户。

这是路由定义:

'/users': {
    name: 'users',
    component(resolve) {
        // this is what I meant with "root-level" route, it acts as a parent to the sub routes
        require(['./pages/users.vue'], resolve)
    },
    subRoutes: {
        '/': {
            name: 'user-list',
            component(resolve) {
                require(['./pages/users/list.vue'], resolve)
            }
        },
        '/add': {
            name: 'user-add',
            component(resolve) {
                require(['./pages/users/add.vue'], resolve)
            }
        },
        // etc.
    }
},

users.vue

<template>
  <div>
    <router-view :users="users"></router-view>
  </div>
</template>


<script>
/**
 * This component acts as a parent and sort of state-storage for
 * all user child components. It's the route that's loaded at /users.
 * the list component is the actual component that is shown though, but since
 * that's a sibling of the other child components, we need this.
 */
export default {
  events: {
    /**
    * Update users when child says so
    */
    updateUsers() {
      this.loadUsers();
    }
  },

  data() {
    return {
      users: []
    }
  },

  route: {
    data() {
      // load users from server
      if (!this.users.length) {
        this.loadUsers();
      }
    }
  },

  methods: {
    loadUsers() {
      // load the users from an API or something
      this.users = response.data;
    },
  }
}
</script>

./pages/users/list.vue

<template>
  <ul>
    <li v-for="user in users" :key="user.id">
      {{ user.name }}
    </li>
  </ul>
</template>

<script>
export default {
  props: ['users'],
  // the rest of the component
}
</script>

【讨论】:

  • 那些“包装”组件在这些场景中很常见。在 React 社区中,它们被称为“智能”组件(了解外部数据并对其进行操作),它们为其他组件提供数据。现在可能看起来很乏味,但它很有用。
  • @Christof 你能分享一些代码来解释你的答案吗?谢谢!
  • @PavelKovalev 添加了示例。另请阅读免责声明 :)
猜你喜欢
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多