美文网首页
生命周期,组件通信、插槽

生命周期,组件通信、插槽

作者: 皇甫圣坤 | 来源:发表于2019-06-18 14:35 被阅读0次

一、生命周期

//此时vue实例已经进行了基础的初始化,但data数据还没有绑定到vue的实例,此时,访问不到data数据
            beforeCreate(){
                console.log('beforeCreate',this.msg);
            },
            //此时,data数据已经注入vue的实例,我们可以通过this访问到data数据
            created(){
                console.log('created',this.msg);
            },
            //此时,模板和数据已经结合,编译,但还没有挂载到指定的挂载点上 (或者没有挂载到指定的页面元素上)
            beforeMount(){
                console.log('beforeMount',this.$el);
            },
            //此时,编译后的模板已经挂载到挂载点上,我们会看到加载了数据的视图的更新
            mounted(){
                console.log('mounted',this.$el);
                // this.msg = "world"   //此时更改数据可以触发beforeUpdate钩子函数
            },

            //当有数据发生改变时,模板重新渲染之前,会触发该事件。
            beforeUpdate(){
                console.log('beforeUpdate',this.$el.innerHTML);
            },
            //当模板重新渲染之后,触发该事件
            updated(){
                console.log('updated',this.$el.innerHTML);
            },
            // 当执行vm.$destroy(),vue实例销毁之前发生
            beforeDestroy(){
                console.log('beforeDestroy');
            },
            //vue实例销毁之后发生,此时再改变数据,不会触发视图更新(或者视图重新渲染)
            destroyed(){
                console.log('destroyed');
            }

二、组件通信

Vue只有两种关系, 父子组件 非父子组件

1.父子通信:当我们需要把父组件中的数据传递给子组件时,使用父子通信

父组件

const Parent = {
  template: `
    <div>
      <child :m="msg"></child>
    </div>
  `,
  data () {
    return {
      msg: "这是父组件中的数据"
    }
  }
}

子组件

const Child = {
  template: `
    <div>{{m}}</div>
  `,
  // 设置prop接收
  props: ['m']
}

2.子父通信:当我们要把子组件中的数据,传递给父组件时,使用子父通信
父组件

const Parent = {
  template: `
    <div>
      <child :msg="msg" @send:msg="getMsg"></child>
    </div>
  `,
  data () {
    return {
      msg: '父组件中的数据'
    }
  },
  methods: {
    getMsg (msg) {
      this.msg = msg
    }
  }
}

子组件

const Child = {
  template: `
    <div>
      {{msg}}
      <button @click="changeMsg">点击修改msg</button>
    </div>
  `,
  props: ['msg'],
  methods: {
    changeMsg () {
      // this.msg = "新的内容" // 错误的 不要在子组件中直接修改父组件中传来的数据

      // 正确的
      this.$emit('send:msg', '子组件发过去的数据')
    }
  }
}

注意:在组件标签上看到属性,那么表示对应的父组件给子组件传值,如果我们在组件标签上看到@xxx="函数" 表示父组件在监听子组件的自定义事件

3.非父子通信:利用的是自定义事件,因为自定义事件的监听和触发必须得是同一个this,所以我们需要一个公共的vue实例,称其为bus
bus.js

const bus = new Vue()

组件1

const com1 = {
  template: `
    <div>
      <button @click="changemsg">点击修改组件2中的数据</button>
    </div>
  `,
  methods: {
    changemsg () {
      bus.$emit('changeMsg', '数据')
    }
  }
}

组件B

const com2 = {
  template: `
    <div>{{msg}}</div>
  `,
  data () {
    return {
      msg: '消息'
    }
  },
  created () {
    bus.$on('changeMsg', (msg) => {
      this.msg = msg
    })
  }
}

三、插槽

1、普通插槽

const com = {
  template: `
    <div>
      其他内容
      <slot></slot>
    </div>
  `
}
<div>
  <com>
    自定义内容
  </com>
</div>

2、具名插槽

默认的slot有一个名字为default

const com = {
  template: `
    <div>
      其他内容
      <slot name="自定义slot名字"></slot>
      <slot name="自定义slot名字2"></slot>
    </div>
  `
}
<div>
  <com>
    <template v-slot:自定义slot名字></template>
    <template v-slot:自定义slot名字2></template>
  </com>
</div>

3、作用域插槽

给用户留一些需要的数据

const com = {
  template: `
    <div>
      其他内容
      <slot key="value" key2="value2" key3="value3"></slot>
    </div>
  `
}
<div>
  <com>
    <template v-slot="scope">
      {{scope.key}}
      <button >删除</button>
    </template>
  </com>

  <com>
    <template v-slot="{key}"></template>
  </com>
</div>

相关文章

  • 生命周期,组件通信、插槽

    一、生命周期 二、组件通信 Vue只有两种关系, 父子组件 非父子组件 1.父子通信:当我们需要把父组件中的数据传...

  • 插槽slot

    插槽,占位符slot具名插槽,指定占位符slot、name作用域插槽,子组件占位符向父组件占位符通信。slot、s...

  • Vue 学习记录二

    组件化: 动态组件 父子组件 插槽 数据共享(Vuex) Vue Router: 生命周期: Plugin 开发:...

  • 09-生命周期及非父子组件间的通信

    一. Vue生命周期 二、生命周期代码 三、非父子组件通信 vue中非父子组件通信需要借助一个空的vue实例,案...

  • 组件通信、插槽、动态组件、异步组件

    修饰符 lazy number trim 组件化开发 思想:提供了一种抽象,让我们可以开发出一个个独立可复用的小组...

  • VUE组件(传值,生命周期)

    VUE生命周期 VUE子传父组件通信 VUE非父子组件传值

  • 插槽(默认插槽、具名插槽、作用域插槽)

    默认插槽 1.作用:让父组件可以向子组件指定位置插入 html 结构,也是一种组件间通信的方式,适用于父组件 ==...

  • vue插槽

    默认插槽(没有名字的插槽) 具名插槽(带名字的插槽) 老版 2.6.0以前 新版 作用域插槽(父组件可以获取子组件...

  • 微信小程序面试题

    1.组件生命周期 2.behavior 3.全局生命周期 4.slot 5.组件通信 6.scroll-view ...

  • Vue插槽

    Vue 插槽 插槽用于向组件传递内容,插槽内可以包含任何模板代码,包括 HTML,甚至组件。如果 组件 没有包含一...

网友评论

      本文标题:生命周期,组件通信、插槽

      本文链接:https://www.haomeiwen.com/subject/gtjafctx.html