Vue.js(2): 组件与路由基础指南

这一路上可能会有艰辛、困难、疑惑、付出、泪水、失败,但是一定要享受这个过程,因为所有的失败都是为了下一刻的成功

文章目录

        • 组件
          • 什么是组件
          • 组件化开发的好处
          • 组件底层是什么
          • 全局注册组件
          • 局部注册组件
          • 组件嵌套
          • 组件命名规则
          • 组件传值
        • SPA
        • vue-router路由
          • 动态路由
          • to属性
          • 编程式导航
          • 重定向
          • 导航守卫
          • 路由嵌套

组件

请添加图片描述

什么是组件
  • js模块,独立的一个js文件,提供js逻辑,函数
  • vue组件,关注于界面,包含html结构、css样式、js代码,他可以把一个完成的页面根据界面功能拆分成若干组件
组件化开发的好处
  • 高度复用
  • 组件与组件之间是相互独立的,例如:数据、函数,组件实现的功能足够单一,后期更好维护
组件底层是什么
  • 组件本质上是一个vue实例,但是写法和vue实例不同,new Vue({配置对象})
  • 组件会通过Vue.component(组件)或者在vue实例中new Vue({component:{组件}})
  • 组件也有配置对象,不包含el选项,el是Vue实例管理的视图容器,组件通过template选项指定html结构容器
  • 配置选项:data、methods、watch、filters、directives、computed、cerated…(创建组件,创建vue实例)
<div id="app">
  <com-add></com-add>
</div>
<script src="./vue.js"></script>
<script>
  // 注册组件(vue实例)
  Vue.component('com-add', {
    template: `<div>{{count}} <button @click="add()">自增</button></div>`,
    data() {
      return {
        count: 0
      }
    },
    methods: {
      add() {
        this.count++
      }
    }
  })
  // vue实例
   const vm = new Vue({
    el: '#app'
  })
</script>
全局注册组件
  • 语法:Vue.component('组件名称','组件配置对象')
  • 完成注册后,可以在任意Vue实例管理的视图中使用
<div id="app">
  <!-- 注册组件的时候使用的组件名称,在视图中使用的是自定义标签的名称 -->
  <!-- 注意:组件的名称不能和原声html标签重名 -->
  <com-add></com-add>
</div>
<script src="./vue.js"></script>
<script>
  // 全局注册组件
  Vue.component('com-add', {
    // 组件配置对象,和vue实例配置对象基本一致,但是没有el选项
    // template选项必须指定,当前组件管理的视图,需要有一个根标签
    // 在模板字符中,可以使用插值表达式和任意指令,但是只能使用当前组件数据和函数
    template: '<div>{{count}}<button @click="add()">自增1</button></div>',
    // 声明数据,使用的还是data,但是如果是一个函数,函数的返回值才是组件的数据,必须是对象
    data() {
      return {
        count: 100
      }
    },
    // 可以使用任何配置选项
    methods: {
      add() {
        this.count++
      }
    }
  })
  // 根实例
  const vm = new Vue({
    el: '#app'
  })
</script>
局部注册组件
  • 语法:vue配置对象中 components:{'组件名称':'组件配置对象'}
  • 注册完毕后,只能在注册的当前vue实例管理的视图中使用
<div id="app">
  <com-add></com-add>
</div>
<script src="./vue.js"></script>
<script>
  const vm = new Vue({
    el: '#app',
    // 配置选项 components 注册局部组件
    components: {
      // 属性名称:组件的名称
      // 属性值:组件的配置对象
      'com-add': {
        template: '<div>{{count}} <button @click="add()">自增</button></div>',
        data() {
          return {
            count: 100
          }
        },
        methods: {
            add() {
              this.count++
          }
        }
      }
    }
  })
</script>
组件嵌套
<div id="app">
  <com-a></com-a>
</div>
<script src="./vue.js"></script>
<script>
  // b组件配置对象
  const ComB = {
    template: `<div class="com-b">COMB组件</div>`,
  }
  // a组件配置对象
  const ComA = {
    template: `<div class="com-a">COMA组件<com-b></com-b></div>`,
    components: {
      'com-b': ComB
     }
   }
  // 根实例
  const vm = new Vue({
    el: '#app',
    components: {
      'com-a': ComA
    }
  })
</script>
组件命名规则
  • 第一种:小写单词加中线 例如 com-add, nav-bar
    • 在使用组件的时候 <com-add></com-add> 、<nav-bar></nav-bar>
  • 第二种:单词首字母大写 例如 ComAdd、NavBar
    • 在使用的时候<com-add></com-add> , <nav-bar></nav-bar>
    • 注意:如果想使用单词首字母大写的组件名称作为标签的名称,只能在template指定的视图中使用 <ComAdd></ComAdd>、<NavBar></NavBar>,通过el指定的dom容器中不能使用
组件传值
  • 由于组件的数据是相互独立的,导致某个组件需要使用另外一个组件的数据遇到问题,我们需要通过特定的进行组件间的数据通信
  • 父组件传子组件
    <div id="app">
      <com-parent></com-parent>
    </div>
    <script src="./vue.js"></script>
    <script>
      // 父组件
      Vue.component('com-parent', {
        template: `<div>父组件: {{msg}}<com-child abc="abc数据" :myMsg="msg"></com-child></div>`,
        data() {
          return {
            msg: 'parent数据'
          }
        }
      })
      // 子组件
      Vue.component('com-child', {
        template: `<div>子组件:{{myMsg}}</div>`,
        // props 用来接收使用组件所绑定的属性,属性的名字就是数据的字段名
        // props接收的数据,是单向的,只负责父组件数据传递子组件
        // props接收的数据,仅仅只能访问,不能修改
        // props['abc']接收到了使用组件绑定的abc属性,使用vue实例即可访问
        // 此时的this.myMsg就是父组件传递给子组件的数据
        props: ['abc', 'myMsg']
      })
      // 根实例
      const vm = new Vue({
        el: '#app'
      })
    </script>
    
    总结
    • 在父组件中,使用子组件的时候,通过自定义属性绑定父组件数据
    • 在子组件中,使用props选项来接收父组件传递给子组件的数据
    • props接收的数据仅仅只能访问,不能修改
  • 子组件传父组件
    <div id="app">
      <com-parent></com-parent>
    </div>
    <script src="./vue.js"></script>
    <script>
      // 父组件
      Vue.component('com-parent', {
        template: `<div>父组件:<com-child @myEvent="fn($event)"></com-child></div>`,
        methods: {
          fn(data) {
            // data就是子组件的数据
            console.log('父组件打印:' + data)
          }
        }
      })
      // 子组件
      Vue.component('com-child', {
        template: `<div>子组件:<button @click="toParent()">子传父</button></div>`,
        data() {
          return {
            msg: 'child数据'
          }
        },
        methods: {
          toParent() {
            // 子传父
            this.$emit('myEvent', this.msg)
          }
        }
      })
      const vm = new Vue({
        el: '#app'
      })
    </script>
    
    总结
    • 在父组件,给子组件绑定自定义事件,会指定函数
    • 在子组件,内部使用this.$emit('自定义事件的名字','传递的数据')
    • 在父组件,指定的函数就会触发,而且默认的传参就是传递的数据,$event就是传递的数据
  • vue实例提供了一个参数,可以出发自己组件绑定的数据
    • this.$emit('myEvent'),myEvent就是自定义事件的名字
    • this.$emit('myEvent',数据)事件对于的函数有一个默认的传参
      • 指定的函数没有括号fn拥有一个默认传参,就是触发事件的时候传递的数据
      • 指定的函数有了括号fn($event),这个event就是触发事件的时候传递的数据
SPA
  • 特点介绍
    • 单页面应用程序,简称SPA(single page application),大白话就是一个系统上的所有功能在一个页面上实现
    • 优点
      • 利于实现前后端分离而且是项目及的分离
      • 只有资源加载完毕后,场景与场景之间的切换很流畅
    • 缺点
      • 把所有功能写在一起,一个页面的资源较大,第一次访问紫铜很慢(首屏加载数据慢)
      • 在一个页面上实现,数据都是异步加载,js动态渲染,不利于搜索引擎优化
  • 路由
    • 后端路由
      • 根据用户的请求地址+方式,分发到不同的业务函数,进行逻辑处理
      • 控制客户端请求和后端处理函数的映射关系
    • 前端路由
      • 根据地址栏变化(不发请求),根据地址栏的不同局部更新页面内容
        • 前端业务场景切换
      • 在vue项目中的路由
        • 控制地址变化和组件渲染的映射关系
    • 模拟前端路由的视线
      <nav>
        <!-- 地址上的改变 以#号这种方式的改变 是不会发生页面跳转的 -->
        <!-- 术语:#和#后 这段URL字符串称为:hash地址(锚点) -->
        <!-- hash的改变也会记录到浏览历史中,通过回退和前进也可以切换业务场景 -->
        <!-- 前端路由:监听的hash值的改变,去根据地址对应的网页内容 -->
        <a href="#/">发现音乐</a>
        <a href="#/my">我的音乐</a>
        <a href="#/friend">朋友</a>
      </nav>
      <div id="content">
        <!-- 需要根据地址(hash)来进行渲染 -->
      </div>
      <script>
        // 容器
        const content = document.querySelector('#content')
        const render = () => {
          // 获取hash地址
          const hash = location.hash
          // 去除#获取hash上的路径
          const path = hash.replace('#', '')
          // 根据路径渲染网页内容
          switch (path) {
            case '/':
              content.innerHTML = '发现音乐的网页内容'
            break;
            case '/my':
              content.innerHTML = '我的音乐的网页内容'
            break;
            case '/friend':
              content.innerHTML = '朋友的网页内容'
              break;
           }
         }
         render()
         // 当hash值变化的时候,动态设置网页内容
         window.onhashchange = function () {
           render()
        }
      </script>
      
vue-router路由
动态路由
  • 适用场景:不同的路由地址,指向同一个组件,此时需要使用动态路由
    请添加图片描述
to属性
  • 作用:<router-link>组件上的属性to,它的作用是声明点击后的跳转的路由地址
  • 使用
    • 直接使用字符串,简单路劲跳转
      • router-link to="/list"></router-link>
    • 可以使用字符串,进行路径的跳转
      • 路径传参 路由规则{ path: ‘/article/:id’ }
        • <router-link to="'/article/10001"></router-link>
      • 键值对传参 路由规则 { path: ‘/article’ }
        • <router-link to="'/article?id=10001"></router-link>
    • 普通跳转
      • <router-link :to="{path:'/list'}"></router-link>
    • 路径传参
      • const routes = [{path:'/article/:id',name:'item',component:Articl
      • <router-link :to="{name:'item',params:{id:10001}}"></router-link>
      • $route.params.id #进行获取
    • 键值对传参
      • const routes = [{path:'/article/',component:ArticleItem}]
      • <router-link :to="{path:'/article',query:{id:1001}}></router-link>
      • $route.query.id进行获取
编程式导航
  • <router-link>这个标签可以实现导航功能
    • 通过显性的组件router-link定义的导航(在界面看的见),声明式导航
  • 通过$router.push()这个函数可以实现导航功能
    • 通过js代码调用一个导航函数进行跳转,编程式导航
  • $route$router的区别
    • $route是获取当前地址栏信息的对象(参数,地址)
      • $route.params 路径参数
      • $route.query 键值对参数
      • $route.path 路由地址
    • $router是路由实例new VueRouter()挂载到vue实例上
      • 所有的vue实例,拥有一个属性$router提供函数
  • 使用场景
    • 在界面上,有确切的跳转链接,使用声明式导航
    • 当在执行一个js逻辑的时候,想进行跳转,此时就用编程式导航
      • 在做登录页的时候,登录成功后,才应该跳转到首页
重定向
  • 当访问某个地址的时候,经过程序的处理(用户看不到的),跳转到了另外一个地址
  • 前端的路由,使用重定向功能
    • 访问页面的时候,默认hash地址是 #/, 默认的路由地址 /
    • 我们的项目首页/home,所以当我们访问 / 重定向到 /home,才能默认访问首页
  • 重定向配置
    • 通过路由规则栏实现的,{path:'/',redirect:'/home'} 当访问路径跳转到/home路径
导航守卫
  • 实现在路由跳转前,实现一些业务逻辑,可以控制跳转的最终目标
  • 总结
    • 导航守卫 router.beforeEach((to, from, next) => {}
    • 在每次路由跳转前执行里面的回调函数
    • 可以实现前端路由的访问权限控制,登录状态的判断与拦截
路由嵌套

请添加图片描述

  • 概念:在已有的路由容器中,再实现一套路由,再套一个路由容器,叫路由嵌套
  • 配置:{path:'/',component:'组件',children:[]}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/904294.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[c++高阶]二叉搜索树深度剖析

1.前言 从二叉搜索树开始&#xff0c;后面慢慢学的AVL树&#xff0c;红黑树&#xff0c;map,set&#xff0c;哈希表等等都会慢慢的变得更难了&#xff0c;也更加难以理解了。希望大家能够坚持下去&#xff0c;只要坚持&#xff0c;就是胜利。 本章重点 着重讲解什么是二叉搜索…

【力扣刷题实战】单值二叉树

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 单值二叉树 题目描述 示例 1&#xff1a; 示例 2&#xff1a; 解题思路 题目理解 算法选择 具体思路 解题要点 完整代码&#xff08;C语言&#xff09; 兄弟们共勉 &#xff01;&#xff01;…

MySQL数据库MHA高可用

目录 一、MHA简述 二、MHA 的组成 三、MHA 的特点 四、MHA工作原理 五、MHA部署步骤 六、搭建 MySQL MHA MHA一主两从高可用集群示意图 实验环境 1. Master、Slave1、Slave2 节点上安装 mysql5.7 2. 关闭防火墙 3. 修改 Master、Slave1、Slave2 节点的主机名 4. 修…

国内短剧源码短剧系统搭建小程序部署H5、APP打造短剧平台

​在当今的互联网时代&#xff0c;短剧作为一种新兴的娱乐形式&#xff0c;受到了越来越多用户的喜爱。为了提供更好的用户体验和满足用户需求&#xff0c;一个好的短剧系统需要具备多元化的功能和优质的界面设计。 本文将介绍国内短剧源码短剧系统搭建小程序部署H5、APP所需的…

【传知代码】图像处理解决种子计数方法

文章目录 一、背景及意义介绍研究背景农业考种需求传统计数方法的局限性人工计数仪器设备计数 研究意义提高育种效率提高计数准确性广泛的适用性数据存档与分析便利 二、概述三、材料与数据准备以及方法介绍整体流程图像采集图像预处理形态学操作腐蚀运算开运算 图像二值化种子…

Typora一款极简Markdown文档编辑器和阅读器,实时预览,序列号生成!免费!最新可用!

文章目录 一、Typora下载和安装二、Typora序列号生成 Typora是一款Markdown编辑器和阅读器&#xff0c;风格极简&#xff0c;实时预览&#xff0c;所见即所得&#xff0c;支持MacOS、Windows、Linux操作系统&#xff0c;有图片和文字、代码块、数学公式、图表、目录大纲、文件管…

C/C++(八)C++11

目录 一、C11的简介 二、万能引用与完美转发 1、万能引用&#xff1a;模板中的 && 引用 2、完美转发&#xff1a;保持万能引用左右值属性的解决方案 三、可变参数模板 1、可变参数模板的基本使用 2、push 系列和 emplace 系列的区别 四、lambda表达式&#xf…

海亮科技亮相第84届中国教装展 尽显生于校园 长于校园教育基因

10月25日&#xff0c;第84届中国教育装备展示会&#xff08;以下简称“教装展”&#xff09;在昆明滇池国际会展中心开幕。作为国内教育装备领域规模最大、影响最广的专业展会&#xff0c;本届教装展以“数字赋能教育&#xff0c;创新引领未来”为主题&#xff0c;为教育领域新…

MYSQL期中复习

MYSQL [语句不要拼错&#xff0c;表名、列名不要写错&#xff0c;语句难记要记住] 创建表 模版 create table 表名(列名1 数据类型 [约束], 列明2 数据类型 [约束], [表级约束]); 约束 单一主码约束 primary key 联合主码约束 primary key(列名1,列名2) [要在列名12定义后…

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统

结合Intel RealSense深度相机和OpenCV来实现语义SLAM系统是一个非常强大的组合。以下是一个详细的步骤指南&#xff0c;帮助你构建这样一个系统。 硬件准备 Intel RealSense深度相机&#xff1a;例如D415、D435或L515。计算平台&#xff1a;一台具有足够计算能力的计算机&…

无人机之多源信息融合算法篇

一、概述 多源信息融合算法在无人机导航领域中扮演着越来越重要的角色。该算法通过整合来自不同传感器&#xff08;如全球定位系统GPS、惯性导航系统INS、磁力计、气压高度计、视觉传感器等&#xff09;的数据&#xff0c;利用先进的数据融合算法处理这些多源信息&#xff0c;以…

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…

索尔德 APON无线工业轨道机车定位测距仪介绍

索尔德APON无线定位测距仪&#xff0c;简称APON&#xff0c;采用先进的应答式微波测距技术&#xff0c;为车辆赋予了一双敏锐的“智慧之眼”&#xff0c;能够精确捕捉到有轨移动车辆的绝对位置&#xff0c;无论是快速穿梭还是缓慢移动&#xff0c;确保它们能够准确无误地抵达预…

企业如何选择适合自己的智能扭矩系统Torque?_SunTorque

【大家好&#xff0c;我是唐Sun&#xff0c;唐Sun的唐&#xff0c;唐Sun的Sun。一站式数智工厂解决方案服务商】 一、选择适合自己企业的智能扭矩系统时&#xff0c;可以考虑以下几个关键因素&#xff1a; 扭矩精度要求 首先要明确企业生产过程中对扭矩精度的具体要求。如果产…

全面解析:轻松掌握多模态技术精髓

多模态检索 多模态检索是指利用多种数据模态&#xff08;如文本、图像、视频、音频等&#xff09;进行信息检索的技术。它旨在通过整合不同形式的数据&#xff0c;提供更全面、精确和丰富的检索结果&#xff0c;以满足用户多样化的查询需求。 接下来分三部分&#xff1a; 单模…

net 获取本地ip地址,net mvc + net core 两种

net mvc public static string GetIP(HttpRequestBase request){// 尝试获取 X-Forwarded-For 头string result request.Headers["X-Forwarded-For"]?.Split(,).FirstOrDefault()?.Trim();if (string.IsNullOrEmpty(result)){// 获取用户的 IP 地址result reques…

云存储的费用是多少?2024年最新价格表

云存储的费用是多少最新&#xff1f;云存储的费用通常基于多个因素确定&#xff0c;包括存储容量、访问流量、请求次数、服务类型&#xff08;如对象存储、文件存储、块存储等&#xff09;、计费方式&#xff08;按量计费或包年包月&#xff09;以及可能的附加功能&#xff08;…

linux 原子操作

首先是为什么要有 原子操作 网上的截图&#xff1a; 不能从C语言来看&#xff0c;要从汇编来看 但是实际的情况有可能是这样。 A进程没有得到想要的结果。 然后是 原子操作的 底层实现 最终会是这段代码&#xff0c;当然只是一个 加一的操作。 static inline void atomic_a…

从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f343; vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode&#x1f4ab; Gitee &#x1f…

解析日期、编码

解析日期 这里指的是将字符串或者object类型的日期&#xff0c;转换成panda或python的日期类型。 主要的是dtype的变化&#xff1a;object / str —> datetime64[ns] # modules well use import pandas as pd import numpy as np import seaborn as sns import datetime# …