vue 插槽 作用域插槽 控制同一子组件视图不同

爷爷组件.vue

//父组件传值,控制相同子组件内部不同变化
<template>
  <div id="app">
    <!-- son组件 -->
    <son :show="false">
       <span slot="header">我是子组件header</span>
       <!-- 父元素自定义接收的 getValue 名 -->
       <p slot-scope="getValue">{{getValue.value}} {{getValue.value2}}</p>
    </son>

    <!-- son组件 -->
    <son :show="true" :text=text  @handleClick='handleClick'>
      <span slot="body">我是子组件body</span>
    </son>
  </div>
</template>

<script>
import son from './son.vue'
export default {
  //祖先给后代传值 祖辈使用provide函数定义值 但是当父组件传的值改变时 子孙组件的值不会同步改变
  //要同步改变需要用到Object.defineProperty 但vue官方不推荐这么用 vue升级可能会报错 
  provide(){
    const data={}
    Object.defineProperty(data,'text',{
      get:()=>this.text,
      enumerable:true
    })
    return{
         yeye:this,
         data
    }
  },
  components:{
      son
  },
  data(){
      return{
        text:12
      }
  },
  methods:{
    //父元素接收子元素的点击事件 修改逻辑
    handleClick(){
      this.text= this.text+1
    }
  }
}

</script>
<style lang='less' scoped>
 
</style>

子组件.vue

//子组件
<template>
  <div id="app">
    <p style="color:red;">我是同一子组件</p>
    <p v-show='show' @click="handleClick" style="font-size:20px;font-weight:600">点击我,父组件传值++{{text}}</p>
    <div :style=style>
      <slot name='header'></slot>
      <slot name='body' ></slot>
      <!-- 自定义value传递给父元素 -->
      <slot value="作用域插槽的值1" value2='作用域插槽的值2'></slot>
      <div>
         <!-- 孙子组件 -->
        <grandson></grandson>
      </div>
    </div>
  </div>
</template>

<script>
import grandson from './grandson.vue'
export default {
  components:{
    grandson
  },
  props:{
      show:Boolean,
      text:Number,
  },
  data(){
      return{
        //子节点最好不要修改父节点直接传进来的props值 例如:this.show=xxx  如果要修改 传事件给父元素
        style:{
          width:"200px",
          height:"200px",
          border:'1px solid #aaa'
        }
      }
  },
  methods:{
    //告诉父元素我被点击了
    handleClick(){
      this.$emit('handleClick')
    }
  }
}
</script>

<style lang='less' scoped>
#app{
  margin-left:30px;
}
</style>

孙子组件.vue

//孙子组件
<template>
  <div id="app">
      <p>我负责展示爷爷的值{{data.text}}</p>
  </div>
</template>

<script>
export default {
//祖先传值 孙辈用inject接收祖先传来的值
  inject:['yeye','data'],
  mounted(){
    // console.log(this.yeye)
  }
}

</script>
<style lang='less' scoped>
.text1{
    background: #ccc;
}
</style>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值