赞
踩
完成如下图展示效果:
如下图:
代码展示如下:
@Component
struct Header {
build() {
}
如下图:
@Entry
@Component
struct ItemPage {
build(){
}
代码示例:
build() {
Row({space:10}){
Image($r('app.media.jiantou')).width(30)
//如果需要传值
// Text("我是标题")
Text(this.title)
.fontSize(30)
.fontWeight(FontWeight.Bold)
Blank() //把剩余的空间都填充满
Image($r('app.media.shuaxin')).width(30)
}
.width('100%')//给row容器设置一个宽度
.padding(20)
}
Blank() //把剩余的空间都填充满
struct Header {
title:string //标题不能写死,在这里定义一个标题变量
build() {
Row({space:10}){
Image($r('app.media.jiantou')).width(30)
Text(this.title)
.fontSize(30)
.fontWeight(FontWeight.Bold)
Blank() //把剩余的空间都填充满
Image($r('app.media.shuaxin')).width(30)
}
.width('100%')//给row容器设置一个宽度
.padding(20)
}
}
export struct Header {
title:string //标题不能写死,在这里定义一个标题变量
build() {
Row({space:10}){
Image($r('app.media.jiantou')).width(30)
Text(this.title)
.fontSize(30)
.fontWeight(FontWeight.Bold)
Blank() //把剩余的空间都填充满
Image($r('app.media.shuaxin')).width(30)
}
.width('100%')//给row容器设置一个宽度
.padding(20)
}
}
struct ItemPage {
build() {
Row(){
Column({space:10}){
Header({title:'商品列表'})
导包使用:
//import 导入 Header
// import {Header} from './Header'
//加了default Header就不用再加上{ }了
import Header from './Header'
引用 Header Footer import {Header,Footer} from './Header'
export 对外有了一个访问的接口,是在Header的到出方法中添加default
则ItemPage就不用再导入加不用再加上{ }了。
如下例代码:
@Component
//export 对外有了一个访问的接口
export default struct Header {
title:string //标题不能写死,在这里定义一个标题变量
.width('100%')//给row容器设置一个宽度
.padding(20)
ItemPage中Column容器属性
.width('100%')
.height('100%')
.backgroundColor('#EFEFEF')
.padding(20)
运行效果:
//声明一个ImageItem类
class ImageItem {
name :string
image:ResourceStr
price:number
discount:number
//修改里面的值
setName(name:string){
// this.name =name+this.name
this.name =name
}
getName(){
return this.name
}
//定义构造函数
constructor( name :string,image:ResourceStr,price:number,discount:number=0) {
// ?: 非必选,设置可选参数
//赋值
this.name =name
this.image=image
this.price=price
this.discount=discount
}
若不写构造函数,只能使用new的方法来实现传入商品数据。
//若不写构造函数,只能使用new
//item:Item =new Item('华为Mate60',$r('app.media.mate60'),6999,500)
struct ItemPage {
private list:Array<ImageItem> =[
new ImageItem('华为Mate60',$r('app.media.mate60'),6999,500),
new ImageItem('华为Book',$r('app.media.Book'),13999),
new ImageItem('WatchGT4',$r('app.media.WatchGT4'),1438),
new ImageItem('FreeBuds',$r('app.media.FreeBuds'),1499),
new ImageItem('Mate X5',$r('app.media.MateX5'),12999),
new ImageItem('WatchGT41',$r('app.media.WatchGT4'),1438),
new ImageItem('FreeBuds1',$r('app.media.FreeBuds'),1499),
new ImageItem('Mate X51',$r('app.media.MateX5'),12999)
]
在Row容器从左到右依次部署Image组件、Column组件,传入数据,并调整Image和Text组件大小。
build() {
Row(){
Column({space:10}){
Header({title:'商品列表'})
Row(){
Image(item.image)
.width(100)
Column(){
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
ForEach(this.list,(item:ImageItem)=>{
Row(){
Image(item.image)
.width(100)
Column(){
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text(`原价:¥ ${item.price}`)
Column(){
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
Text(`原价:¥ ${item.price}`)
Text(`折扣价:¥ ${item.price-item.discount}`)
Text(`补贴:¥ ${item.discount}`)
//用if渲染
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
代码运行结果:
加上之前:
加上之后:整体实现效果了
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
ListItem(){
Row(){
Image(item.image)
.width(100)
Column(){
//标题名字固定
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
//用if渲染
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
.fontSize(16)
.fontColor('#F36')
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
目前商城界面已经支持滑动了,但是最下面的图片还不能完全展示出来,我们需要用.layoutWeight属性设置权重。
为List组件使用.layoutWeight属性设置权重。
未设置前:
设置以后就能完全看见底部内容展示了
设置容器的间距,以及组件颜色,对容器设置宽度大小,背景颜色,以及字体颜色等。
build() {
Row(){
Column({space:10}){
Header({title:'商品列表'})
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
ListItem(){
Row(){
Image(item.image)
.width(100)
Column(){
//标题名字固定
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
//用if渲染
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
.fontSize(16)
.fontColor('#F36')
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
.height('100%')
.alignItems(HorizontalAlign.Start)
}//设置row的宽度和高度,以及圆角边框大小,背景颜色
.height(120)
.width('100%')
.borderRadius(20)
.backgroundColor('#FFF')
.padding(10)
}
},(item:ImageItem)=>item.name) //键值生成规则 重复渲染 设置唯一标识
}
.layoutWeight(1)
}
.width('100%')
.height('100%')
.backgroundColor('#EFEFEF')
.padding(20)
}
}
// //自定义构建函数
@Builder ItemCard(item:ImageItem){
Row(){
Image(item.image)
.width(100)
Column(){
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
.fontSize(16)
.fontColor('#F36')
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
.height('100%')
.alignItems(HorizontalAlign.Start)
}//设置row的宽度和高度,以及圆角边框大小,背景颜色
.height(120)
.width('100%')
.borderRadius(20)
.backgroundColor('#FFF')
.padding(10)
}
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
ListItem(){
// 直接调用自定义函数ItemCard
this.ItemCard(item)
定义一个全局自定义函数ItemCardTotal,全局自定义构建函数需要加function函数
@Builder function ItemCardTotal(item:ImageItem){
Row(){
Image(item.image)
.width(100)
Column(){
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
.fontSize(16)
.fontColor('#F36')
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
.height('100%')
.alignItems(HorizontalAlign.Start)
}//设置row的宽度和高度,以及圆角边框大小,背景颜色
.height(120)
.width('100%')
.borderRadius(20)
.backgroundColor('#FFF')
.padding(10)
}
全局自定函数在build()里面就不需要this来进行调用了
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
ListItem(){
ItemCardTotal(item)
这样效果就完全显示出来啦!
@Styles function fillScreen(){
.height(120)
.width('100%')
.borderRadius(20)
.backgroundColor('#FFF')
.padding(10)
}
@Builder function ItemCardTotal(item:ImageItem){
Row(){
Image(item.image)
.width(100)
Column(){
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.fontSize(16)
.fontColor('#F36')
Text(`补贴:¥ ${item.discount}`)
.fontSize(16)
.fontColor('#F36')
}else{
Text('原价:¥'+item.price)
.fontSize(16)
.fontColor('#F36')
}
}
.height('100%')
.alignItems(HorizontalAlign.Start)
}
.fillScreen()
以上是在全局自定义组件里面调用
@Styles function fillScreen1(){
.width('100%')
.height('100%')
.backgroundColor('#EFEFEF')
.padding(20)
}
只能对通用属性进行调用
build() {
Row(){
Column({space:10}){
Header({title:'商品列表'})
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
ListItem(){
ItemCardTotal(item)
}
},(item:ImageItem)=>item.name) //键值生成规则 重复渲染 设置唯一标识
}
.layoutWeight(1)
}
.fillScreen1()
}
}
}
必须声明式Text文本
@Extend(Text) function priceText(){
.fontSize(16)
.fontColor('#F36')
}
@Builder function ItemCardTotal(item:ImageItem){
Row(){
Image(item.image)
.width(100)
Column(){
//标题名字固定
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
//用if渲染
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.priceText()
Text(`补贴:¥ ${item.discount}`)
.priceText()
}else{
Text('原价:¥'+item.price)
.priceText()
}
}.alignItems(HorizontalAlign.Start)
.fillScreen1()
}
.fillScreen()
}
//import 导入 Header
// import {Header} from './Header'
//加了default Header就不用再加上{ }了
import Header from './Header'
//声明一个ImageItem类
class ImageItem {
name :string
image:ResourceStr
price:number
discount:number
//修改里面的值
setName(name:string){
// this.name =name+this.name
this.name =name
}
getName(){
return this.name
}
//定义构造函数
constructor( name :string,image:ResourceStr,price:number,discount:number=0) {
// ?: 非必选,设置可选参数
//赋值
this.name =name
this.image=image
this.price=price
this.discount=discount
}
}
//全局自定义构建函数需要加function函数 因此build()里面就不需要this来进行调用了
@Builder function ItemCardTotal(item:ImageItem){
Row(){
Image(item.image)
.width(100)
Column(){
//标题名字固定
Text(item.name)
.fontSize(20)
.fontWeight(FontWeight.Bold)
//用if-else渲染
if (item.discount){
Text(`原价:¥ ${item.price}`)
.fontColor('#ccc')
.decoration({type:TextDecorationType.LineThrough})
Text(`折扣价:¥ ${item.price-item.discount}`)
.priceText()
Text(`补贴:¥ ${item.discount}`)
.priceText()
}else{
Text('原价:¥'+item.price)
.priceText()
// .fontSize(16)
// .fontColor('#F36')
}
}.alignItems(HorizontalAlign.Start)
.fillScreen1()
}//设置row的宽度和高度,以及圆角边框大小,背景颜色
.fillScreen()
}
@Styles function fillScreen(){
.height(120)
.width('100%')
.borderRadius(20)
.backgroundColor('#FFF')
.padding(10)
}
@Styles function fillScreen1(){
.width('100%')
.height('100%')
.backgroundColor('#EFEFEF')
.padding(20)
}
@Extend(Text) function priceText(){
.fontSize(16)
.fontColor('#F36')
}
@Entry
@Component
struct ItemPage {
//定义数组
private list:Array<ImageItem> =[
new ImageItem('华为Mate60',$r('app.media.mate60'),6999,500),
new ImageItem('华为Book',$r('app.media.Book'),13999),
new ImageItem('WatchGT4',$r('app.media.WatchGT4'),1438),
new ImageItem('FreeBuds',$r('app.media.FreeBuds'),1499),
new ImageItem('Mate X5',$r('app.media.MateX5'),12999),
new ImageItem('WatchGT41',$r('app.media.WatchGT4'),1438),
new ImageItem('FreeBuds1',$r('app.media.FreeBuds'),1499),
new ImageItem('Mate X51',$r('app.media.MateX5'),12999)
]
//如果不传参数,直接给默认值0
test(name:string,age:number =0){
console.log('name',name,'age',age)
}
build() {
Row(){
Column({space:10}){
Header({title:'商品列表'})
List( {space:10}){
ForEach(this.list,(item:ImageItem)=>{
ListItem(){
ItemCardTotal(item)
}
},(item:ImageItem)=>item.name) //键值生成规则 重复渲染 设置唯一标识
}
.layoutWeight(1)
}
.fillScreen1()
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。