vue3(三)

发布时间 2024-01-05 00:29:35作者: 惊朝

1、父子路由在页面局部跳转的应用
假设有一页面NewsView.vue,里面的内容要如何实现如下图所示的布局,如何实现点击页面左半部分文字,而只有页面右半部分的内容发生变化呢?

不难想到,导航栏的内容是挂载到App.vue文件上的。稍加思索的是,要利用RouterView技术,将页面右(Detail.vue文件)挂载到页面左(NewsView.vue文件)上面,Detail.vue要获取到NewsView.vue的内容(参数)。具体代码实现如下,请耐心看完:

//  路由配置文件
import { createRouter, createWebHistory} from 'vue-router';
import HomeView from '../views/HomeView.vue';
import AboutView from '../views/AboutView.vue';
import NewsView from '../views/NewsView.vue';
import Detail from '../views/Detail.vue';

const router = createRouter({
    history: createWebHistory(),    //  路由器的工作模式
    routes: [   //  路由规则
        {
            path: '/home',
            name: 'home',
            component: HomeView,
        },
        {
            path: '/about',
            name: 'about',
            component: AboutView
        },
        {
            path: '/news',
            name: 'news',
            component: NewsView,
            children: [
                {
                    path: 'detail',
                    name: 'detail',
                    component: Detail,
                },
            ]
        }
    ]
})
export default router
//  文件App.vue
<template>
  <div class="navigate">
    <RouterLink class="rlink" to="/home">点击此处回主页</RouterLink>
    <RouterLink class="rlink" to="/about">点击此处显示关于</RouterLink>
    <RouterLink class="rlink" to="/news">点击此处显新闻</RouterLink>
    <!-- 普通标签写herf,RouterLink标签写to,或者 :to="{name:""}" -->
  </div>
  <router-view/>    <!-- 挂载路由实现本页面的局部跳转 -->
</template>

<script lang = "ts">
import { RouterView, RouterLink } from 'vue-router'
export default{
}
</script>

<style scoped>
div.navigate{
  margin: 90px;
}
.rlink{
  margin-right: 40px;
}
</style>
//  文件NewsView.vue
<template>
  <div class = "layout1">  <!-- layout1是flex布局 -->
    <div class="my">
      <div class v-for="i in newslist" :key="i.id">
      <!-- <RouterLink :to="`/news/detail?id=${i.id}&title=${i.title}`">{{ i.title }}</RouterLink> -->
      <RouterLink
        :to="{
            path: '/news/detail',
            query:{
              id: i.id,
              title: i.title,
              content: i.content
            }
        }">   {{ i.title }} 
      </RouterLink>
      </div>
    </div>
    <div class="my">
      <RouterView />  <!-- 挂载路由实现本页面的局部跳转 -->
    </div>
  </div>
</template>

<script lang = 'ts'>
import { reactive } from 'vue'

export default{
  name: "NewsView",
  setup(){
    const newslist = reactive([
      { id: 0, title: "2024年上半年软考报名时间", content: "2024-03-01" },
      { id: 1, title: "2024年上半年软考考试时间", content: "2024-05-25"},
      { id: 2, title: "2024年上半年软考成绩查询时间", content: "2024-08-01" },
    ]);
    return {
      newslist,
    }
  }
}
</script>

<style scoped>
div.my{
  margin-right: 20px;
}
section.layout1 {
  display: flex;
  gap: 22px;
  justify-content: center;
  align-items: center;
}
</style>
//  文件Detail.vue
<template>
    <div>
        <li>编号: {{ route.query.id }}</li>        <!--通过query传递参数-->
        <li>标题: {{ route.query.title }}</li>
        <li>内容: {{ route.query.content }}</li>
    </div>
</template>

<script lang="ts">
import { useRoute } from 'vue-router';

export default{
    name: "Detail",
    setup(){
        let route = useRoute();
        return{
            route
        }
    },
    components:{
    }
}
</script>

2、通过param传递参数