Appearance
交互控制
包括相机控制和事件监听。
相机控制
vue
<script setup>
const chartOption = ref({
series: [{ data: [120, 200, 150] }],
xAxis3D: { data: ['A', 'B', 'C'] },
controlSettings: {
enableRotate: true,
enableZoom: true,
enablePan: true,
autoRotate: false
}
})
</script>基础控制
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
enableRotate | boolean | true | 启用旋转 |
enableZoom | boolean | true | 启用缩放 |
enablePan | boolean | true | 启用平移 |
autoRotate | boolean | false | 自动旋转 |
autoRotateSpeed | number | 2.0 | 自动旋转速度(度/秒) |
高级控制
旋转控制
javascript
controlSettings: {
enableRotate: true,
rotateSpeed: 1.0, // 旋转速度
minPolarAngle: 0, // 俯仰角下限
maxPolarAngle: Math.PI, // 俯仰角上限
minAzimuthAngle: -Infinity, // 水平旋转下限
maxAzimuthAngle: Infinity // 水平旋转上限
}缩放控制
javascript
controlSettings: {
enableZoom: true,
zoomSpeed: 1.0, // 缩放速度
minDistance: 10, // 最近距离
maxDistance: 100 // 最远距离
}平移控制
javascript
controlSettings: {
enablePan: true,
panSpeed: 1.0, // 平移速度
screenSpacePanning: false // 屏幕空间平移
}事件监听
支持 Vue 声明式事件监听,详见 事件系统。
vue
<template>
<RayBar
:option="chartOption"
@click="handleClick"
@mouseover="handleMouseOver"
@mouseout="handleMouseOut"
/>
</template>
<script setup>
const handleClick = (params) => {
console.log('点击:', params.name, params.value)
}
const handleMouseOver = (params) => {
console.log('悬停:', params.dataIndex)
}
const handleMouseOut = () => {
console.log('离开')
}
</script>常见场景
禁用所有交互
javascript
controlSettings: {
enableRotate: false,
enableZoom: false,
enablePan: false
}限制交互范围
javascript
controlSettings: {
enableRotate: true,
minPolarAngle: Math.PI / 4, // 限制最小仰角 45°
maxPolarAngle: Math.PI * 3 / 4, // 限制最大仰角 135°
minDistance: 20, // 限制最近距离
maxDistance: 80 // 限制最远距离
}自动旋转展示
javascript
controlSettings: {
autoRotate: true,
autoRotateSpeed: 2.0, // 每秒旋转 2 度
enableRotate: true, // 允许用户手动旋转
enableZoom: true
}自动旋转
用户交互时自动旋转会暂停,交互结束后恢复。
点击高亮
vue
<template>
<RayBar :option="chartOption" @click="handleClick" />
</template>
<script setup>
import { ref } from 'vue'
const selectedIndex = ref(-1)
const chartOption = ref({
series: [{ data: [120, 200, 150, 80, 70, 110, 130] }],
xAxis3D: { data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] }
})
const handleClick = (params) => {
selectedIndex.value = params.dataIndex
console.log(`选中: ${params.name} = ${params.value}`)
}
</script>触摸控制
RayChart 自动支持触摸设备:
| 手势 | 操作 |
|---|---|
| 单指拖动 | 旋转视角 |
| 双指捏合 | 缩放 |
| 双指拖动 | 平移 |
移动端优化
javascript
controlSettings: {
enableRotate: true,
enableZoom: true,
enablePan: true,
rotateSpeed: 0.5, // 移动端降低旋转速度
zoomSpeed: 0.5, // 移动端降低缩放速度
touchZoomSpeed: 0.3 // 触摸缩放速度
}完整示例
vue
<template>
<div class="chart-container">
<RayBar
:option="chartOption"
@click="handleClick"
@mouseover="handleMouseOver"
@mouseout="handleMouseOut"
/>
<div v-if="hoveredData" class="tooltip">
{{ hoveredData.name }}: {{ hoveredData.value }}
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { RayBar } from 'raychart'
const hoveredData = ref(null)
const chartOption = ref({
series: [{ data: [120, 200, 150, 80, 70, 110, 130] }],
xAxis3D: { data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] },
controlSettings: {
enableRotate: true,
enableZoom: true,
enablePan: true,
autoRotate: false,
rotateSpeed: 1.0,
zoomSpeed: 1.0,
minDistance: 20,
maxDistance: 100
}
})
const handleClick = (params) => {
console.log('点击:', params.name, params.value)
}
const handleMouseOver = (params) => {
hoveredData.value = params
}
const handleMouseOut = () => {
hoveredData.value = null
}
</script>
<style scoped>
.chart-container {
position: relative;
}
.tooltip {
position: absolute;
top: 10px;
right: 10px;
background: rgba(0, 0, 0, 0.8);
color: white;
padding: 8px 12px;
border-radius: 4px;
font-size: 14px;
}
</style>性能建议
- 避免频繁更新 - 事件处理中避免频繁更新配置
- 使用防抖 - 高频事件(mousemove)使用防抖
- 合理设置范围 - 限制交互范围提升体验
- 移动端优化 - 降低移动端交互速度
