vue-路由-0-传参-命名-子路由

简介: 为了更好的理解router 建议看下文章 前端路由基础对于大多数单页面应用,都推荐使用官方支持的 vue-router 库。更多细节可以移步 vue-router 文档。先不使用单文件组件

1.前言


为了更好的理解router 建议看下文章 前端路由基础

对于大多数单页面应用,都推荐使用官方支持的 vue-router 库。更多细节可以移步 vue-router 文档

先不使用单文件组件


需求分析

为什么用router

有没有其他方式

SPA单页不能刷新
  1. History api /home
  2. hash         #/home
    参看 这篇文章 前端路由基础
根据URL 显示对应的内容

router-view

数据响应式:current变量代表当前地址,一旦变化,动态重新执行 render


2. 基础语法


html

router-link 是一个组件,该组件用于设置一个导航链接,切换不同的HTML页面内容(组件),属性to是目标地址,本质上该组件会被渲染成一个a标签

router-view路由出口,路由跳转时匹配的路径对应的组件会将渲染到这里


<div id="app">
        <h1>{{msg}}</h1>
        <!-- <router-view></router-view> -->
        <!-- 路由跳转部分 -->
        <div>
            <router-link to="/">home</router-link>
            --------
            <router-link to="/about">about</router-link>
        </div>
        <!-- 路由出口,路由跳转时匹配的路径对应的组件会将渲染到这里 -->
        <router-view></router-view>
    </div>


js


<script type="text/javascript">
    // 注册局部组件 const 修饰的变量不能被改变
    const NotFound = { template: '<p>Page not found</p>' }
    const Home = { template: '<p>home page</p>' }
    const About = { template: '<p>about page</p>' }
    //1.配置路由,定义路由对象,每个路由可以映射一个路径 -- 组件
    const routes = [{
        //  /代表默认路由
        path: "/",
        component: Home
    },
    {
        path: "/about",
        component: About
    }
    ];
    //2.创建路由实例对象 router ,然后配置路由信息
    const router = new VueRouter({
        // routes:rs,
        routes
    });
    // 创建和挂载vue实例时,同时使用router配置参数注入路径信息
    var ve = new Vue({
        // router:router,
        router,
        el: "#app",
        data: {
            msg: "路由router学习"
        },
        components: {
            Home,
            About,
            NotFound
        }
    });
</script>



3. 路由-传参


核心是

  1. 路由配置


{
// 路由路径信息中以nameID传值
    path: "/first/:nameID",
    component: First
},
{
// 动态路径  id是一个动态的数字,代表是可选的
path: "/second/:id(\\d*)?",
component: Second
    }


  1. 使用 跟上参数


<router-link to="/first/1">first页面</router-link>


3.获取传值  那肯定在对应的钩子里面


created(){
                console.log("first界面创建");
                // 组件被创建完成的方法
                console.log(this.names);
                // 当前的路由对象
                console.log(this.$route);
                // 当前路由传递的参数
                console.log(this.$route.params);
                this.selectName = this.names[this.$route.params.nameID];
            }



4.命名路由


4.1 命名路由 配置

核心 路由配置 加个name属性

这里强调一点 这个 路由的name属性 和组件内部的name属性 没有关系

组件内部的 name属性主要用来标识组件 调试方便


{
           // 第二种方式:通过命名式路由跳转
           path:"/home",
           name:"home",
           component:Home
        },
        {
            path:"/artD",
           name:"article",
           component:Article
        },


4.2命名路由使用-1

绑定 to属性

参数是  对象 键是 name 值是 上面配置的复制


<router-link :to="{name:'home'}">小说首页</router-link>


4.3命名路由使用-2

直接绑定一个对象


<router-link :to="homeObj">小说首页</router-link>

数据源配置


data:{
    homeObj:{
        name:"home"
    }



5. 命名路由传参


这个属于菜单层级的跳转

比如一级跳二级 需要传参

商品页 跳入详情页需要商品id

核心是配置 params  传参


<li v-for="(v,i) in articles">
                ---------命名式跳转:
                <router-link :to="{name:'art',params:{artID:v},query:{obj:v}}">{{v.title}}</router-link>
            </li>


获取传的参数 钩子


created(){
            console.log("ArtDetail组件创建完成!");
            //params 接收路由跳转时,url路径中的信息
            console.log(this.$route.params);
            // query 接收路由跳转时,传递的参数信息
            console.log(this.$route.query);
            // 接收路由传递过来的对象
            // this.artObj = this.$route.params.artID;
            // 或者
            this.artObj = this.$route.query.obj;
        },


完整的简易 结构展示如下


<body>
        <div id="app">
            <div>
                <!-- 第二种方式:命名式路由跳转 -->
                <!-- <router-link :to="{name:'home'}">小说首页</router-link> -->
                <router-link :to="homeObj">小说首页</router-link>
                -------
                <router-link :to="{name:'article'}">小说列表</router-link>
            </div>
            <!-- 路由出口 -->
            <router-view></router-view>
        </div>
    </body>
    <!-- 自定义动态组件 -->
    <script type="text/x-template" id="home">
        <div>
        <h2>小说首页加载完成</h2>
        <ul>
            <li>首页模块1</li>
            <li>首页模块2</li>
            <li>首页模块3</li>
            <li>首页模块4</li>
            <li>首页模块5</li>
        </ul>
        </div>
    </script>
    <!-- 小说列表 -->
    <script type="text/x-template" id="article">
        <div>
        <h2>小说列表页</h2>
        <ul>
            <li v-for="(v,i) in articles">
                ---------命名式跳转:
                <router-link :to="{name:'art',params:{artID:v},query:{obj:v}}">{{v.title}}</router-link>
            </li>
        </ul>
        </div>
    </script>
    <!-- 小说详情 -->
    <script type="text/x-template" id="artdetail">
        <div v-if="show">
           <h1>{{artObj.title}}</h1>
           <p>{{artObj.content}}</p>
        </div>
    </script>
    <script type="text/javascript">
//模拟后台返回的数据为
var dataArr = [{id:1,title:"被讨厌的勇气",content:"被讨厌的勇气并不是要去吸引被讨厌的负向能量,而是,如果这是我生命想绽放出最美的光彩,那么,即使有被讨厌的可能,我都要用自己的双手双脚往那里走去。"}]
// 自定义组件 -- 小说首页 Home
    const Home = {
        template:`#home`
    };
    // 小说列表页 --- Article
    const Article = {
        template:`#article`,
        data(){
            return {
                articles:dataArr
            }
        }
    };
    //小说详情 --- ArtDetail 
    const ArtDetail = {
        template:`#artdetail`,
        data(){
            return {
                artObj:null,
                show:false
            }
        },
        created(){
            console.log("ArtDetail组件创建完成!");
            //params 接收路由跳转时,url路径中的信息
            console.log(this.$route.params);
            // query 接收路由跳转时,传递的参数信息
            console.log(this.$route.query);
            // 接收路由传递过来的对象
            // this.artObj = this.$route.params.artID;
            // 或者
            this.artObj = this.$route.query.obj;
        },
        mounted(){
            this.show = true;
        }
    }
    // 配置路由信息
    const rs = [
        {
           // 第二种方式:通过命名式路由跳转
           path:"/home",
           name:"home",
           component:Home
        },
        {
            path:"/artD",
           name:"article",
           component:Article
        },
        {
            path:"/artDetil",
           name:"art",
           component:ArtDetail
        }
    ];
    // 创建一个路由实例对象
    const router = new VueRouter({
        routes:rs
    });
        // 路由配置信息
        var ve = new Vue({
            router,
            el:"#app",
            data:{
                homeObj:{
                    name:"home"
                },
                articleD:"/article"
            }
        })
    </script>



6. 不经常使用的 path方式


6.1 路由配置

{
            path: "/artDetail/:artID",
            component: ArtDetail
        }


6.2  使用

<div id="app">
        <div>
            <!-- 第一种方式:path路径跳转 -->
            <router-link to="/home?name='小说'&price=116">小说首页</router-link>
            -------
            <router-link to="/article">小说列表</router-link>
        </div>
        <!-- 路由出口 -->
        <router-view></router-view>
    </div>


6.3组件 定义

也是拼接


<!-- 小说列表 -->
<script type="text/x-template" id="article">
        <div>
        <h2>小说列表页</h2>
        <ul>
            <li v-for="(v,i) in articles">
                <!-- /artDetail/5?title=zx&con=kkk -->
                path跳转: 
                <router-link :to="'/artDetail/'+v.id+'?title=' + v.title + '&con=' + v.content">{{v.title}}</router-link>
            </li>
        </ul>
        </div>
    </script>


6.4获取值

created() {
            console.log("ArtDetail组件创建完成!");
            //params 接收路由跳转时,url路径中的信息
            console.log(this.$route.params);
            // query 接收路由跳转时,传递的参数信息
            console.log(this.$route.query);
            // 接收路由传递过来的id
            this.artObj = dataArr[this.$route.params.artID - 1];
        },




相关文章
|
2月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
292 2
|
1月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
276 137
|
4月前
|
人工智能 JSON JavaScript
VTJ.PRO 首发 MasterGo 设计智能识别引擎,秒级生成 Vue 代码
VTJ.PRO发布「AI MasterGo设计稿识别引擎」,成为全球首个支持解析MasterGo原生JSON文件并自动生成Vue组件的AI工具。通过双引擎架构,实现设计到代码全流程自动化,效率提升300%,助力企业降本增效,引领“设计即生产”新时代。
402 1
|
4月前
|
JavaScript 安全
在 Vue 中,如何在回调函数中正确使用 this?
在 Vue 中,如何在回调函数中正确使用 this?
257 0
|
5月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
761 0
|
7月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
998 4
|
5月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
6月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
819 77
|
7月前
|
缓存 JavaScript 前端开发
Vue 基础语法介绍
Vue 基础语法介绍
|
5月前
|
JavaScript 前端开发 开发者
Vue 自定义进度条组件封装及使用方法详解
这是一篇关于自定义进度条组件的使用指南和开发文档。文章详细介绍了如何在Vue项目中引入、注册并使用该组件,包括基础与高级示例。组件支持分段配置(如颜色、文本)、动画效果及超出进度提示等功能。同时提供了完整的代码实现,支持全局注册,并提出了优化建议,如主题支持、响应式设计等,帮助开发者更灵活地集成和定制进度条组件。资源链接已提供,适合前端开发者参考学习。
464 17