• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 数据传递与处理
2<!--Kit: ArkUI-->
3<!--Subsystem: ArkUI-->
4<!--Owner: @seaside_wu1-->
5<!--Designer: @shiyu_huang-->
6<!--Tester: @TerryTsao-->
7<!--Adviser: @HelloCrease-->
8
9
10## Props
11
12自定义组件可以通过props声明属性,父组件通过设置属性向子组件传递参数,props支持类型包括:String,Number,Boolean,Array,Object,Function。camelCase (驼峰命名法) 的 prop 名,在外部父组件传递参数时需要使用 kebab-case (短横线分隔命名) 形式,即当属性compProp在父组件引用时需要转换为comp-prop。给自定义组件添加props,通过父组件向下传递参数的示例如下:
13
14```html
15<!-- comp.hml -->
16<div class="item">
17   <text class="title-style">{{compProp}}</text>
18</div>
19```
20
21```js
22// comp.js
23export default {
24  props: ['compProp'],
25}
26```
27
28```html
29<!-- xxx.hml -->
30<element name='comp' src='../common/component/comp/comp.hml'></element>
31<div class="container">
32   <comp comp-prop="{{title}}"></comp>
33</div>
34```
35
36>  **说明:**
37>
38>  自定义属性命名时禁止以on、@、on:、grab: 等保留关键字为开头。
39
40### 添加默认值
41
42子组件可以通过固定值default设置默认值,当父组件没有设置该属性时,将使用其默认值。此情况下props属性必须为对象形式,不能用数组形式,示例如下:
43
44```html
45<!-- comp.hml -->
46<div class="item">
47   <text class="title-style">{{title}}</text>
48</div>
49```
50
51```js
52// comp.js
53export default {
54  props: {
55    title: {
56      default: 'title',
57    },
58  },
59}
60```
61
62本示例中加入了一个text组件显示标题,标题的内容是一个自定义属性,显示用户设置的标题内容,当用户没有设置时显示默认值title。在引用该组件时添加该属性的设置:
63
64```html
65<!-- xxx.hml -->
66<element name='comp' src='../common/component/comp/comp.hml'></element>
67<div class="container">
68   <comp title="自定义组件"></comp>
69</div>
70```
71
72### 数据单向性
73
74父子组件之间数据的传递是单向的,只能从父组件传递给子组件,子组件不能直接修改父组件传递下来的值,可以将props传入的值用data接收后作为默认值,再对data的值进行修改。
75
76```js
77// comp.js
78export default {
79  props: ['defaultCount'],
80  data() {
81    return {
82      count: this.defaultCount,
83    };
84  },
85  onClick() {
86    this.count = this.count + 1;
87  },
88}
89```
90
91### $watch感知数据改变
92
93如果需要观察组件中属性变化,可以通过$watch方法增加属性变化回调。使用方法如下:
94
95```js
96// comp.js
97export default {
98  props: ['title'],
99  onInit() {
100    this.$watch('title', 'onPropertyChange');
101  },
102  onPropertyChange(newV, oldV) {
103    console.info('title 属性变化 ' + newV + ' ' + oldV);
104  },
105}
106```
107
108
109## computed
110
111自定义组件中经常需要在读取或设置某个属性时进行预先处理,提高开发效率,此种情况就需要使用computed计算属性。computed字段中可通过设置属性的getter和setter方法在属性读写的时候进行触发,使用方式如下:
112
113```js
114// comp.js
115export default {
116  props: ['title'],
117  data() {
118    return {
119      objTitle: this.title,
120      time: 'Today',
121    };
122  },
123  computed: {
124    message() {
125      return this.time + ' ' + this.objTitle;
126    },
127    notice: {
128      get() {
129        return this.time;
130      },
131      set(newValue) {
132        this.time = newValue;
133      },
134    },
135  },
136  onClick() {
137    console.info('get click event ' + this.message);
138    this.notice = 'Tomorrow';
139  },
140}
141```
142
143这里声明的第一个计算属性message默认只有getter函数,message的值会取决于objTitle的值的变化。getter函数只能读取不能改变参数值,例如data中初始化定义的time,当需要赋值给计算属性的时候可以提供一个setter函数,如示例中的notice。