ui-js-custom-components.md 2.9 KB
Newer Older
Z
zengyawen 已提交
1
# 自定义组件
M
mamingshuai 已提交
2

Z
zengyawen 已提交
3
使用基于JS扩展的类Web开发范式的方舟开发框架支持自定义组件,用户可根据业务需求将已有的组件进行扩展,增加自定义的私有属性和事件,封装成新的组件,方便在工程中多次调用,提高页面布局代码的可读性。具体的封装方法示例如下:
M
mamingshuai 已提交
4 5


6
- 构建自定义组件
H
HelloCrease 已提交
7
  ```html
Z
zengyawen 已提交
8 9 10 11 12 13 14
  <!-- comp.hml -->
   <div class="item"> 
     <text class="title-style">{{title}}</text>
     <text class="text-style" onclick="childClicked" focusable="true">点击这里查看隐藏文本</text>
     <text class="text-style" if="{{showObj}}">hello world</text>
   </div>
  ```
M
mamingshuai 已提交
15

H
HelloCrease 已提交
16
  ```css
Z
zengyawen 已提交
17 18 19 20 21 22 23 24 25
  /* comp.css */
   .item { 
     width: 700px;  
     flex-direction: column;  
     height: 300px;  
     align-items: center;  
     margin-top: 100px; 
   }
   .text-style {
Z
zengyawen 已提交
26
     width: 100%;
Z
zengyawen 已提交
27 28 29 30 31 32 33 34 35 36 37 38
     text-align: center;
     font-weight: 500;
     font-family: Courier;
     font-size: 36px;
   }
   .title-style {
     font-weight: 500;
     font-family: Courier;
     font-size: 50px;
     color: #483d8b;
   }
  ```
M
mamingshuai 已提交
39

H
HelloCrease 已提交
40
  ```js
Z
zengyawen 已提交
41 42 43 44 45
  // comp.js
   export default {
     props: {
       title: {
         default: 'title',
M
mamingshuai 已提交
46
       },
Z
zengyawen 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59
       showObject: {},
     },
     data() { 
       return {
         showObj: this.showObject,
       };
     }, 
     childClicked () { 
       this.$emit('eventType1', {text: '收到子组件参数'});
       this.showObj = !this.showObj; 
     }, 
   }
  ```
M
mamingshuai 已提交
60

61
- 引入自定义组件
H
HelloCrease 已提交
62
  ```html
Z
zengyawen 已提交
63 64 65 66 67 68 69
  <!-- xxx.hml -->
   <element name='comp' src='../../common/component/comp.hml'></element> 
   <div class="container"> 
     <text>父组件:{{text}}</text>
     <comp title="自定义组件" show-object="{{isShow}}" @event-type1="textClicked"></comp>
   </div>
  ```
M
mamingshuai 已提交
70

H
HelloCrease 已提交
71
  ```css
Z
zengyawen 已提交
72 73 74 75 76 77 78 79
  /* xxx.css */
   .container { 
     background-color: #f8f8ff; 
     flex: 1; 
     flex-direction: column; 
     align-content: center;
   } 
  ```
M
mamingshuai 已提交
80

H
HelloCrease 已提交
81
  ```js
Z
zengyawen 已提交
82 83 84 85
  // xxx.js
   export default { 
     data: {
       text: '开始',
Z
zengyawen 已提交
86
       isShow: false,
Z
zengyawen 已提交
87 88 89 90 91 92
     },
     textClicked (e) {
       this.text = e.detail.text;
     },
   }
  ```
M
mamingshuai 已提交
93 94


Z
zengyawen 已提交
95
本示例中父组件通过添加自定义属性向子组件传递了名称为title的参数,子组件在props中接收。同时子组件也通过事件绑定向上传递了参数text,接收时通过e.detail获取。要绑定子组件事件,父组件事件命名必须遵循事件绑定规则,详见[自定义组件开发规范](../reference/arkui-js/js-components-custom-basic-usage.md)。自定义组件效果如下图所示:
M
mamingshuai 已提交
96 97


Z
zengyawen 已提交
98
**图1** 自定义组件的效果
Z
zengyawen 已提交
99
![zh-cn_image_0000001070693737](figures/zh-cn_image_0000001070693737.png)
100 101 102 103 104 105


## 相关实例

针对自定义组件开发,有以下相关实例可供参考:

106
- [`JSUICustomComponent`:自定义组件(JS)(API8)](https://gitee.com/openharmony/app_samples/tree/master/UI/JSUICustomComponent)
107

108
- [自定义组件(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/JSUI/JSCanvasComponet)