在 OpenHarmony(ArkUI / eTS) 中,做“响应式图表”通常包含两层含义:
下面按常见场景说明。
@StorageLink / @State + 容器尺寸OpenHarmony 没有 DOM,但可以通过 容器尺寸监听 实现。
onAreaChange@Component
struct ChartPage {
@State chartWidth: number = 300
@State chartHeight: number = 200
build() {
Column() {
Stack()
.width('100%')
.height(300)
.onAreaChange((oldValue, newValue) => {
this.chartWidth = newValue.width
this.chartHeight = newValue.height
})
}
}
}
然后将 chartWidth / chartHeight 传给图表组件。
如果你用的是 Canvas 自绘图表:
Canvas(this.context)
.width(this.chartWidth)
.height(this.chartHeight)
.onReady(() => {
this.drawChart()
})
在 drawChart() 中:
this.chartWidth 计算坐标✅ 效果:屏幕变化 → 尺寸变化 → Canvas 重绘
OpenHarmony 提供了 @ohos/charts 或系统图表组件(取决于版本)。
import { LineChart } from '@ohos/charts'
LineChart({
width: '100%',
height: '100%',
data: this.chartData
})
✅ 特点:
如果你用的是 ECharts OpenHarmony 版:
ECharts({
option: this.option,
width: '100%',
height: '100%'
})
窗口变化:
this.echarts.resize()
@State@State data: number[] = [10, 20, 30]
// 修改数据
this.data = [15, 25, 35]
图表组件监听 @State 自动刷新。
@Observed / @ObjectLink适合复杂图表数据:
@Observed
class ChartModel {
series: number[] = []
}
@Component
struct Chart {
@ObjectLink model: ChartModel
build() {
// 图表随 model 变化
}
}
import mediaquery from '@ohos.mediaquery'
let listener = mediaquery.matchMediaSync('(orientation: landscape)')
listener.on('change', (e) => {
// 重新设置图表尺寸
})
Grid / FlexFlex({ direction: BreakpointUtils.isPhone() ? Column : Row }) {
Chart()
}
✅ 最佳实践组合
width('100%') + onAreaChange@State / @Observed如果你能告诉我:
我可以直接给你一套可复制的完整示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。