组件进阶-

一、动态组件

<component> 是vue的内置组件,必须要有一个is属性 ,is的值要用data中的一个键作为值,可以实现动态切换组件

用法:

组件A

<template>
<div>
用户名:
<input type="text" name="" id="" />
密码:
<input type="password" name="" id="" />
个人信息:
<textarea name="" id="" cols="30" rows="10"></textarea>
</div>
</template>

<script>
export default {}
</script>

<style scoped></style>

组件B

<template>
  <div>
    用户名:
    <input type="text" name="" id="" />
    密码:
    <input type="password" name="" id="" />
  </div>
</template>

<script>
export default {}
</script>

<style></style>

将组件AB引入组件C

<template>
  <div>
    <h1>动态组件</h1>
    <button @click="comName = 'UserName'">点击1</button>
    <button @click="comName = 'UserInfo'">点击2</button>
    <div>
      <keep-alive>
        <component :is="comName"></component>
    </div>
    wwaq
  </div>
</template>

<script>
import UserName from './UserName.vue'
import UserInfo from './UserInfo.vue'
export default {
  data() {
    return {
      comName: 'UserName',
    }
  },
  methods: {},
  components: { UserName, UserInfo },
}
</script>

<style></style>

将组件C放入app.vue内

<template>
  <div>
    <UserDyName></UserDyName>
  </div>
</template>

<script>
import UserDyName from './components/UserDyName.vue'
export default {
  components: { UserDyName },
}
</script>

<style></style>

二、组件缓存

<keep-alive>组件可用动态缓存组件内的信息,切换组件后不会消失

用法:用keep-alive将component包裹起来,不会触发vue的生命周期,如果没有keep-alive切换之后则会直接销毁component内的内容

<template>
  <div>
    <h1>动态组件</h1>
    <button @click="comName = 'UserName'">点击1</button>
    <button @click="comName = 'UserInfo'">点击2</button>
    <div>
      <keep-alive>
        <component :is="comName"></component>
      </keep-alive>
    </div>
    wwaq
  </div>
</template>

<script>
import UserName from './UserName.vue'
import UserInfo from './UserInfo.vue'
export default {
  data() {
    return {
      comName: 'UserName',
    }
  },
  methods: {},
  components: { UserName, UserInfo },
}
</script>

<style></style>

<keep-alive>组件的两个生命周期activated和deactivated

用法:

<template>
  <div>
    用户名:
    <input type="text" name="" id="" />
    密码:
    <input type="password" name="" id="" />
  </div>
</template>

<script>
export default {
  created() {
    console.log('Name被创建了')
  },
  beforeDestroy() {
    console.log('Name被销毁了')
  },
  activated() {
    console.log('Name被激活了')
  },
  deactivated() {
    console.log('Name失去激活')
  },
}
</script>

<style></style>

三、组件插槽

  1. 用法:

  2. 组件内用<slot></slot>占位

  3. 使用组件时<Pannel></Pannel>夹着的地方, 传入标签替换slot

  4. 子组件引入:

  5. <template>
      <div>
        <!-- 按钮标题 -->
        <div class="title">
          <h4>芙蓉楼送辛渐</h4>
          <span class="btn" @click="isShow = !isShow">
            {{ isShow ? '收起' : '展开' }}
          </span>
        </div>
        <!-- 下拉内容 -->
        <div class="container" v-show="isShow">
          <slot></slot>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isShow: false,
        }
      },
    }
    </script>
    
    <style scoped>
    h3 {
      text-align: center;
    }
    
    .title {
      display: flex;
      justify-content: space-between;
      align-items: center;
      border: 1px solid #ccc;
      padding: 0 1em;
    }
    
    .title h4 {
      line-height: 2;
      margin: 0;
    }
    
    .container {
      border: 1px solid #ccc;
      padding: 0 1em;
    }
    
    .btn {
      /* 鼠标改成手的形状 */
      cursor: pointer;
    }
    
    img {
      width: 50%;
    }
    </style>
    

    父组件引入:

  6. <template>
      <div>
        <!-- <UserDyName></UserDyName> -->
        <Pannel>
          <p>寒雨连江夜入吴,</p>
          <p>平明送客楚山孤。</p>
          <p>洛阳亲友如相问,</p>
          <p>一片冰心在玉壶。</p>
        </Pannel>
        <Pannel>
          <div>
            <img
              src="图片地址"
              alt=""
            />
          </div>
        </Pannel>
        <Pannel></Pannel>
      </div>
    </template>
    
    <script>
    import UserDyName from './components/UserDyName.vue'
    import Pannel from './components/Pannel.vue'
    export default {
      components: { UserDyName, Pannel },
    }
    </script>
    
    <style></style>
    

     

  7. 四、默认插槽内容

  8. slot可以设置默认显示的属性,直接在slot内写入即可

        <div class="container" v-show="isShow">
          <slot> 我是默认的 </slot>
        </div>

    五、自定义插槽

  9. 用v-slot:组件名  绑定自定义组件(v-slot简写为#)

  10. 子组件通过slot标签的name属性创建一个值,父组件通过templat标签的v-slot属性接收

  11. 子组件

  12. <template>
      <div>
        <!-- 按钮标题 -->
        <div class="title">
          <!-- <h4>芙蓉楼送辛渐</h4> -->
          <slot name="title">默认头部</slot>
          <span class="btn" @click="isShow = !isShow">
            {{ isShow ? '收起' : '展开' }}
          </span>
        </div>
        <!-- 下拉内容 -->
        <div class="container" v-show="isShow">
          <slot name="content"> 默认内容 </slot>
        </div>
      </div>
    </template>
    

    父组件引用

  13. <template>
      <div>
        <!-- <UserDyName></UserDyName> -->
        <Pannel>
          <template #title>
            <h4>芙蓉楼送辛渐</h4>
          </template>
          <template #content>
            <p>寒雨连江夜入吴,</p>
            <p>平明送客楚山孤。</p>
            <p>洛阳亲友如相问,</p>
            <p>一片冰心在玉壶。</p>
          </template>
        </Pannel>
        <Pannel>
          <template #title>
            <h4>蕾姆</h4>
          </template>
          <template #content>
            <img
              src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F7a6e7684c7b3fc8acf90bedc3cbd1ba8106e85ba.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665547487&t=3214fe93ca0737750c9f6b5c909b734b"
              alt=""
            />
          </template>
        </Pannel>
        <Pannel></Pannel>
      </div>
    </template>
    
    <script>
    import UserDyName from './components/UserDyName.vue'
    import Pannel from './components/Pannel.vue'
    export default {
      components: { UserDyName, Pannel },
    }
    </script>
    
    <style></style>
    

    六、作用域组件

  14. 子组件内通过:row属性将要穿出的对象写入:row="defaultObj",父组件 v-slot="scope"属性接收子组件穿出的对象,再将值写入到标签内 {{ scope.row.defaultOne }}

  15. 子组件

    <template>
      <div>
        <!-- 按钮标题 -->
        <div class="title">
          <!-- <h4>芙蓉楼送辛渐</h4> -->
          <slot name="title">默认头部</slot>
          <span class="btn" @click="isShow = !isShow">
            {{ isShow ? '收起' : '展开' }}
          </span>
        </div>
        <!-- 下拉内容 -->
        <div class="container" v-show="isShow">
          <slot name="content"> 默认内容 </slot>
          <slot :row="defaultObj"></slot>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          isShow: false,
          defaultObj: {
            defaultOne: '无名氏',
            defaultTwo: '小传同学',
          },
        }
      },
    }
    </script>
    
    <style scoped>
    h3 {
      text-align: center;
    }
    
    .title {
      display: flex;
      justify-content: space-between;
      align-items: center;
      border: 1px solid #ccc;
      padding: 0 1em;
    }
    
    .title h4 {
      line-height: 2;
      margin: 0;
    }
    
    .container {
      border: 1px solid #ccc;
      padding: 0 1em;
    }
    
    .btn {
      /* 鼠标改成手的形状 */
      cursor: pointer;
    }
    
    img {
      width: 50%;
    }
    </style>
    

    父组件

  16. <template>
      <div>
        <!-- <UserDyName></UserDyName> -->
        <Pannel>
          <template #title>
            <h4>芙蓉楼送辛渐</h4>
          </template>
          <template #content>
            <p>寒雨连江夜入吴,</p>
            <p>平明送客楚山孤。</p>
            <p>洛阳亲友如相问,</p>
            <p>一片冰心在玉壶。</p>
          </template>
        </Pannel>
        <Pannel>
          <template #title>
            <h4>蕾姆</h4>
          </template>
          <template #content>
            <img
              src="https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fi0.hdslb.com%2Fbfs%2Farticle%2F7a6e7684c7b3fc8acf90bedc3cbd1ba8106e85ba.jpg&refer=http%3A%2F%2Fi0.hdslb.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665547487&t=3214fe93ca0737750c9f6b5c909b734b"
              alt=""
            />
          </template>
        </Pannel>
        <Pannel>
          <template v-slot="scope">
            <h1>
              {{ scope.row.defaultOne }}
            </h1>
            <h1>
              {{ scope.row.defaultTwo }}
            </h1>
          </template>
        </Pannel>
      </div>
    </template>
    
    <script>
    import UserDyName from './components/UserDyName.vue'
    import Pannel from './components/Pannel.vue'
    export default {
      components: { UserDyName, Pannel },
    }
    </script>
    
    <style></style>
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值