Vue组件

目录

一,组件的生命周期

二,组件之间的数据共享

1,组件之间的关系

2,父子关系数据共享(父→子)

3.父子关系数据共享(子→父)

4.兄弟关系数据共享

5.后代关系数据共享

三,动态组件&异步组件

1.在动态组件上使用 keep-alive

2.异步组件


一,组件的生命周期

组件的生命周期大体分为:创建 -> 运行(渲染) -> 销毁

1.在开始时import导入组件

2.components注册组件

3.像标签一样使用组件

4.创建组件实例对象

5.将实例渲染至页面

6.组件切换时销毁旧组件

二,组件之间的数据共享

1,组件之间的关系

父子关系,后代关系,兄弟关系

2,父子关系数据共享(父→子)

父组件通过v-bind属性绑定向子组件共享数据,子组件使用props接收数据

//父组件
<div :msg="message" :user="user"></div>
data(){
    return {
        msg:"hello",
        user:"luyao"
    }
}
//子组件
<template>
    <p>{{msg}}</p>
    <p>{{user}}</p>
</template>
 
<script>
export default{
    props:['msg','user']
}
</script>

3.父子关系数据共享(子→父)

子组件通过自定义事件向父组件传值,通过v-model可以实现数据的双向绑定

//子组件
export default{
    emits:['nchange'],    //声明事件
    data(){return {n:0}},
    methods:{
        addn(){
            this.n++
            //数据变化时触发
            this.$emit('nchange',this.n)
        },
    },
}
//父组件
<div @nchange="getn"></div>
export default{
    data(){ return { nfromson:0 } },
    methods:{
        getn(n){
            this.nfromson = n
        },
    },
}

4.兄弟关系数据共享

通过EventBus实现兄弟关系传值

1.安装mitt依赖包

npm install mitt@2.1.0

2.创建公共的 EventBus 模块: eventBus.js

//导入包
import mitt from 'mitt'
//创建e实例对象
const bus = mitt()
//将实例对象共享出去
export default bus

3.在数据接收方定义事件

export default{
    data(){ return { count: 0}},
    created(){
        bus.on('countChange',(count)=>{
            this.count = count
        })
    }
}

4,在数据接发送方触发事件

export default{
    data(){ return { count: 0}},
    methods:{
        addCount(){
            this.count++
            bus.emit('countChange',this.count)
        }
    }
}

5.后代关系数据共享

1.在进行后代传参时使用到了 provide 和 inject 两种方法或形式

//父组件
export default{
    data(){
        return{
            color:'red' 
        }
    }
    provide(){    
        return{
            color: this.color,
        }
    }
}
//后代组件
<template>
    <h1>{{color}}</h1>
</template>
 
<script>
    export default{
        inject:['color']
    }
<script>
//父组件computed 函数向下共享响应式的数据
//从vue中按需导入computed函数
import { computed } from 'vue'
export default{
    data(){
        return { color: 'red'}
    },
    provider(){
        //使用computed函数,可以把要共享的数据包装为响应式数据
        return{
            color: computed(()=> this.color),
        }
    }
}
//如果父级节点共享的是响应式的数据,则子孙节点必须以 .value 的形式进行使用
<template>
    <h3>{{color.value}}</h3>
</template>
 
<script>
    export default{
        inject: ['color']
    }
</script>

三,动态组件&异步组件

1.在动态组件上使用 keep-alive

曾经在多标签的界面中使用 is  来切换不同的组件,为了保持这些组件的状态,可以使用keep-alive进行包裹,这样就可以将其缓存起来。

<keep-alive>
  <component :is="currentTabComponent"></component>
</keep-alive>

2.异步组件

在大型应用中,我们可能需要将应用分割成小一些的代码块,并且只在需要的时候才从服务器加载一个模块。为了简化,Vue 有一个 defineAsyncComponent 方法

const app = Vue.createApp({})
const AsyncComp = Vue.defineAsyncComponent(
  () =>
    new Promise((resolve, reject) => {
      resolve({
        template: '<div>I am async!</div>'
      })
    })
)
app.component('async-example', AsyncComp)

此方法接受返回 Promise 的工厂函数。从服务器检索组件定义后,应调用 Promise 的 resolve 回调。你也可以调用 reject(reason),以指示加载失败。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咬口大葱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值