请问 router-view 视图渲染出来的组件里面还能将结果渲染到当前这个视图吗?

我用的是 vue 2 版本的,部分关键代码如下:

路由js如下:

export default new VueRouter({
  routes: [
    /*header部分*/
    {
      path: "/set",
      components: { mainBody: setIndex },
      children: [
        {
          path: "myInfo",
          components: {
            mainBody: () => import("@/pages/set/myInfo.vue"), // 渲染到具名视图,文件位置没有写错
          },
        },
      ],
    },
  ],
});

app.vue 代码如下:

<template>
  <div id="app">
    <template v-if="!isEmptyObject($store.state.user)">
      <diaryHeader/>
      <diaryMainBody/>
    </template>
    <template v-else>
      <login v-if="$store.state.curModule === 'login'" @togglePage="togglePage"/>
      <privacy-policy v-if="$store.state.curModule === 'privacyPolicy'"/>
    </template>
  </div>
</template>

diaryHeader.vue代码如下:

<template>
  <div id="header">
    <ul>
      <li><router-link active-class="curModule" to="/set">设置</router-link></li>
    </ul>
  </div>
</template>

diaryMainBody.vue代码如下:

<template>
  <div id="mainBody">
    <router-view name="mainBody"></router-view>
  </div>
</template>

<script>
export default {
  name: 'mainBody',
  props: {
    msg: String
  }
}
</script>

<style scoped>

</style>

setIndex.vue代码如下:

<template>
  <div id="setIndex">
    <ul>
      <li><router-link to="/set/myInfo">我的信息</router-link></li>
    </ul>
    <!--
    我如果把路由改为:{path: 'myInfo', component: myInfo},
    然后再这里添加上:<router-view></router-view>
    是可以显示 myInfo.vue 这个文件的内容的,但是我上面那个id="setIndex"部分又没法删掉
    -->
  </div>
</template>

<script>
export default {
  name: 'setIndex',
  props: {
    msg: String
  }
}
</script>

<style scoped>
#setIndex>ul{}
#setIndex>ul>li{padding:0.5rem 0.5rem;border-bottom:1px solid #ccc;}
</style>

我希望点击“我的信息”也能更新 name=“mainBody”这块的视图,现在的问题是点了没反应,我问文心一言,他说没法这样搞,我问chatgpt,他说可以这样搞,但实际到我这里就不行,想请教下有大佬帮我看看吗?小弟跪谢。

其实我这个效果应该就相当于a链接,点击完后替换当前页面的所有内容,但现在来看貌似router-link只能更新当前页面的局部内容一样。

阅读 713
avatarAI BotBETA

回答

在 Vue Router 中,<router-view> 是用来渲染与当前 URL 匹配到的组件的。在你的配置中,你已经正确地使用了具名视图 mainBody 来渲染不同的组件。问题在于你的路由配置和组件的嵌套关系。

首先,确保你的路由配置是正确的。你已经在 setIndex 组件中定义了子路由 myInfo,并且这个子路由也正确地指定了 mainBody 作为渲染的目标视图。但是,你的 setIndex 组件中并没有 <router-view> 来渲染这些子路由的组件。

要解决这个问题,你需要在 setIndex.vue 中添加一个 <router-view> 来渲染子路由的组件。这样,当你点击“我的信息”链接时,myInfo 组件就会被渲染到 setIndex 组件中的 <router-view> 里,而这个 <router-view> 实际上位于 diaryMainBody.vue<router-view name="mainBody"> 内部。

修改 setIndex.vue 如下:

<template>
  <div id="setIndex">
    <ul>
      <li><router-link to="/set/myInfo">我的信息</router-link></li>
    </ul>
    <router-view></router-view> <!-- 添加这一行来渲染子路由的组件 -->
  </div>
</template>

<script>
export default {
  name: 'setIndex',
  props: {
    msg: String
  }
}
</script>

<style scoped>
#setIndex > ul {}
#setIndex > ul > li { padding: 0.5rem 0.5rem; border-bottom: 1px solid #ccc; }
</style>

现在,当你点击“我的信息”链接时,myInfo 组件应该会被渲染到 diaryMainBody.vue 中的 <router-view name="mainBody"> 指定的位置,因为它实际上是 setIndex 组件中的 <router-view> 的父视图。

确保你的路由配置中的 components 属性使用正确,并且子路由的 path 是相对于父路由的。在你的配置中,你已经正确地做到了这一点。

这样修改后,你的应用应该能够按照预期工作,点击“我的信息”链接会更新 name="mainBody" 的视图内容。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏