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

我不是女神ヾ 2023-06-25 03:29 24阅读 0赞

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODQwNDg5OQ_size_16_color_FFFFFF_t_70

爷爷组件.vue

  1. //父组件传值,控制相同子组件内部不同变化
  2. <template>
  3. <div id="app">
  4. <!-- son组件 -->
  5. <son :show="false">
  6. <span slot="header">我是子组件header</span>
  7. <!-- 父元素自定义接收的 getValue -->
  8. <p slot-scope="getValue">{
  9. {getValue.value}} {
  10. {getValue.value2}}</p>
  11. </son>
  12. <!-- son组件 -->
  13. <son :show="true" :text=text @handleClick='handleClick'>
  14. <span slot="body">我是子组件body</span>
  15. </son>
  16. </div>
  17. </template>
  18. <script>
  19. import son from './son.vue'
  20. export default {
  21. //祖先给后代传值 祖辈使用provide函数定义值 但是当父组件传的值改变时 子孙组件的值不会同步改变
  22. //要同步改变需要用到Object.defineProperty 但vue官方不推荐这么用 vue升级可能会报错
  23. provide(){
  24. const data={}
  25. Object.defineProperty(data,'text',{
  26. get:()=>this.text,
  27. enumerable:true
  28. })
  29. return{
  30. yeye:this,
  31. data
  32. }
  33. },
  34. components:{
  35. son
  36. },
  37. data(){
  38. return{
  39. text:12
  40. }
  41. },
  42. methods:{
  43. //父元素接收子元素的点击事件 修改逻辑
  44. handleClick(){
  45. this.text= this.text+1
  46. }
  47. }
  48. }
  49. </script>
  50. <style lang='less' scoped>
  51. </style>

子组件.vue

  1. //子组件
  2. <template>
  3. <div id="app">
  4. <p style="color:red;">我是同一子组件</p>
  5. <p v-show='show' @click="handleClick" style="font-size:20px;font-weight:600">点击我,父组件传值++{
  6. {text}}</p>
  7. <div :style=style>
  8. <slot name='header'></slot>
  9. <slot name='body' ></slot>
  10. <!-- 自定义value传递给父元素 -->
  11. <slot value="作用域插槽的值1" value2='作用域插槽的值2'></slot>
  12. <div>
  13. <!-- 孙子组件 -->
  14. <grandson></grandson>
  15. </div>
  16. </div>
  17. </div>
  18. </template>
  19. <script>
  20. import grandson from './grandson.vue'
  21. export default {
  22. components:{
  23. grandson
  24. },
  25. props:{
  26. show:Boolean,
  27. text:Number,
  28. },
  29. data(){
  30. return{
  31. //子节点最好不要修改父节点直接传进来的props值 例如:this.show=xxx 如果要修改 传事件给父元素
  32. style:{
  33. width:"200px",
  34. height:"200px",
  35. border:'1px solid #aaa'
  36. }
  37. }
  38. },
  39. methods:{
  40. //告诉父元素我被点击了
  41. handleClick(){
  42. this.$emit('handleClick')
  43. }
  44. }
  45. }
  46. </script>
  47. <style lang='less' scoped>
  48. #app{
  49. margin-left:30px;
  50. }
  51. </style>

孙子组件.vue

  1. //孙子组件
  2. <template>
  3. <div id="app">
  4. <p>我负责展示爷爷的值{
  5. {data.text}}</p>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. //祖先传值 孙辈用inject接收祖先传来的值
  11. inject:['yeye','data'],
  12. mounted(){
  13. // console.log(this.yeye)
  14. }
  15. }
  16. </script>
  17. <style lang='less' scoped>
  18. .text1{
  19. background: #ccc;
  20. }
  21. </style>

发表评论

表情:
评论列表 (有 0 条评论,24人围观)

还没有评论,来说两句吧...

相关阅读