• HarmonyOS应用开发:鸿蒙自定义组件slot插槽,体现的更强大!


    鸿蒙除了了基础组件,容器组件,高级组件,还有自定义组件,自定义组件可以将已有的组件组合,封装成新的组件,在工程中被多次调用,从而提高代码的可读性。

    slot插槽的使用可以让自定义组件承载父组件中定义的内容,使用slot标签可以更加灵活的控制自定义组件的内容元素。

    场景:

     子组件中定义 具名插槽 ,通过对插槽命名的方式进行区分,当填充插槽内容时,通过声明插槽名称,将父组件中定义的内容加到对应的插槽中。

    实现一个登录效果和list列表展示(后面做应用首页,实现一个完整项目)。

    下面我们开始今天的文章,还是老规矩,通过如下几点来说:

    1,实现思路

    2,代码解析

    3,实现效果

    3,总结


    一,实现思路
    添加一个子组件定义两个具名插槽 slot 用来承载父组件中的定义内容,插槽1中实现一个简单登录界面,插槽2中实现一个列表展示。

    二,代码解析


    子组件:

    1,hml文件
    添加两个具名插槽 content和content2,用于承载父组件的内容

    1. <div id="drawer-container" class="drawer-container" on:touchstart="onTouchStart"
    2. on:touchmove="onTouchMove" on:touchend="onTouchEnd">
    3. <div class="drawer-content" >
    4. <slot name="content">slot>
    5. div>
    6. <stack class="drawer-content2">
    7. <slot name="content2">slot>
    8. stack>
    9. div>


    2,css文件

    1. .drawer-container {
    2. width: 100%;
    3. height: 100%;
    4. flex-direction: column;
    5. }
    6. .drawer-content {
    7. width: 100%;
    8. height: 100%;
    9. background-color: white;
    10. }
    11. .drawer-content2 {
    12. width: 100%;
    13. height: 100%;
    14. }

    父组件

    1,hml文件

    1. <element name='drawer' src='../sideslipcontent/sideslipcontent.hml'>element>
    2. <div class="container">
    3. <drawer>
    4. <div slot='content' class="content-layout">
    5. <text>登录text>
    6. <input class="input" type="text" placeholder="请输入账号...">input>
    7. <input class="input" type="password" placeholder="请输入密码...">input>
    8. <button class="button" onclick="butClick">登录button>
    9. div>
    10. <div slot='content2' class="menu-layout">
    11. <div class="my-info">
    12. <text>个人中心text>
    13. div>
    14. <div>
    15. <list scrollbar="on">
    16. <list-item for="{{listData}}" class="list-container"
    17. onclick="listClock({{$item.name}})">
    18. <text>{{$item.name}}text>
    19. list-item>
    20. list>
    21. div>
    22. div>
    23. drawer>
    24. div>

    2,css文件

    1. .container {
    2. width: 100%;
    3. height: 100%;
    4. }
    5. .content-layout {
    6. flex-direction: column;
    7. width: 100%;
    8. justify-content: flex-start;
    9. align-items: center;
    10. }
    11. .content-layout text {
    12. width: 100%;
    13. text-align: center;
    14. font-size: 20px;
    15. padding: 10px;
    16. font-weight: bold;
    17. background-color: darkgray;
    18. }
    19. .input{
    20. margin: 10px;
    21. }
    22. .button{
    23. width: 150px;
    24. padding: 10px;
    25. margin-top: 20px;
    26. font-size: 20px;
    27. }
    28. .menu-layout {
    29. flex-direction: column;
    30. width: 100%;
    31. height: 100%;
    32. background-color: #ffffff;
    33. border-right: 1px solid #eeeded;
    34. }
    35. .my-info {
    36. flex-direction: column;
    37. width: 100%;
    38. height: 70px;
    39. justify-content: center;
    40. align-items: center;
    41. border-bottom: 1px solid #fd3f3f;
    42. background-color: chocolate;
    43. }
    44. .my-info text {
    45. color: #ffffff;
    46. font-size: 20px;
    47. }
    48. .list-container{
    49. padding: 15px;
    50. border-bottom: 1px #000000;
    51. }
    52. .list-container text{
    53. font-size: 20px;
    54. }


    3,js文件

    1. import prompt from '@system.prompt';
    2. export default {
    3. data: {
    4. title: 'World',
    5. listData:[
    6. {
    7. 'id': 0,
    8. 'name': '消息',
    9. 'icon': '/common/images/message.png',
    10. },
    11. {
    12. 'id': 1,
    13. 'name': '收藏',
    14. 'icon': '/common/images/collect.png',
    15. },
    16. {
    17. 'id': 2,
    18. 'name': '密码',
    19. 'icon': '/common/images/password.png',
    20. },
    21. {
    22. 'id': 3,
    23. 'name': '反馈',
    24. 'icon': '/common/images/feedback.png',
    25. },
    26. {
    27. 'id': 4,
    28. 'name': '设置',
    29. 'icon': '/common/images/setting.png',
    30. }]
    31. },
    32. listClock(name){
    33. prompt.showToast({
    34. message:name,
    35. duration:3000
    36. })
    37. },
    38. butClick(){
    39. prompt.showToast({
    40. message:"登录成功!",
    41. duration:3000
    42. })
    43. }
    44. }

    三,实现效果

    四,总结

    slot插槽

    自定义组件中通过slot标签来承载父组件中定义的内容,使用slot标签可以更加灵活的控制自定义组件的内容元素


    具名插槽
    当自定义组件中需要使用多个插槽时,可通过对插槽命名的方式进行区分,当填充插槽内容时,通过声明插槽名称,将内容加到对应的插槽中。

    生命周期

    鸿蒙为自定义组件提供了一系列生命周期回调方法,
    包括:onInit,onAttached,onDetached,onLayoutReady,onDestroy,onPageShow和onPageHide。


    说明:

    onInit  初始化自定义组件   自定义组件初始化生命周期回调,当自定义组件创建时,触发该回调,主要用于自定义组件中必须使用的数据初始化,该回调只会触发一次调用。

    onAttached  自定义组件装载    自定义组件被创建后,加入到Page组件树时,触发该回调,该回调触发时,表示组件将被进行显示,该生命周期可用于初始化显示相关数据,通常用于加载图片资源、开始执行动画等场景。

    onLayoutReady   自定义组件布局完成  自定义组件插入Page组件树后,将会对自定义组件进行布局计算,调整其内容元素尺寸与位置,当布局计算结束后触发该回调。

    onDetached   自定义组件摘除    自定义组件摘除时,触发该回调,常用于停止动画或异步逻辑停止执行的场景。
    onDestroy   自定义组件销毁    自定义组件销毁时,触发该回调,常用于资源释放。
    onPageShow  自定义组件Page显示    自定义组件所在Page显示后,触发该回调。
    onPageHide  自定义组件Page隐藏    自定义组件所在Page隐藏后,触发该回调。

    原创不易,有用就关注一下。要是帮到了你 就给个点赞吧,多谢支持。

    觉得不错的小伙伴,记得帮我 点个赞和关注哟,笔芯笔芯~**

    有问题请留言或者私信,可以 WX搜索公众号:程序员漫话编程

  • 相关阅读:
    JVM 垃圾回收机制(可达性分析、引用计数)
    什么是大数据测试?有哪些类型?应该怎么测?
    全新版互联网大厂面试题,分类65份PDF,累计2000页
    【HDFS】Quorum-Journal Design;QJM设计文档主干翻译+理解
    PMP考试多少分算通过?
    QT 状态机的使用
    微服务之流量控制
    python——numpy库函数详解
    hdlbits系列verilog解答(always块casez语句)-35
    Docker搭建RabbitMQ+HAProxy
  • 原文地址:https://blog.csdn.net/jianpengxuexikaifa/article/details/126168499