快速创建一个符合长度的数组  空数组
 Array.from({length: 200})   // 200的长度的空数组
 场景:只确定长度,不确定内容的情况
@State 状态装饰器 =》增强功能
 数据变化了 可以引起页面的重新渲染
 没有@State修饰的变量,不会引起UI的刷新渲染
 加不加@state看数据变化是不是需要重新展示
 数据变化后需要重新展示页面的,必须加@State来修饰
 创建一个控制器,调用一个函数
 将控制器和被控制者绑定
 控制器控制行为
 control Scroller = new Scroller()
 Grid(this.control){}
  this.control.scrollPage({ next: true })  // 下一页
   this.control.scrollPage({ next: false }) // 上一页
   
   
 滚动条设置
 scrollBar(BarState.枚举)
 scrollBarWidth()
 scrollBarColor()
 和Grid共用一个scroller
 滚动条定制
 1. 要有一个控制器 两个都设置   => 和Grid产生联动
 2. ScrollBar 滚动条组件 自己滚自己
 默认是竖着滚动
 ScrollBar({scroller:this.control,direction:ScrollBarDirection.Horizontal}){
 // 里面的结构
}
 $r('app.media.图片名') => $r() 是图片资源地址
 'app.media.图片名'  => 是string 图片名
ResourceStr 是Resource和string的联合类型
--------------------------------------------------
 Scroll,Tabs
Scroll容器组件
 子组件的布局尺寸超过scroll的尺寸
Scroll只支持一个组件
 设置滚动方向:
 竖向滚动   scrollable(ScrollDirection.Vertical)  默认
 横向滚动   scrollable(ScrollDirection.Horizontal)
scrollBar            设置滚动条状态
 scrollBarColor       设置滚动条颜色
 scrollBarWidth         设置滚动条宽
 edgeEffect             设置滚动条边缘效果
 Scroll的控制器
 scroller: Scroller = new Scroller()
this.scroller.scrollEdge(Edge.Top) // 返回顶部
获取滚动条的距离
 this.scroller.currentOffset().xOffset
 this.scroller.currentOffset().yOffset
Scroll事件
 滚动时添加逻辑   滚动时 一直触发
 注册滚动事件 =》添加一个逻辑 指定他的执行时机
 .onScroll((x:number,y:number)=>{  })
 容器组件Tabs
 Tabs(){ 
 TabContent(){}.tabBar('')
  }
TabContent 里只能有一个子组件
Tabs 支持两种切换 滑动,点击
通用属性
 导航位置
 barPosition   Tabs({barPosition:BarPosition.End})
 垂直导航 =》车机和平板用的多
 .vertical(true)
 禁用滑动切换(默认可以滑动切换)
 .scrollbale(false)
 点击切换(切换时的动画效果)
 .animationDuration(数字)
 .animationDuration(0)  ==》切换时瞬间切换
 滚动导航栏
 tabs导航栏一旦多了 默认挤压效果
 .barMode(BarMode.Scrollable)
 自定义构建函数(自定义结构函数)
 Tabs() { TabContent() {}.tabBar(this.fun()) }
 @Builder
 fun() { }
Tabs组件事件
 onChange(event:(index:number)=>void)   在改变时执行  页面切换完成时执行
 onTabBarClick(event:(index:number)=>void) 在点击导航栏时执行 只要点击时立即执行
// 思维导图
