1e41f4b71Sopenharmony_ci# if/else:条件渲染
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci
4e41f4b71Sopenharmony_ciArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态,使用if、else和else if渲染对应状态下的UI内容。
5e41f4b71Sopenharmony_ci
6e41f4b71Sopenharmony_ci> **说明:**
7e41f4b71Sopenharmony_ci>
8e41f4b71Sopenharmony_ci> 从API version 9开始,该接口支持在ArkTS卡片中使用。
9e41f4b71Sopenharmony_ci
10e41f4b71Sopenharmony_ci## 使用规则
11e41f4b71Sopenharmony_ci
12e41f4b71Sopenharmony_ci- 支持if、else和else if语句。
13e41f4b71Sopenharmony_ci
14e41f4b71Sopenharmony_ci- if、else if后跟随的条件语句可以使用状态变量或者常规变量(状态变量:值的改变可以实时渲染UI,常规变量:值的改变不会实时渲染UI)。
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_ci- 允许在容器组件内使用,通过条件渲染语句构建不同的子组件。
17e41f4b71Sopenharmony_ci
18e41f4b71Sopenharmony_ci- 条件渲染语句在涉及到组件的父子关系时是“透明”的,当父组件和子组件之间存在一个或多个if语句时,必须遵守父组件关于子组件使用的规则。
19e41f4b71Sopenharmony_ci
20e41f4b71Sopenharmony_ci- 每个分支内部的构建函数必须遵循构建函数的规则,并创建一个或多个组件。无法创建组件的空构建函数会产生语法错误。
21e41f4b71Sopenharmony_ci
22e41f4b71Sopenharmony_ci- 某些容器组件限制子组件的类型或数量,将条件渲染语句用于这些组件内时,这些限制将同样应用于条件渲染语句内创建的组件。例如,[Grid](../reference/apis-arkui/arkui-ts/ts-container-grid.md)容器组件的子组件仅支持[GridItem](../reference/apis-arkui/arkui-ts/ts-container-griditem.md)组件,在Grid内使用条件渲染语句时,条件渲染语句内仅允许使用GridItem组件。
23e41f4b71Sopenharmony_ci
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci## 更新机制
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci当if、else if后跟随的状态判断中使用的状态变量值变化时,条件渲染语句会进行更新,更新步骤如下:
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci1. 评估if和else if的状态判断条件,如果分支没有变化,无需执行以下步骤。如果分支有变化,则执行2、3步骤:
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci2. 删除此前构建的所有子组件。
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ci3. 执行新分支的构造函数,将获取到的组件添加到if父容器中。如果缺少适用的else分支,则不构建任何内容。
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci条件可以包括Typescript表达式。对于构造函数中的表达式,此类表达式不得更改应用程序状态。
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci
38e41f4b71Sopenharmony_ci## 使用场景
39e41f4b71Sopenharmony_ci
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci### 使用if进行条件渲染
42e41f4b71Sopenharmony_ci
43e41f4b71Sopenharmony_ci
44e41f4b71Sopenharmony_ci```ts
45e41f4b71Sopenharmony_ci@Entry
46e41f4b71Sopenharmony_ci@Component
47e41f4b71Sopenharmony_cistruct ViewA {
48e41f4b71Sopenharmony_ci  @State count: number = 0;
49e41f4b71Sopenharmony_ci
50e41f4b71Sopenharmony_ci  build() {
51e41f4b71Sopenharmony_ci    Column() {
52e41f4b71Sopenharmony_ci      Text(`count=${this.count}`)
53e41f4b71Sopenharmony_ci
54e41f4b71Sopenharmony_ci      if (this.count > 0) {
55e41f4b71Sopenharmony_ci        Text(`count is positive`)
56e41f4b71Sopenharmony_ci          .fontColor(Color.Green)
57e41f4b71Sopenharmony_ci      }
58e41f4b71Sopenharmony_ci
59e41f4b71Sopenharmony_ci      Button('increase count')
60e41f4b71Sopenharmony_ci        .onClick(() => {
61e41f4b71Sopenharmony_ci          this.count++;
62e41f4b71Sopenharmony_ci        })
63e41f4b71Sopenharmony_ci
64e41f4b71Sopenharmony_ci      Button('decrease count')
65e41f4b71Sopenharmony_ci        .onClick(() => {
66e41f4b71Sopenharmony_ci          this.count--;
67e41f4b71Sopenharmony_ci        })
68e41f4b71Sopenharmony_ci    }
69e41f4b71Sopenharmony_ci  }
70e41f4b71Sopenharmony_ci}
71e41f4b71Sopenharmony_ci```
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ciif语句的每个分支都包含一个构建函数。此类构建函数必须创建一个或多个子组件。在初始渲染时,if语句会执行构建函数,并将生成的子组件添加到其父组件中。
74e41f4b71Sopenharmony_ci
75e41f4b71Sopenharmony_ci每当if或else if条件语句中使用的状态变量发生变化时,条件语句都会更新并重新评估新的条件值。如果条件值评估发生了变化,这意味着需要构建另一个条件分支。此时ArkUI框架将:
76e41f4b71Sopenharmony_ci
77e41f4b71Sopenharmony_ci1. 删除所有以前渲染的(早期分支的)组件。
78e41f4b71Sopenharmony_ci
79e41f4b71Sopenharmony_ci2. 执行新分支的构造函数,将生成的子组件添加到其父组件中。
80e41f4b71Sopenharmony_ci
81e41f4b71Sopenharmony_ci在以上示例中,如果count从0增加到1,那么if语句更新,条件count > 0将重新评估,评估结果将从false更改为true。因此,将执行条件为真分支的构造函数,创建一个Text组件,并将它添加到父组件Column中。如果后续count更改为0,则Text组件将从Column组件中删除。由于没有else分支,因此不会执行新的构造函数。
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ci
84e41f4b71Sopenharmony_ci### if ... else ...语句和子组件状态
85e41f4b71Sopenharmony_ci
86e41f4b71Sopenharmony_ci以下示例包含if ... else ...语句与拥有\@State装饰变量的子组件。
87e41f4b71Sopenharmony_ci
88e41f4b71Sopenharmony_ci
89e41f4b71Sopenharmony_ci```ts
90e41f4b71Sopenharmony_ci@Component
91e41f4b71Sopenharmony_cistruct CounterView {
92e41f4b71Sopenharmony_ci  @State counter: number = 0;
93e41f4b71Sopenharmony_ci  label: string = 'unknown';
94e41f4b71Sopenharmony_ci
95e41f4b71Sopenharmony_ci  build() {
96e41f4b71Sopenharmony_ci    Column({ space: 20 }) {
97e41f4b71Sopenharmony_ci      Text(`${this.label}`)
98e41f4b71Sopenharmony_ci      Button(`counter ${this.counter} +1`)
99e41f4b71Sopenharmony_ci        .onClick(() => {
100e41f4b71Sopenharmony_ci          this.counter += 1;
101e41f4b71Sopenharmony_ci        })
102e41f4b71Sopenharmony_ci    }
103e41f4b71Sopenharmony_ci    .margin(10)
104e41f4b71Sopenharmony_ci    .padding(10)
105e41f4b71Sopenharmony_ci    .border({ width: 1 })
106e41f4b71Sopenharmony_ci  }
107e41f4b71Sopenharmony_ci}
108e41f4b71Sopenharmony_ci
109e41f4b71Sopenharmony_ci@Entry
110e41f4b71Sopenharmony_ci@Component
111e41f4b71Sopenharmony_cistruct MainView {
112e41f4b71Sopenharmony_ci  @State toggle: boolean = true;
113e41f4b71Sopenharmony_ci
114e41f4b71Sopenharmony_ci  build() {
115e41f4b71Sopenharmony_ci    Column() {
116e41f4b71Sopenharmony_ci      if (this.toggle) {
117e41f4b71Sopenharmony_ci        CounterView({ label: 'CounterView #positive' })
118e41f4b71Sopenharmony_ci      } else {
119e41f4b71Sopenharmony_ci        CounterView({ label: 'CounterView #negative' })
120e41f4b71Sopenharmony_ci      }
121e41f4b71Sopenharmony_ci      Button(`toggle ${this.toggle}`)
122e41f4b71Sopenharmony_ci        .onClick(() => {
123e41f4b71Sopenharmony_ci          this.toggle = !this.toggle;
124e41f4b71Sopenharmony_ci        })
125e41f4b71Sopenharmony_ci    }
126e41f4b71Sopenharmony_ci    .width('100%')
127e41f4b71Sopenharmony_ci    .justifyContent(FlexAlign.Center)
128e41f4b71Sopenharmony_ci  }
129e41f4b71Sopenharmony_ci}
130e41f4b71Sopenharmony_ci```
131e41f4b71Sopenharmony_ci
132e41f4b71Sopenharmony_ciCounterView(label为 'CounterView \#positive')子组件在初次渲染时创建。此子组件携带名为counter的状态变量。当修改CounterView.counter状态变量时,CounterView(label为 'CounterView \#positive')子组件重新渲染并保留状态变量值。当MainView.toggle状态变量的值更改为false时,MainView父组件内的if语句将更新,随后将删除CounterView(label为 'CounterView \#positive')子组件。与此同时,将创建新的CounterView(label为 'CounterView \#negative')实例。而它自己的counter状态变量设置为初始值0。
133e41f4b71Sopenharmony_ci
134e41f4b71Sopenharmony_ci> **说明:**
135e41f4b71Sopenharmony_ci>
136e41f4b71Sopenharmony_ci> CounterView(label为 'CounterView \#positive')和CounterView(label为 'CounterView \#negative')是同一自定义组件的两个不同实例。if分支的更改,不会更新现有子组件,也不会保留状态。
137e41f4b71Sopenharmony_ci
138e41f4b71Sopenharmony_ci以下示例展示了条件更改时,若需要保留counter值所做的修改。
139e41f4b71Sopenharmony_ci
140e41f4b71Sopenharmony_ci
141e41f4b71Sopenharmony_ci```ts
142e41f4b71Sopenharmony_ci@Component
143e41f4b71Sopenharmony_cistruct CounterView {
144e41f4b71Sopenharmony_ci  @Link counter: number;
145e41f4b71Sopenharmony_ci  label: string = 'unknown';
146e41f4b71Sopenharmony_ci
147e41f4b71Sopenharmony_ci  build() {
148e41f4b71Sopenharmony_ci    Column({ space: 20 }) {
149e41f4b71Sopenharmony_ci      Text(`${this.label}`)
150e41f4b71Sopenharmony_ci        .fontSize(20)
151e41f4b71Sopenharmony_ci      Button(`counter ${this.counter} +1`)
152e41f4b71Sopenharmony_ci        .onClick(() => {
153e41f4b71Sopenharmony_ci          this.counter += 1;
154e41f4b71Sopenharmony_ci        })
155e41f4b71Sopenharmony_ci    }
156e41f4b71Sopenharmony_ci    .margin(10)
157e41f4b71Sopenharmony_ci    .padding(10)
158e41f4b71Sopenharmony_ci    .border({ width: 1 })
159e41f4b71Sopenharmony_ci  }
160e41f4b71Sopenharmony_ci}
161e41f4b71Sopenharmony_ci
162e41f4b71Sopenharmony_ci@Entry
163e41f4b71Sopenharmony_ci@Component
164e41f4b71Sopenharmony_cistruct MainView {
165e41f4b71Sopenharmony_ci  @State toggle: boolean = true;
166e41f4b71Sopenharmony_ci  @State counter: number = 0;
167e41f4b71Sopenharmony_ci
168e41f4b71Sopenharmony_ci  build() {
169e41f4b71Sopenharmony_ci    Column() {
170e41f4b71Sopenharmony_ci      if (this.toggle) {
171e41f4b71Sopenharmony_ci        CounterView({ counter: $counter, label: 'CounterView #positive' })
172e41f4b71Sopenharmony_ci      } else {
173e41f4b71Sopenharmony_ci        CounterView({ counter: $counter, label: 'CounterView #negative' })
174e41f4b71Sopenharmony_ci      }
175e41f4b71Sopenharmony_ci      Button(`toggle ${this.toggle}`)
176e41f4b71Sopenharmony_ci        .onClick(() => {
177e41f4b71Sopenharmony_ci          this.toggle = !this.toggle;
178e41f4b71Sopenharmony_ci        })
179e41f4b71Sopenharmony_ci    }
180e41f4b71Sopenharmony_ci    .width('100%')
181e41f4b71Sopenharmony_ci    .justifyContent(FlexAlign.Center)
182e41f4b71Sopenharmony_ci  }
183e41f4b71Sopenharmony_ci}
184e41f4b71Sopenharmony_ci```
185e41f4b71Sopenharmony_ci
186e41f4b71Sopenharmony_ci此处,\@State counter变量归父组件所有。因此,当CounterView组件实例被删除时,该变量不会被销毁。CounterView组件通过\@Link装饰器引用状态。状态必须从子级移动到其父级(或父级的父级),以避免在条件内容或重复内容被销毁时丢失状态。
187e41f4b71Sopenharmony_ci
188e41f4b71Sopenharmony_ci
189e41f4b71Sopenharmony_ci### 嵌套if语句
190e41f4b71Sopenharmony_ci
191e41f4b71Sopenharmony_ci条件语句的嵌套对父组件的相关规则没有影响。
192e41f4b71Sopenharmony_ci
193e41f4b71Sopenharmony_ci
194e41f4b71Sopenharmony_ci```ts
195e41f4b71Sopenharmony_ci@Entry
196e41f4b71Sopenharmony_ci@Component
197e41f4b71Sopenharmony_cistruct CompA {
198e41f4b71Sopenharmony_ci  @State toggle: boolean = false;
199e41f4b71Sopenharmony_ci  @State toggleColor: boolean = false;
200e41f4b71Sopenharmony_ci
201e41f4b71Sopenharmony_ci  build() {
202e41f4b71Sopenharmony_ci    Column({ space: 20 }) {
203e41f4b71Sopenharmony_ci      Text('Before')
204e41f4b71Sopenharmony_ci        .fontSize(15)
205e41f4b71Sopenharmony_ci      if (this.toggle) {
206e41f4b71Sopenharmony_ci        Text('Top True, positive 1 top')
207e41f4b71Sopenharmony_ci          .backgroundColor('#aaffaa').fontSize(20)
208e41f4b71Sopenharmony_ci        // 内部if语句
209e41f4b71Sopenharmony_ci        if (this.toggleColor) {
210e41f4b71Sopenharmony_ci          Text('Top True, Nested True, positive COLOR  Nested ')
211e41f4b71Sopenharmony_ci            .backgroundColor('#00aaaa').fontSize(15)
212e41f4b71Sopenharmony_ci        } else {
213e41f4b71Sopenharmony_ci          Text('Top True, Nested False, Negative COLOR  Nested ')
214e41f4b71Sopenharmony_ci            .backgroundColor('#aaaaff').fontSize(15)
215e41f4b71Sopenharmony_ci        }
216e41f4b71Sopenharmony_ci      } else {
217e41f4b71Sopenharmony_ci        Text('Top false, negative top level').fontSize(20)
218e41f4b71Sopenharmony_ci          .backgroundColor('#ffaaaa')
219e41f4b71Sopenharmony_ci        if (this.toggleColor) {
220e41f4b71Sopenharmony_ci          Text('positive COLOR  Nested ')
221e41f4b71Sopenharmony_ci            .backgroundColor('#00aaaa').fontSize(15)
222e41f4b71Sopenharmony_ci        } else {
223e41f4b71Sopenharmony_ci          Text('Negative COLOR  Nested ')
224e41f4b71Sopenharmony_ci            .backgroundColor('#aaaaff').fontSize(15)
225e41f4b71Sopenharmony_ci        }
226e41f4b71Sopenharmony_ci      }
227e41f4b71Sopenharmony_ci      Text('After')
228e41f4b71Sopenharmony_ci        .fontSize(15)
229e41f4b71Sopenharmony_ci      Button('Toggle Outer')
230e41f4b71Sopenharmony_ci        .onClick(() => {
231e41f4b71Sopenharmony_ci          this.toggle = !this.toggle;
232e41f4b71Sopenharmony_ci        })
233e41f4b71Sopenharmony_ci      Button('Toggle Inner')
234e41f4b71Sopenharmony_ci        .onClick(() => {
235e41f4b71Sopenharmony_ci          this.toggleColor = !this.toggleColor;
236e41f4b71Sopenharmony_ci        })
237e41f4b71Sopenharmony_ci    }
238e41f4b71Sopenharmony_ci    .width('100%')
239e41f4b71Sopenharmony_ci    .justifyContent(FlexAlign.Center)
240e41f4b71Sopenharmony_ci  }
241e41f4b71Sopenharmony_ci}
242e41f4b71Sopenharmony_ci```
243e41f4b71Sopenharmony_ci
244e41f4b71Sopenharmony_ci## 常见问题
245e41f4b71Sopenharmony_ci
246e41f4b71Sopenharmony_ci### 动效场景下if分支切换保护失效
247e41f4b71Sopenharmony_ci
248e41f4b71Sopenharmony_ci在动画当中改变IfElse分支,而这个IfElse是用来做数据保护的,继续使用该分支会导致访问数据异常,然后造成crash。
249e41f4b71Sopenharmony_ci
250e41f4b71Sopenharmony_ci反例:
251e41f4b71Sopenharmony_ci
252e41f4b71Sopenharmony_ci
253e41f4b71Sopenharmony_ci```ts
254e41f4b71Sopenharmony_ciclass MyData {
255e41f4b71Sopenharmony_ci  str: string;
256e41f4b71Sopenharmony_ci  constructor(str: string) {
257e41f4b71Sopenharmony_ci    this.str = str;
258e41f4b71Sopenharmony_ci  }
259e41f4b71Sopenharmony_ci}
260e41f4b71Sopenharmony_ci@Entry
261e41f4b71Sopenharmony_ci@Component
262e41f4b71Sopenharmony_cistruct Index {
263e41f4b71Sopenharmony_ci  @State data1: MyData|undefined = new MyData("branch 0");
264e41f4b71Sopenharmony_ci  @State data2: MyData|undefined = new MyData("branch 1");
265e41f4b71Sopenharmony_ci
266e41f4b71Sopenharmony_ci  build() {
267e41f4b71Sopenharmony_ci    Column() {
268e41f4b71Sopenharmony_ci      if (this.data1) {
269e41f4b71Sopenharmony_ci        // 如果在动画中增加/删除,会给Text增加默认转场
270e41f4b71Sopenharmony_ci        // 对于删除时,增加默认透明度转场后,会延长组件的生命周期,Text组件没有真正删除,而是等转场动画做完后才删除
271e41f4b71Sopenharmony_ci        Text(this.data1.str)
272e41f4b71Sopenharmony_ci      } else if (this.data2) {
273e41f4b71Sopenharmony_ci        // 如果在动画中增加/删除,会给Text增加默认转场
274e41f4b71Sopenharmony_ci        Text(this.data2.str)
275e41f4b71Sopenharmony_ci      }
276e41f4b71Sopenharmony_ci
277e41f4b71Sopenharmony_ci      Button("play with animation")
278e41f4b71Sopenharmony_ci        .onClick(() => {
279e41f4b71Sopenharmony_ci          animateTo({}, ()=>{
280e41f4b71Sopenharmony_ci            // 在animateTo中修改if条件,在动画当中,会给if下的第一层组件默认转场
281e41f4b71Sopenharmony_ci            if (this.data1) {
282e41f4b71Sopenharmony_ci              this.data1 = undefined;
283e41f4b71Sopenharmony_ci              this.data2 = new MyData("branch 1");
284e41f4b71Sopenharmony_ci            } else {
285e41f4b71Sopenharmony_ci              this.data1 = new MyData("branch 0");
286e41f4b71Sopenharmony_ci              this.data2 = undefined;
287e41f4b71Sopenharmony_ci            }
288e41f4b71Sopenharmony_ci          })
289e41f4b71Sopenharmony_ci        })
290e41f4b71Sopenharmony_ci
291e41f4b71Sopenharmony_ci      Button("play directlp")
292e41f4b71Sopenharmony_ci        .onClick(() => {
293e41f4b71Sopenharmony_ci          // 直接改if条件,不在动画当中,可以正常切换,也不会加默认转场
294e41f4b71Sopenharmony_ci          if (this.data1) {
295e41f4b71Sopenharmony_ci            this.data1 = undefined;
296e41f4b71Sopenharmony_ci            this.data2 = new MyData("branch 1");
297e41f4b71Sopenharmony_ci          } else {
298e41f4b71Sopenharmony_ci            this.data1 = new MyData("branch 0");
299e41f4b71Sopenharmony_ci            this.data2 = undefined;
300e41f4b71Sopenharmony_ci          }
301e41f4b71Sopenharmony_ci        })
302e41f4b71Sopenharmony_ci    }.width("100%")
303e41f4b71Sopenharmony_ci    .padding(10)
304e41f4b71Sopenharmony_ci  }
305e41f4b71Sopenharmony_ci}
306e41f4b71Sopenharmony_ci```
307e41f4b71Sopenharmony_ci
308e41f4b71Sopenharmony_ci正例:
309e41f4b71Sopenharmony_ci
310e41f4b71Sopenharmony_ci方式1:给数据继续加判空的保护,即在使用data时再加一层判空,即"Text(this.data1?.str)"。
311e41f4b71Sopenharmony_ci
312e41f4b71Sopenharmony_ci
313e41f4b71Sopenharmony_ci```ts
314e41f4b71Sopenharmony_ciclass MyData {
315e41f4b71Sopenharmony_ci  str: string;
316e41f4b71Sopenharmony_ci  constructor(str: string) {
317e41f4b71Sopenharmony_ci    this.str = str;
318e41f4b71Sopenharmony_ci  }
319e41f4b71Sopenharmony_ci}
320e41f4b71Sopenharmony_ci@Entry
321e41f4b71Sopenharmony_ci@Component
322e41f4b71Sopenharmony_cistruct Index {
323e41f4b71Sopenharmony_ci  @State data1: MyData|undefined = new MyData("branch 0");
324e41f4b71Sopenharmony_ci  @State data2: MyData|undefined = new MyData("branch 1");
325e41f4b71Sopenharmony_ci
326e41f4b71Sopenharmony_ci  build() {
327e41f4b71Sopenharmony_ci    Column() {
328e41f4b71Sopenharmony_ci      if (this.data1) {
329e41f4b71Sopenharmony_ci        // 如果在动画中增加/删除,会给Text增加默认转场
330e41f4b71Sopenharmony_ci        // 对于删除时,增加默认透明度转场后,会延长组件的生命周期,Text组件没有真正删除,而是等转场动画做完后才删除
331e41f4b71Sopenharmony_ci        // 在使用数据时再加一层判空保护,如果data1存在才去使用data1当中的str
332e41f4b71Sopenharmony_ci        Text(this.data1?.str)
333e41f4b71Sopenharmony_ci      } else if (this.data2) {
334e41f4b71Sopenharmony_ci        // 如果在动画中增加/删除,会给Text增加默认转场
335e41f4b71Sopenharmony_ci        // 在使用数据时再加一层判空保护
336e41f4b71Sopenharmony_ci        Text(this.data2?.str)
337e41f4b71Sopenharmony_ci      }
338e41f4b71Sopenharmony_ci
339e41f4b71Sopenharmony_ci      Button("play with animation")
340e41f4b71Sopenharmony_ci        .onClick(() => {
341e41f4b71Sopenharmony_ci          animateTo({}, ()=>{
342e41f4b71Sopenharmony_ci            // 在animateTo中修改if条件,在动画当中,会给if下的第一层组件默认转场
343e41f4b71Sopenharmony_ci            if (this.data1) {
344e41f4b71Sopenharmony_ci              this.data1 = undefined;
345e41f4b71Sopenharmony_ci              this.data2 = new MyData("branch 1");
346e41f4b71Sopenharmony_ci            } else {
347e41f4b71Sopenharmony_ci              this.data1 = new MyData("branch 0");
348e41f4b71Sopenharmony_ci              this.data2 = undefined;
349e41f4b71Sopenharmony_ci            }
350e41f4b71Sopenharmony_ci          })
351e41f4b71Sopenharmony_ci        })
352e41f4b71Sopenharmony_ci    }.width("100%")
353e41f4b71Sopenharmony_ci    .padding(10)
354e41f4b71Sopenharmony_ci  }
355e41f4b71Sopenharmony_ci}
356e41f4b71Sopenharmony_ci```
357e41f4b71Sopenharmony_ci
358e41f4b71Sopenharmony_ci方式2:给IfElse下直接要被删除的组件显示的添加transition(TransitionEffect.IDENTITY)属性,避免系统添加默认转场。
359e41f4b71Sopenharmony_ci
360e41f4b71Sopenharmony_ci
361e41f4b71Sopenharmony_ci```ts
362e41f4b71Sopenharmony_ciclass MyData {
363e41f4b71Sopenharmony_ci  str: string;
364e41f4b71Sopenharmony_ci  constructor(str: string) {
365e41f4b71Sopenharmony_ci    this.str = str;
366e41f4b71Sopenharmony_ci  }
367e41f4b71Sopenharmony_ci}
368e41f4b71Sopenharmony_ci@Entry
369e41f4b71Sopenharmony_ci@Component
370e41f4b71Sopenharmony_cistruct Index {
371e41f4b71Sopenharmony_ci  @State data1: MyData|undefined = new MyData("branch 0");
372e41f4b71Sopenharmony_ci  @State data2: MyData|undefined = new MyData("branch 1");
373e41f4b71Sopenharmony_ci
374e41f4b71Sopenharmony_ci  build() {
375e41f4b71Sopenharmony_ci    Column() {
376e41f4b71Sopenharmony_ci      if (this.data1) {
377e41f4b71Sopenharmony_ci        // 在IfElse的根组件显示指定空的转场效果,避免默认转场动画
378e41f4b71Sopenharmony_ci        Text(this.data1.str)
379e41f4b71Sopenharmony_ci          .transition(TransitionEffect.IDENTITY)
380e41f4b71Sopenharmony_ci      } else if (this.data2) {
381e41f4b71Sopenharmony_ci        // 在IfElse的根组件显示指定空的转场效果,避免默认转场动画
382e41f4b71Sopenharmony_ci        Text(this.data2.str)
383e41f4b71Sopenharmony_ci          .transition(TransitionEffect.IDENTITY)
384e41f4b71Sopenharmony_ci      }
385e41f4b71Sopenharmony_ci
386e41f4b71Sopenharmony_ci      Button("play with animation")
387e41f4b71Sopenharmony_ci        .onClick(() => {
388e41f4b71Sopenharmony_ci          animateTo({}, ()=>{
389e41f4b71Sopenharmony_ci            // 在animateTo中修改if条件,在动画当中,会给if下的第一层组件默认转场
390e41f4b71Sopenharmony_ci            // 但由于已经显示指定转场了就不会再添加默认转场
391e41f4b71Sopenharmony_ci            if (this.data1) {
392e41f4b71Sopenharmony_ci              this.data1 = undefined;
393e41f4b71Sopenharmony_ci              this.data2 = new MyData("branch 1");
394e41f4b71Sopenharmony_ci            } else {
395e41f4b71Sopenharmony_ci              this.data1 = new MyData("branch 0");
396e41f4b71Sopenharmony_ci              this.data2 = undefined;
397e41f4b71Sopenharmony_ci            }
398e41f4b71Sopenharmony_ci          })
399e41f4b71Sopenharmony_ci        })
400e41f4b71Sopenharmony_ci    }.width("100%")
401e41f4b71Sopenharmony_ci    .padding(10)
402e41f4b71Sopenharmony_ci  }
403e41f4b71Sopenharmony_ci}
404e41f4b71Sopenharmony_ci```
405e41f4b71Sopenharmony_ci
406e41f4b71Sopenharmony_ci
407