1# 如何实现流式布局 2## 场景介绍 3流式布局是一种自适应布局,在一些无法确定界面元素尺寸的布局中,根据各个元素的尺寸进行自适应布局。 4 5## 效果呈现 6本例效果呈现如下: 7 8## 运行环境 9本例基于以下环境开发,开发者也可以基于其他适配的版本进行开发: 10- IDE: DevEco Studio 4.0 Release 11- SDK: Ohos_sdk_public 4.0.10.13 (API Version 10 Release) 12 13## 实现思路 14本例包含的关键操作及其实现方案如下: 15- 输入和添加文本数据:通过TextInput组件实现文本的输入和通过UNshift()方法实现文本的添加。 16- 实现流式布局:通过Flex组件实现。 17 18## 开发步骤 191. 在输入框输入文本:在主界面中自定义一个SearchInput的子组件,使用Flex作为容器组件,默认水平排列,通过TextInput作为输入组件。定义一个变量Input,存储输入框的内容,定义一个变量searchArr,表示FlexLayout要显示输入的新增文本内容。在通过onClick()事件将Input的值通过unshift()方法存放带searchArr的首位(trim())。具体代码如下: 20 ```ts 21 @Component 22 export default struct SearchInput{ 23 @State input:string = ''; 24 @Link searchArr:Array<string> 25 26 build(){ 27 Flex({alignItems:ItemAlign.Center}){ 28 TextInput({ 29 placeholder:'请输入...', 30 text:this.input 31 }) 32 .placeholderColor('#787F87') 33 .placeholderFont({size:'12fp'}) 34 .height('5.1%') 35 .width('81.1%') 36 .backgroundColor(Color.White) 37 .margin({left:'12vp',right:'15vp',top:'8vp',bottom:'8vp'}) 38 .border({width:'1vp',color:'#33182431',radius:'20vp',style:BorderStyle.Solid}) 39 .onChange((value:string)=>{ 40 this.input = value; 41 }) 42 Text('添加') 43 .fontSize('16fp') 44 .fontColor('#007DFF') 45 .height('5.1%') 46 .onClick(()=>{ 47 if (this.input !== ''&& this.input.trim().length>0){ 48 this.searchArr.unshift(this.input.trim()); 49 } 50 this.input = ''; 51 }) 52 } 53 .width('100%') 54 } 55 } 56 ``` 572. 流失布局的实现:自定义一个FlexLayou的子组件,Flex作为容器组件,Flex.Wrap自适应布局,通过ForEach遍历变量searchArr使其显示。具体代码如下: 58 ```ts 59 @Component 60 export default struct FlexLayout { 61 @Link searchArr :Array<string>; 62 build(){ 63 Scroll(){ 64 Flex({justifyContent:FlexAlign.Start,wrap:FlexWrap.Wrap}){ 65 if (this.searchArr.length>0){ 66 ForEach(this.searchArr,(item:string)=>{ 67 Text(`${item}`) 68 .fontSize("12fp") 69 .borderStyle(BorderStyle.Solid) 70 .borderWidth('1vp') 71 .borderColor('#E5E8EA') 72 .borderRadius('20vp') 73 .backgroundColor('#E5E8EA') 74 .padding({top:'0.8%',bottom:'0.8%',left:'4.4%',right:'4.4%'}) 75 .margin({top:'10vp',right:'10vp'}) 76 .textOverflow({overflow:TextOverflow.Ellipsis}) 77 .maxLines(2) 78 },(item:string)=>JSON.stringify(item)) 79 } 80 } 81 .margin({left:'12vp',right:'12vp'}) 82 .padding({bottom:'12vp'}) 83 } 84 } 85 } 86 ``` 87 883. 主页面添加文本数据:调用FlexLayout组件、SearchInput组件,定义数组变量searchArr用来存放默认文本和输入的文本,使用$将父组件的变量与添加的文本数组关联起来。具体代码如下: 89 ```ts 90 import SearchInput from '../view/SearchInput'; 91 import FlexLayout from '../view/FlexLayout'; 92 import SearchViewModel from '../viewmodel/SearchViewModel' 93 94 @Entry 95 @Component 96 struct HomePage { 97 @State searchArr:Array<string>=SearchViewModel.getSearchArrData() 98 build() { 99 Column(){ 100 SearchInput({searchArr:$searchArr}) 101 FlexLayout({searchArr:$searchArr}) 102 } 103 .height('100%') 104 .width('100%') 105 .alignItems(HorizontalAlign.Center) 106 .backgroundColor('#F1F3f5') 107 } 108 } 109 ``` 110 1114. 原数据建立:定义获取原数据的函数getSearchArrData()。具体代码如下: 112 ```ts 113 export class SearchViewModel{ 114 getSearchArrData(){ 115 let listItems:Array<string>=[ 116 'Flex','Swiper','Slider','Image', 117 'Switch','Checkbox','ScrollView', 118 'Row','Column' 119 ]; 120 return listItems; 121 } 122 } 123 export default new SearchViewModel(); 124 ``` 125 126## 完整代码 127上述开发步骤的具体示例代码即为本场景的全部代码 128 129## 参考 130[Flex](../application-dev/reference/apis-arkui/arkui-ts/ts-container-flex.md) 131 132[TextInput](../application-dev/reference/apis-arkui/arkui-ts/ts-basic-components-textinput.md)