Vue 生命周期和数据共享

1. 组件的生命周期

1.1 生命周期与生命周期函数

  • 生命周期是指一个组件从 创建 => 运行 => 销毁 的整个时间段,强调的是一个时间段
  • 生命周期函数是由 vue 框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行

1.2 组件生命周期函数的分类

在这里插入图片描述

1.3 生命周期图示以及详解

官网图示:生命周期图示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

组件创建阶段

  • beforeCreted props/data/methods … 都未被创建,啥也干不了

  • created

    • props/data/methods … 都创建好了
    • 经常在此函数里调用 methods 中的方法,请求服务器中的数据
    • 并且把请求到的数据转存在 data 中,提供 template 模板渲染的时候使用。
    • 但是模板结构尚未生成,不能访问 DOM 结构,DOM 结构均为 null
  • beforeMount 将要把内存中编译好的 HTML 结构渲染到浏览器中

  • mounted

    • 已经把内存中的 HTML 结构成功的渲染到了浏览器
    • 此时浏览器中已经包含了当前组件的 DOM 结构
    • 这也是最早可以操作 DOM 的时候

组件运行阶段

  • beforeUpdate
    • 将要根据变化过最新的数据重新渲染组件的模板结构
    • data是最新ui结构中的内容还是旧的
  • updated
    • 已经根据最新的数据完成了组件的 DOM 结构的重新渲染
    • 新的 data新的 ui结构
    • 当数据变化之后,操作最新的 DOM 结构

组件销毁阶段

beforeDestory 将要销毁这个组件,此时尚未销毁组件还处于正常工作的状态

destoryed 组件已经完全被销毁,此时组件在浏览器中对应的 DOM 结构已经完全移除

2. 组件之间的数据共享

2.1 组件之间的关系

在项目的开发中,组件之间的最常见的关系分为如下两种:

  • 父子关系
  • 兄弟关系

2.2 父向子传值

使用自定义属性

  • 简单类型复制复杂类型是传的引用

  • 不要修改 props 的值

  • 父组件通过 v-bind 绑定数值

    <Son :msg="message" :user="userinfo"></Son>
    
    export default {
        data() {
            return {
                message: 'hello son',
                userinfo: {
                    name: 'pingting',
                    age: 18
                }
            }
        }
    }
    
  • 子组件通过 props 声明自定义属性

    <div>
        <h3>Son 组件</h3>
        <p>父组件传过来的 msg: {{ msg}} </p>
        <p>父组件传过来的 user:{{ user}} </p>
    </div>
    
    export default {
        props: ['msg' , 'user']
    }
    

2.3 子向父传值

使用自定义事件

  • 子组件通过 $emit 将值传递给父组件

    当 click事件触发 => 调用 add 函数 => 触发 numChange 事件 =>

    this.count作为实参传递给 getNewCount 函数 => 形参为 val

    export default {
        data(){
            return {
                // 子组件的数据
                count: 0
            }
        },
        methods: {
            add(){
                this.count += 1
                // 触发一个自定义事件并且传递参数
                this.$emit('numChange' , this.count)
            }
        }
    }
    
  • 父组件

    @ 绑定自定义事件

    <Right @numChange="getNewCount"></Right>
    
    export default {
        data() {
            return {
                // 接收 right 传过来的 count
                countFather: 0
            }
        },
        methods: {
          getNewCount(val){
            this.countFather = val
          }
        }
    }
    

2.4 兄弟之间的数据关系

vue2.x 使用 eventBus
在这里插入图片描述

  • 创建 eventBus.js 模块,并向外共享一个 Vue 的实例对象

    import Vue from 'vue'
    export default new Vue()
    
  • 在数据发送方,调用 bus.$emit('事件名称',发送的数据) 方法触发自定义事件

    <button @click="sendStr">发送数据给 Right </button>
    
    import bus from './eventBus.js'
    export default {
        data(){
            return {
                str: '这是Son的str数据,将要共享出去'
            }
        },
        methods: {
            sendStr(){
                // 通过 eventBus 发送数据
                bus.$emit('share' , this.str)
            }
        }
    }
    
  • 在数据接收方,调用 bus.$on('事件名称',事件处理函数) 方法注册一个自定义事件

    <p>从 Son 接受的数据:{{ strFromSon }} </p>
    
    import bus from './eventBus.js'
    export default {
        data(){
            return {
                strFromSon: ''
            }
        },
        created() {
            bus.$on('share' , (val) => {
                this.strFromSon = val
            })
        }
    }
    
  • 6
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值