HarmonyOS 子组件如何触发父组件中的方法
1、如何在子组件触发父组件中的方法。
2、在replayComp组件中点击如何切换样式及触发父组件方法。
代码如下:
import hilog from '@ohos.hilog';
import { HighSpeedItem } from '../bean/HighSpeedRseponse';
interface listItem {
money: string
text: string
title: string
data: string
}
class StringData {
money: string
text: string
title: string
data: string
constructor(money: string, text: string, title: string, data: string) {
this.money = money;
this.text = text;
this.title = title;
this.data = data;
}
}
class BasicDataSource implements IDataSource {
private listeners: DataChangeListener[] = [];
private originDataArray: StringData[] = [];
public totalCount(): number {
return 0;
}
public getData(index: number): StringData {
return this.originDataArray[index];
}
registerDataChangeListener(listener: DataChangeListener): void {
if (this.listeners.indexOf(listener) < 0) {
console.info('add listener');
this.listeners.push(listener);
}
}
unregisterDataChangeListener(listener: DataChangeListener): void {
const pos = this.listeners.indexOf(listener);
if (pos >= 0) {
console.info('remove listener');
this.listeners.splice(pos, 1);
}
}
notifyDataReload(): void {
this.listeners.forEach(listener => {
listener.onDataReloaded();
})
}
notifyDataAdd(index: number): void {
this.listeners.forEach(listener => {
listener.onDataAdd(index);
})
}
notifyDataChange(index: number): void {
this.listeners.forEach(listener => {
listener.onDataChange(index);
})
}
notifyDataDelete(index: number): void {
this.listeners.forEach(listener => {
listener.onDataDelete(index);
})
}
notifyDataMove(from: number, to: number): void {
this.listeners.forEach(listener => {
listener.onDataMove(from, to);
})
}
}
class MyDataSource extends BasicDataSource {
private dataArray: StringData[] = [];
public totalCount(): number {
return this.dataArray.length;
}
public getData(index: number): StringData {
return this.dataArray[index];
}
public addData(index: number, data: StringData): void {
this.dataArray.splice(index, 0, data);
this.notifyDataAdd(index);
}
public pushData(data: StringData): void {
this.dataArray.push(data);
this.notifyDataAdd(this.dataArray.length - 1);
}
public reloadData(): void {
this.notifyDataReload();
}
//删除全部数据
public clear(): void {
// this.dataArray = []
// this.notifyDataReload();
this.empty()
this.refresh()
}
public empty(): void {
this.dataArray = []
}
public refresh(): void {
this.notifyDataReload();
}
}
@Entry
@Component
struct Index {
private title: string = '我的优惠券'
private data: MyDataSource = new MyDataSource();
@State currentIndex: number = 0
@State highSheepNum: number = 0
@State tollStationNum: number = 0
@State highSheepArray: highSheepItem[] = [
new highSheepItem(0, "全部", 'all', 0, true),
new highSheepItem(1, "商品", 'all', 0, false),
new highSheepItem(2, "体验", 'all', 0, false),
] //高速//拥堵 type = 1 管制 type =2 事故 type = 3 施工 type = 4 其他 type = 5
@State listDate: listItem[] = [
{
money: '¥360',
text: '满3500元立减',
title: '限部分商品使用',
data: '2024.02.23-2024.03.15'
},
{
money: '¥250',
text: '满2500元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥200',
text: '满1800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥150',
text: '满1300元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥80',
text: '满800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥360',
text: '满3500元立减',
title: '限部分商品使用',
data: '2024.02.23-2024.03.15'
},
{
money: '¥250',
text: '满2500元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥200',
text: '满1800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥150',
text: '满1300元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥80',
text: '满800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥360',
text: '满3500元立减',
title: '限部分商品使用',
data: '2024.02.23-2024.03.15'
},
{
money: '¥250',
text: '满2500元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥200',
text: '满1800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥150',
text: '满1300元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥80',
text: '满800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥360',
text: '满3500元立减',
title: '限部分商品使用',
data: '2024.02.23-2024.03.15'
},
{
money: '¥250',
text: '满2500元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥200',
text: '满1800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥150',
text: '满1300元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥80',
text: '满800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥360',
text: '满3500元立减',
title: '限部分商品使用',
data: '2024.02.23-2024.03.15'
},
{
money: '¥250',
text: '满2500元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥200',
text: '满1800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥150',
text: '满1300元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥80',
text: '满800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥360',
text: '满3500元立减',
title: '限部分商品使用',
data: '2024.02.23-2024.03.15'
},
{
money: '¥250',
text: '满2500元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥200',
text: '满1800元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥150',
text: '满1300元立减',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
},
{
money: '¥80',
text: '满800元立减1',
title: '适用于体验',
data: '2024.02.23-2024.03.15'
}
]
aboutToAppear(): void {
// 请求数据模拟
this.init()
}
changeData(title: string) {
this.data.clear();
let that = this;
setTimeout(() => {
// hilog.info(0x0000, '数据1', '1')
// hilog.info(0x0000, '数据2',JSON.stringify(that.listDate))
// hilog.info(0x0000, '数据3',title)
for (let i = 0; i <= that.listDate.length; i++) {
hilog.info(0x0000, '数据4', JSON.stringify(that.listDate[i]))
let listDate: listItem = that.listDate[i] as listItem;
if (listDate?.title?.indexOf(title) !== -1) {
that.data.pushData(new StringData(listDate?.money, listDate?.text, listDate?.title, listDate?.data));
}
}
this.data.reloadData();
this.highSheepNum = this.data.totalCount()
hilog.info(0x0000, '组件加载2', JSON.stringify(this.data))
}, 500)
}
build() {
Column() {
Tabs({ barPosition: BarPosition.Start }) {
TabContent() {
this.highSpeedBuilder()
}.tabBar(this.TabRoadBuilder(0, '优惠券', this.highSheepNum))
TabContent() {
this.highSpeedBuilder()
}.tabBar(this.TabRoadBuilder(1, '用于体验', this.tollStationNum))
}
.barWidth('100%')
.scrollable(false)
.vertical(false)
.barHeight(40)
.width('100%')
.onChange((index: number) => {
this.currentIndex = index;
this.changeData('体验')
if (index == 1) {
// this.getStationEvent()
} else if (index == 2) {
// this.getServiceEvent()
// this.getEventListIntroduc()
}
})
.width('100%')
.height('100%')
.backgroundColor('#ffffff')
}.width('100%').height('100%')
}
@Builder
TabRoadBuilder(index: number, name: string, num: number) {
Column() {
Text(name + '(' + num + ')')
.fontColor(this.currentIndex === index ? '#015DFF' : '#999999')
.fontSize(16)
.fontWeight(this.currentIndex === index ? 500 : 400)
.lineHeight(22)
.margin({ top: 6, bottom: 6 })
Divider().strokeWidth(3).color(this.currentIndex === index ? '#015DFF' : '#999999').width(24)
}.width('100%')
}
@Builder
highSpeedBuilder() {
Column() {
Flex({ justifyContent: FlexAlign.SpaceAround }) {
ForEach(this.highSheepArray, (item: highSheepItem) => {
replayComp({ item: item })
}, (item: highSheepItem) => item.title)
}
.padding({
left: 10,
right: 10,
bottom: 12,
top: 12
})
.width('100%')
Text(this.title)
.fontSize(18)
.fontWeight(FontWeight.Bold)
.fontFamily('Arial')
Row() {
TextInput({ placeholder: '请输入优惠码' })
.width('75%')
.fontColor(Color.Blue)
.fontSize(14)
.fontStyle(FontStyle.Italic)
.fontWeight(FontWeight.Bold)
.fontFamily('Arial')
.placeholderColor(0x999999)
.placeholderFont({
size: 16,
weight: FontWeight.Medium,
family: 'cursive',
style: FontStyle.Italic
})
Button('筛选', { type: ButtonType.Normal, stateEffect: true })
.width('25%')
.fontSize(14)
.fontWeight(FontWeight.Medium)
.backgroundColor('#cccccc')
.borderRadius(5)
.onClick(() => {
})
}
.padding({ top: 35, bottom: 10 })
Row() {
Text(`您有${this.highSheepNum}张优惠券可领用~`)
.fontSize(12)
.textAlign(TextAlign.End)
Text('>')
}
.margin({ bottom: 10 })
List({ space: 10 }) {
LazyForEach(this.data, (item: listItem) => {
ListItem() {
Row() {
Column() {
Text(item.money)
.margin({ top: 20, bottom: 20 })
.fontColor('#f9f4d7')
.borderRadius(5)
Text(item.text)
.textAlign(TextAlign.Center)
.fontSize(12)
.fontColor('#f9f4d7')
.borderRadius(5)
}
.width('30%')
.height(100)
.backgroundColor('#fe6a48')
Column() {
Row() {
Text(item.title)
.textAlign(TextAlign.Start)
.margin({ top: 15, left: -110, bottom: 40 })
}
Row() {
Text(item.data)
.fontSize(10)
.margin({ left: -5, right: 25 })
Button('去使用', { type: ButtonType.Capsule })
.width('32%')
.height(20)
.fontSize(12)
.fontColor('#f6a200')
.backgroundColor('#cccccc')
.borderColor('#f6a200')
}
}
.width('70%')
.height(100)
.backgroundColor('#fff')
}.onAppear(() => {
// hilog.info(0x0000, '组件加载', item.title)
// hilog.info(0x0000, '组件加载1', JSON.stringify(this.data.totalCount()))
})
}
}, (item: listItem) => item.title)
}
}
.padding(12)
.height('100%')
.backgroundColor(0xF1F3F5)
}
@Builder
tollStationsBuilder() {
Column() {
Text('测试')
}
}
init() {
for (let i = 0; i < this.listDate.length; i++) {
// hilog.info(0x0000, '循环',this.listDate[i].title)
this.data.pushData(new StringData(this.listDate[i].money, this.listDate[i].text, this.listDate[i].title,
this.listDate[i].data));
}
this.highSheepNum = this.data.totalCount()
this.Statistics()
// console.log(JSON.stringify(this.data),'[Log]')
}
Statistics() {
let controlNum: number = 0; //商品
let congestionNum: number = 0; //体验
for (let i = 0; i < this.listDate.length; i++) {
if (this.listDate[i].title?.indexOf('商品') !== -1) {
controlNum++
}
if (this.listDate[i].title?.indexOf('体验') !== -1) {
congestionNum++
}
}
for (let j = 0; j < this.highSheepArray.length; j++) {
if (this.highSheepArray[j].title == '全部') {
this.highSheepArray[j].number = this.highSheepNum
}
if (this.highSheepArray[j].title == '商品') {
this.highSheepArray[j].number = controlNum
}
if (this.highSheepArray[j].title == '体验') {
this.highSheepArray[j].number = congestionNum
}
}
}
}
@Component
struct replayComp {
@ObjectLink item: highSheepItem
@State highSheepCur: number = 0
@State selectedFontColor: string = '#015DFF'
build() {
Column() {
Text(this.item.title + '(' + this.item.number + ')')
.fontSize(14)
.fontColor(this.highSheepCur == this.item.index ? '#015DFF' : '#999999')
.fontWeight(this.highSheepCur === this.item.index ? 500 : 400)
.margin({ bottom: 6 })
Divider()
.strokeWidth(3)
.color(this.highSheepCur === this.item.index ? this.selectedFontColor : Color.White)
.width(24)
}.onClick(() => {
this.highSheepCur = this.item.index;
// this.changeData(this.item.title)
// 1、想在这里面触发父级的方法changeData 怎么触发
// 2、点击的时候怎么能做到切换样式
})
}
}
@Observed
class highSheepItem {
index: number
title: string
code: string
number: number
ischeck: boolean
constructor(index: number, title: string, code: string, number: number, ischeck: boolean) {
this.index = index
this.title = title
this.code = code
this.number = number
this.ischeck = ischeck
}
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS 父组件如何触发子组件内定义的方法
223浏览 • 1回复 待解决
HarmonyOS 父组件如何响应子组件内的事件方法 ,子组件如何响应父组件内的事件方法?
458浏览 • 1回复 待解决
父组件调用子组件的方法
1566浏览 • 1回复 待解决
HarmonyOS 如何在父组件中调用子组件的方法
178浏览 • 1回复 待解决
HarmonyOS 自定义组件中定义方法,父组件中实现方法并传给子组件,但是子组件调用父组件中的方法,方法中的逻辑代码不执行
133浏览 • 1回复 待解决
父组件中定义的方法如何传递给子组件
593浏览 • 1回复 待解决
如何在父组件中调用子组件封装的方法
1794浏览 • 1回复 待解决
HarmonyOS 父组件如何调用子组件的方法?
514浏览 • 0回复 待解决
子组件调用父组件里的方法
548浏览 • 1回复 待解决
开源鸿蒙中 ets子组件调用父组件中的方法?
5954浏览 • 1回复 待解决
HarmonyOS 子组件响应父组件的事件方法
400浏览 • 1回复 待解决
HarmonyOS 父组件怎么调用子组件的方法
279浏览 • 1回复 待解决
HarmonyOS 子组件调用父组件的方法demo
162浏览 • 1回复 待解决
HarmonyOS 父组件调用子组件方法
273浏览 • 1回复 待解决
HarmonyOS 父组件如何调用子组件里的方法
105浏览 • 1回复 待解决
HarmonyOS 是否有类似vue里的子组件通过emit触发父组件里方法的api ?
273浏览 • 1回复 待解决
HarmonyOS 子组件被父组件包装后,如何通过父组件设置子组件的属性
759浏览 • 1回复 待解决
HarmonyOS 父组件怎么直接调用子组件的方法
75浏览 • 1回复 待解决
HarmonyOS 关于子组件调用父组件方法的问题
1257浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何在Click事件中阻止子组件触发父组件点击事件的冒泡?
344浏览 • 0回复 待解决
HarmonyOS 父组件中的变量发现变化时,如何子组件的子组件联动变化?
541浏览 • 1回复 待解决
HarmonyOS 组件模块化, 父组件如何调用子组件类的方法?
323浏览 • 1回复 待解决
父组件中如何处理子组件内点击事件
2830浏览 • 1回复 待解决
HarmonyOS 子组件如何拿到父组件的position
96浏览 • 1回复 待解决
示例参考如下: