2021-11-08 组件与路由

本文详细介绍了Vue.js中的组件化开发,包括全局组件与局部组件的创建,组件的使用与复用,以及组件间的通信如正向传值(props)和事件监听(逆向传值)。同时,深入讲解了Vue Router的基本概念和配置,展示了如何通过路由规则实现页面间的跳转,并探讨了路由导航的不同方式,如声明式和编程式导航。此外,还提到了槽口(slot)的概念,用于在组件内部插入自定义内容,增强了组件的灵活性。
摘要由CSDN通过智能技术生成

组件

组件把一个页面拆成多个细小的小功能区域 分别来创建

就可以让这一个个的小模块方便重复的进行调用 减少了代码量 降低了后期维护的难度

组件分类

全局组件--component

局部组件--components

创建组件其实就是新建一个.vue文件 并且写入如下内容

<template>
  <div>
      我是一个组件么么哒
  </div>
</template>
​
<script>
export default {
​
}
</script>
​
<style>
​
</style>

使用组件

在你想使用的地方

引用

// 1.引用
import Demo from "./components/demo.vue"

调用

components 用来描述局部组件 写在与data methods watch等同级的位置

语法:

components:{
    给你引用的组件起个名字: 你引用的组件
}
 components:{
    Demo
  }
 

使用:

组件的本质 就是自定义标签

标签有单标签和双标签 单标签 <关键字/> 双标签 <关键字></关键字>

<你的组件名/>

scoped

当前样式仅对当前组件生效

父子组件

其实就是在一个组件中引用另外一个组件

引用

调用

使用

组件传值

我在父组件中有个数据 我能在子组件中直接使用吗? 不能

我在子组件中有个数据 我能在父组件中直接使用吗? 不能

结论

组件与组件之间是完全独立的个体 无论组件是什么关系都不能直接相互使用数据

正向传值--props

父组件把数据给子组件使用

1.子组件需要使用props来创建接收传递过来数据的变量

语法:

props:[变量1,变量2,....变量n]

<template>
  <div>
      {{xiaoming}}  
       <!-- 变量的使用 -->
  </div>
</template>
​
<script>
export default {
    props:["xiaoming"] 
     //使用props来创建接收传递过来数据的变量
​
}
</script>
​

2.父组件就要给他传递数据

在子组件被调用的时候 把子组件的props当做一个属性来进行传值 (组件的实质就是自定义标签)

<template>
  <div class="bottombar">
      <!-- 使用 -->
      <Zi xiaoming="数据1"/>
      <Zi xiaoming="数据2"/>
      <Zi xiaoming="数据3"/>
      <Zi xiaoming="数据4"/>    
  </div>
</template>

props验证

就是在现有的正向传值之上 对父组件传递给子组件的数据进行数据格式或者类型上的验证

1.子组件接收的时候需要设置接收数据的验证

props:{

你接收数据的变量:数据类型

你接收数据的变量:[数据类型1,数据类型2]

你接收数据的变量:{

type:你要验证的数据类型,

default:默认值

}

}

 props:{
        //text:String 只验证一种类型
        text:[String,Number]
    }

默认值语法

 props:{
        //text:String 只验证一种类型
        // text:[String,Number]
        text:{
            type:String,
            // 默认值
            default:"你好我是默认值"
        }
    }

逆向传值

子组件把数据给父组件

逆向传值默认是不被允许的 如果想逆向传值的话那么我们必须要通过 自定义事件 来完成

逆向传值 必须要通过一个事件来触发自定义事件的创建

实现:

1.在子组件中必须要用一个事件来触发

<template>
  <div>
      zizzizizizizizi
      <button v-on:click="fun()">点我进行逆向传值</button>
  </div>
</template>
​
<script>
export default {
    methods:{
        fun(){
            
        }
    }
}
</script>
​
<style>
​
</style>

2.自定义事件 使用this.$emit() 来实现自定义事件

语法:this.$emit("自定义事件名","数据")

<template>
  <div>
      zizzizizizizizi
      <button v-on:click="fun()">点我进行逆向传值</button>
  </div>
</template>
​
<script>
export default {
    methods:{
        fun(){
            // 创建自定义事件
            this.$emit("xiaoming","我是子组件的数据^_*!")
        }
    }
}
</script>
​
<style>
​
</style>

3.父组件接收这个自定义事件

<template>
  <div>
      fufuffufufufufufufu
      <!-- 父组件函数不加()
      父组件函数不加()
      父组件函数不加()
      父组件函数不加()
      父组件函数不加() 
      因为加了函数就自动调用了
      -->
      <Nz @xiaoming="demo"/>
  </div>
</template>
​
<script>
import Nz from "./nizi.vue"
export default {
    methods:{
        // 这个形参就是子组件传递的数据会自动传给形参
        demo(val){
            console.log(val);
        }
    },
    components:{
        Nz
    }
}
</script>
​
<style>
    div{
        font-size: 0.2rem;
    }
</style>

逆向传值默认不被允许 所以我们通过事件触发一个自定义事件的抛出 在父组件中使用@ 绑定这个自定义事件 从而得到子组件的数据

兄弟同胞传值

相同父组件的两个子组件之间相互传值

跨组件传值

组件与组件之间有多个层级关系的时候传值

slot--槽口/插槽

引子

组件在被调用的时候 我们知道组件的本质是自定义标签 标签是可以在内部插内容的 组件可以吗?

默认情况下不可以

槽口是什么?

用来混合父组件与子组件自己的模板(就是可以在组件被调用的时候 向其内部插入新的dom节点) 槽口也是组件提高复用性的技术之一 props如果是只能向组件内部插入数据的话,那么槽口就是向组价内部插入新的dom节点

基础用法

默认情况在组件是一个自定义标签 但是在组件被调用的时候不能直接插入dom节点,所以这个时候需要给组件内部设置一个插槽 来接收外部插入的数据

语法:

<slot></slot>

<div>
      zizizizizziizziz
       <slot></slot>
  </div>

上面这种写法 后期插入的内容多个就不好维护了 所以在开发的时候使用的很少

具名槽口

带有名字的槽口 给槽口在定义的时候起个名字

语法:

在定义的时候 <slot name="给槽口起个名字随便写"></slot>

在插入内容的时候:

<组件>

<p slot="你要插入的slot的name"></p>

</组件>

子组件

<template>
  <div>
      zizizizizziizziz
      <div class="red">
           <slot name="xiaoming"></slot>
      </div>
      
       <hr>
       <div class="yellow">
            <slot name="xiaohong"></slot>
       </div>
      
  </div>
</template>
​
<script>
export default {
​
}
</script>
​
<style scoped>
    .red>h1{
        color:red;
    }
    .yellow>h1{
        color:yellow;
    }
</style>

父组件

<template>
  <div>
      fufufufuffufufu
      <Sz>
          <h1 slot="xiaohong">插入内容1</h1>
          <h1>插入内容2</h1>
          <h1>插入内容3</h1>
          <h1>插入内容4</h1>
          <h1 slot="xiaoming">插入内容5</h1>
          <h1>插入内容6</h1>
          <h1>插入内容7</h1>
          <h1>插入内容8</h1>
          <h1 slot="xiaoming">插入内容9</h1>
          <h1>插入内容0</h1>
      </Sz>
    
  </div>
</template>
​
<script>
import Sz from "./slotzi.vue"
export default {
    components:{
        Sz
    }
}
</script>
​
<style>
​
</style>

路由---router

传统的项目怎么切换跳转页面?

1.新建很多的html文件

2.使用 标签的方式进行跳转(a标签) 或者使用js的方式进行跳转(window.location.href )

传统的项目称之为 多页面项目

路由基本概念

根据url的不同来渲染不同的组件页面

SPA -- 单页面应用 在用户切换页面的时候 没有那种传统页面的白屏问题 提高了用户的体验

路由基本创建

vue-cl自动创建

在创建脚手架的时候 选择自定义 再选择Router 即可

在创建完项目之后 会在src中多了两个文件夹

router ---》 当前文件夹就是配置路由的文件夹

views ---》 当前文件夹就是来写路由页面组件的

带有路由的空项目怎么办?

1.删除components里面的helloword.vue 与views里面的home.vue about.vue文件

2.views下新建你所需要的组件页面

3.需要 配置路由规则 去router下的index.js中配置

(3-1)引用你所想要的页面 到index.js下 import from

(3-2) 在index.js的数组对象中 进行规则的配置

// 引用vue
import Vue from 'vue'
// 引用vue的路由功能模块
import VueRouter from 'vue-router'
// 引用你要配置的路由页面
// @ 只要在路径中出现  无论是在那个层级  只要写@就指向src
import Home from "@/views/home.vue"
import Jingxi from "@/views/jingxi.vue"
import Phone from "@/views/phone.vue"
import Shop from "@/views/shop.vue"
import User from "@/views/user.vue"
// 在vue中 使用  vue路由
Vue.use(VueRouter)
​
// 配置路由规则的地方
const routes = [
  // 配置路由规则
  {
    path: '/home', //url的路径
    name: 'home',//给这个规则起个名字
    component: Home //根据上后面的path路径 所渲染的组件页面
  },
  {
    path: '/jingxi', //url的路径
    name: 'jingxi',//给这个规则起个名字
    component: Jingxi //根据上后面的path路径 所渲染的组件页面
  },
  {
    path: '/phone', //url的路径
    name: 'phone',//给这个规则起个名字
    component: Phone //根据上后面的path路径 所渲染的组件页面
  },
  {
    path: '/user', //url的路径
    name: 'user',//给这个规则起个名字
    component: User //根据上后面的path路径 所渲染的组件页面
  },
  {
    path: '/shop', //url的路径
    name: 'shop',//给这个规则起个名字
    component: Shop //根据上后面的path路径 所渲染的组件页面
  },
 
]
​
const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})
​
export default router
 

手动创建

路由导航

标签方式----声明式导航

使用 router-link这个标签来完成页面的跳转 其中有个to属性就是 你要去哪里的路径

<template>
  <div class="bar">
      <!-- 声明式导航 -->
      <router-link to="/home">首页 </router-link>
      <router-link to="/jingxi">惊喜 </router-link>
      <router-link to="/phone">手机 </router-link>
      <router-link to="/shop">购物 </router-link>
      <router-link to="/user">我的 </router-link>
  </div>
</template>

声明式导航选中样式类

每当我们选中那个声明式导航之后 vue会自动给这个导航添加一个router-link-active的类名 那么我们就可以根据这个动态的类名添加样式

js的方式--- 编程式导航

1.跳转 this.$router.push("/去哪里的路径")

2.替换 this.$router.replace("/替换的路径")

fun(){
            this.$router.push("/home")
        }

3.前进与后退 this.$router.go() 正数 前进 负数 后退

我去公司之后项目怎么启动?

文件夹里有package.json文件,里面的name就是文件名,里面的serve改成start,项目直接启动,就可以不用npm run serve (server是匹配的,有的公司会改名字)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值