Vue 综合- extend

124 阅读1分钟

子组件代码

const compoent = {
  props: {
    active: Boolean,
    desc: String
    // desc: {
    //   type: String,
    //   required: true
    // }
  },
  template: `
    <div>
      <input type="text" v-model="text"></input>
      <span v-show="active">{{desc}}</span>
    </div>
  `,
  data () {
    return {
      text: 0
    }
  },
  mounted () {
    console.log('子组件挂载完成');
    console.log(this.$parent); // 获得父组件
    console.log(this.$parent.$options.name); // 获得父组件name
  }
}

Vue.extend() 扩展方式:

// Vue.extend 扩展出来的组件,如果需要修改 props 中的值,需要重新声明 propsData 对象才可以修改,重新声明 data 则可以直接覆盖内部的 data 对象。
// 内部同时实现挂载方法 mounted() ,会发现这两个方法都会被调用,先调用子组件里面的 mounted() 然后在调用扩展组件里面实现的
const compVue = Vue.extend(compoent)

// 方式一:
new compVue({
  el: '#app',
  propsData: {
    active: true,
    desc: "dzm"
  },
  data:{
    text: 'dzm'
  },
  mounted () {
    console.log('扩展组件挂载完成');
  }
})

// 方式二:
new Vue({
  el: '#app',
  components: {
    comp: compVue
  },
  template: '<comp></comp>'
})

extends: compoent 扩展方式:

// 扩展
const compoent2 = {
  extends: compoent,
  data () {
    return {
      text: "dzm"
    }
  },
  mounted () {
    console.log('扩展组件挂载完成');
  }
}

new Vue({
  name:'root',
  el: '#app',
  components: {
    comp: compoent2
  },
  data:{
    active: true,
    desc: 'dzm'
  },
  template: '<comp :active="active" :desc="desc"></comp>'
})