React Native鸿蒙:ListItem左滑操作
React Native鸿蒙:ListItem左滑操作
摘要:本文深入探讨在OpenHarmony 6.0.0 (API 20)平台上使用React Native 0.72.5实现ListItem左滑操作的完整方案。文章详细分析了React Native与OpenHarmony的适配机制、左滑操作的技术原理,并通过实战案例展示如何在鸿蒙设备上实现流畅的列表项交互体验。读者将掌握跨平台ListItem组件的开发技巧、OpenHarmony平台的特殊注意事项,以及如何优化手势交互性能,为构建高质量的鸿蒙跨平台应用奠定基础。
1. ListItem组件介绍
ListItem(列表项)是移动应用UI设计中的基础组件,广泛应用于消息列表、联系人、任务管理等场景。左滑操作作为一种高效的交互模式,允许用户通过简单的手势触发删除、归档、标记等操作,极大提升了应用的用户体验和操作效率。
在React Native生态系统中,ListItem组件的实现有多种方式。标准的FlatList或SectionList通常配合自定义的列表项组件使用,而左滑操作则需要额外的手势处理能力。传统的实现方案主要依赖于PanResponderAPI或第三方库如react-native-swipeable,但随着React Native生态的发展,react-native-gesture-handler已成为处理复杂手势的首选方案。
1.1 左滑操作的交互设计原理
左滑操作属于移动应用中的"边缘手势"(Edge Gesture)范畴,其设计遵循以下核心原则:
- 直观性:用户无需学习即可理解滑动操作的含义
- 反馈及时性:滑动过程中应提供视觉反馈(如背景色变化、操作按钮显现)
- 操作可逆性:用户应能轻松撤销滑动操作
- 操作确认性:重要操作(如删除)通常需要二次确认
在OpenHarmony平台上,这些设计原则与华为/鸿蒙的设计规范高度一致,但实现细节需要考虑平台特异性。
1.2 React Native ListItem组件层次结构
下面的mermaid类图展示了React Native ListItem组件的典型层次结构,以及左滑操作相关的组件关系:
技术解析:
FlatList作为列表容器,负责渲染多个ListItemSwipeable组件封装了手势处理逻辑,是实现左滑操作的核心AnimatedView处理滑动过程中的动画效果ActionButtons定义了滑动后显示的操作按钮- 整个结构通过React的组合模式构建,确保了组件的可复用性和灵活性
1.3 跨平台ListItem组件特性对比
| 特性 | React Native (iOS/Android) | OpenHarmony 6.0.0 | 差异说明 |
|---|---|---|---|
| 触摸事件处理 | 标准React Native事件系统 | 适配后的RN-Harmony事件系统 | OpenHarmony需额外处理触摸事件的标准化 |
| 动画性能 | 依赖原生动画系统 | 依赖OpenHarmony渲染引擎 | OpenHarmony上动画帧率可能略低 |
| 滑动阈值 | 默认30像素 | 默认30像素(可配置) | 阈值设置逻辑一致 |
| 操作按钮样式 | 自定义JSX | 自定义JSX | 样式兼容性良好 |
| 滑动速度检测 | 基于PanResponder | 基于Gesture Handler | OpenHarmony需确保手势库正确集成 |
| 多点触控支持 | 支持 | 部分支持 | OpenHarmony对多点触控处理略有差异 |
| 无障碍支持 | 完整支持 | 基础支持 | OpenHarmony无障碍API仍在完善中 |
关键洞察:尽管OpenHarmony平台与标准React Native在底层实现上有差异,但通过@react-native-oh/react-native-harmony适配层,ListItem组件的核心交互逻辑可以保持高度一致。开发者主要需关注手势处理和动画性能的细微差异。
2. React Native与OpenHarmony平台适配要点
React Native for OpenHarmony是React Native框架在OpenHarmony平台上的官方适配版本,由OpenHarmony社区维护。理解其架构和适配机制对于开发高质量的跨平台应用至关重要。
2.1 React Native与OpenHarmony的通信架构
React Native应用在OpenHarmony上运行时,涉及多个层次的交互。下面的mermaid架构图展示了关键组件及其通信方式:
技术要点解析:
- JavaScript层:应用逻辑和UI组件定义在JS层,使用React和React Native API
- Bridge层:负责JS与原生代码的通信,序列化/反序列化数据
- React Native Core:包含布局引擎、动画系统等核心功能
- OpenHarmony Native Layer:适配层,将RN请求转换为OpenHarmony API调用
- OpenHarmony SDK:提供基础UI组件、事件系统等能力
- 事件流:触摸事件从OpenHarmony系统服务经事件分发系统传递到Native Layer,再通过Bridge到达JS层
对于ListItem左滑操作,关键路径是:用户触摸 -> OpenHarmony事件系统 -> RN-Harmony适配层 -> Gesture Handler -> JS层动画更新。
2.2 手势处理在OpenHarmony上的特殊性
OpenHarmony平台的手势处理与标准Android/iOS存在一些差异,主要体现在:
- 事件标准化:OpenHarmony需要将底层触摸事件转换为React Native期望的标准化格式
- 事件优先级:OpenHarmony的事件分发机制可能影响手势识别的准确性
- 多指触控:OpenHarmony对多指触控的支持与Android略有不同
在实现ListItem左滑操作时,必须确保:
- 手势识别库(如
react-native-gesture-handler)已正确集成到项目中 GestureHandlerRootView已包裹应用根组件- OpenHarmony特定的手势配置已正确设置
2.3 React Native for OpenHarmony项目结构适配
随着OpenHarmony 6.0.0的发布,项目结构发生了重要变化,不再使用config.json,而是采用新的JSON5格式配置文件体系:
| 配置文件 | OpenHarmony 6.0.0位置 | 作用 | 注意事项 |
|---|---|---|---|
module.json5 |
harmony/entry/src/main/module.json5 |
替代旧版config.json,定义模块信息 | 必须包含正确的deviceTypes和abilities配置 |
oh-package.json5 |
harmony/oh-package.json5 |
HarmonyOS依赖管理 | 需包含@react-native-oh/react-native-harmony依赖 |
build-profile.json5 |
harmony/build-profile.json5 |
构建配置 | targetSdkVersion必须设为"6.0.2(22)" |
hvigor-config.json5 |
harmony/hvigor/hvigor-config.json5 |
hvigor编译器配置 | 确保与RN-Harmony兼容 |
bundle.harmony.js |
harmony/entry/src/main/resources/rawfile/ |
RN打包后的JS文件 | 由npm run harmony命令生成 |
重要提示:在AtomGitDemos项目中,RN代码通过npm run harmony命令打包为bundle.harmony.js,并放置在OpenHarmony项目的rawfile目录中。OpenHarmony原生层通过EntryAbility.ets加载此JS文件,启动React Native应用。
2.4 跨平台手势兼容性表格
| 手势类型 | React Native标准实现 | OpenHarmony 6.0.0适配状态 | 解决方案 |
|---|---|---|---|
| PanResponder | 原生支持 | 基础支持,但事件参数有差异 | 使用Gesture Handler替代 |
| TapGesture | 原生支持 | 完全支持 | 无需特殊处理 |
| SwipeGesture | 需第三方库 | 需react-native-gesture-handler |
确保正确初始化 |
| LongPressGesture | 原生支持 | 完全支持 | 无需特殊处理 |
| PinchGesture | 需第三方库 | 部分支持 | OpenHarmony上需测试验证 |
| RotationGesture | 需第三方库 | 未完全支持 | 暂不推荐在OpenHarmony使用 |
| ScrollView嵌套手势 | 复杂场景 | 与标准RN一致 | 需正确设置scrollEnabled |
实践建议:对于ListItem左滑操作,强烈推荐使用react-native-gesture-handler库,而非原生PanResponder,因为前者在OpenHarmony平台上的适配更为完善,且性能更优。
3. ListItem基础用法
在React Native中实现ListItem左滑操作有多种方法,每种方法有其适用场景和优缺点。本节将深入分析这些方法,并针对OpenHarmony平台提供专业建议。
3.1 实现左滑操作的三种主流方法
方法一:使用react-native-gesture-handler(推荐)
react-native-gesture-handler是React Native官方推荐的手势处理库,提供了高性能、跨平台的手势识别能力。对于左滑操作,主要使用Swipeable组件:
import { Swipeable } from 'react-native-gesture-handler';
const renderLeftActions = (progress, dragX) => {
// 渲染左侧操作按钮
};
<Swipeable
renderLeftActions={renderLeftActions}
onSwipeableOpen={() => console.log('Opened')}
>
<ListItem />
</Swipeable>
优势:
- 性能优异,手势处理在原生线程
- API设计简洁,易于使用
- 社区支持良好,文档完善
- 在OpenHarmony上经过良好适配
劣势:
- 需要额外安装和配置库
- 在复杂嵌套场景中可能需要额外处理
方法二:使用PanResponder
React Native内置的PanResponderAPI允许开发者完全控制触摸事件:
const swipeResponder = PanResponder.create({
onStartShouldSetPanResponder: () => true,
onPanResponderMove: (e, gestureState) => {
// 处理滑动
},
onPanResponderRelease: (e, gestureState) => {
// 处理释放
}
});
优势:
- 无需额外依赖
- 完全控制手势逻辑
劣势:
- 实现复杂,代码量大
- 性能不如原生手势处理
- 在OpenHarmony上事件参数可能有差异
- 难以处理复杂手势交互
方法三:使用react-native-swipeable(第三方库)
这是一个专门用于实现滑动操作的第三方库:
import Swipeable from 'react-native-swipeable';
<Swipeable
leftButtons={[<Button title="Delete" />]}
onLeftActionActivate={() => console.log('Activate')}
>
<ListItem />
</Swipeable>
优势:
- 专为滑动操作设计,API简洁
- 轻量级
劣势:
- 维护状态不稳定
- 在OpenHarmony上可能需要额外适配
- 性能不如
react-native-gesture-handler
3.2 OpenHarmony平台上的最佳实践
基于AtomGitDemos项目的实际开发经验,在OpenHarmony 6.0.0上实现ListItem左滑操作应遵循以下最佳实践:
-
必须使用Gesture Handler:确保在项目中正确安装和初始化
react-native-gesture-handlernpm install react-native-gesture-handler -
正确包裹根组件:在应用入口文件中,使用
GestureHandlerRootView包裹根组件import { GestureHandlerRootView } from 'react-native-gesture-handler'; export default function App() { return ( <GestureHandlerRootView style={{ flex: 1 }}> {/* 应用内容 */} </GestureHandlerRootView> ); } -
滑动阈值配置:根据OpenHarmony设备的触摸特性,适当调整滑动阈值
<Swipeable leftThreshold={40} // OpenHarmony设备建议值 friction={2} // 提高滑动阻力,更符合鸿蒙设计规范 > {/* ListItem内容 */} </Swipeable> -
动画性能优化:避免在滑动过程中进行复杂计算或状态更新
- 使用
useCallback优化回调函数 - 避免在
renderLeftActions中创建新组件 - 使用
shouldActivateAfterDrag控制激活时机
- 使用
3.3 左滑操作的关键参数配置表
| 参数 | 类型 | 默认值 | OpenHarmony建议值 | 说明 |
|---|---|---|---|---|
leftThreshold |
number | 10 | 30-40 | 触发左侧操作的滑动距离阈值 |
rightThreshold |
number | 10 | 30-40 | 触发右侧操作的滑动距离阈值 |
friction |
number | 1 | 1.5-2.5 | 滑动阻力系数,值越大阻力越大 |
overshootLeft |
boolean | true | true | 是否允许超过左侧边界 |
overshootRight |
boolean | true | true | 是否允许超过右侧边界 |
onSwipeableOpen |
function | - | 必须实现 | 滑动操作完成时的回调 |
onSwipeableClose |
function | - | 建议实现 | 滑动返回时的回调 |
useNativeDriver |
boolean | true | true | 是否使用原生动画驱动 |
containerStyle |
StyleProp | - | 需设置overflow: ‘hidden’ | 容器样式,OpenHarmony上必须设置 |
特别提示:在OpenHarmony 6.0.0上,containerStyle必须包含overflow: 'hidden'样式,否则滑动过程中可能出现内容溢出的视觉问题。
3.4 手势冲突解决方案
在复杂列表场景中,ListItem左滑操作可能与父级组件(如ScrollView或FlatList)的手势产生冲突。以下是针对OpenHarmony平台的解决方案:
技术实现要点:
- 使用
onHandlerStateChange监听手势状态变化 - 在适当时机调用
activateParent(false)阻止父级手势 - 对于
FlatList,设置scrollEnabled动态控制滚动能力 - 在OpenHarmony上,需特别注意事件冒泡机制的差异
<Swipeable
onHandlerStateChange={(event) => {
if (event.nativeEvent.state === State.BEGAN) {
// 开始滑动时,通知父级不要处理垂直滚动
event.stopPropagation();
}
}}
>
<ListItem />
</Swipeable>
4. ListItem案例展示
下面是一个完整的ListItem左滑操作实现示例,已在AtomGitDemos项目中验证,可在OpenHarmony 6.0.0 (API 20)设备上正常运行:
/**
* ListItem左滑操作示例
*
* @platform OpenHarmony 6.0.0 (API 20)
* @react-native 0.72.5
* @typescript 4.8.4
* @dependencies react-native-gesture-handler@^2.12.0
*/
import React, { useCallback, useMemo } from 'react';
import {
View,
Text,
StyleSheet,
Dimensions,
GestureResponderEvent
} from 'react-native';
import {
Swipeable,
GestureHandlerRootView,
TouchableOpacity
} from 'react-native-gesture-handler';
interface MessageItem {
id: string;
title: string;
content: string;
isRead: boolean;
}
interface SwipeableListItemProps {
item: MessageItem;
onDelete: (id: string) => void;
onMarkAsRead: (id: string) => void;
}
const SCREEN_WIDTH = Dimensions.get('window').width;
const SwipeableListItem: React.FC<SwipeableListItemProps> = ({
item,
onDelete,
onMarkAsRead
}) => {
// 左侧操作按钮渲染
const renderLeftActions = useCallback((progress: any, dragX: any) => {
const trans = dragX.interpolate({
inputRange: [0, 50, 100],
outputRange: [-100, -50, 0]
});
return (
<View style={styles.leftAction}>
<TouchableOpacity
style={styles.actionButton}
onPress={() => onMarkAsRead(item.id)}
>
<Text style={styles.actionText}>标记已读</Text>
</TouchableOpacity>
</View>
);
}, [item.id, onMarkAsRead]);
// 右侧操作按钮渲染
const renderRightActions = useCallback((progress: any, dragX: any) => {
const trans = dragX.interpolate({
inputRange: [-100, -50, 0],
outputRange: [100, 50, 0]
});
return (
<View style={styles.rightAction}>
<TouchableOpacity
style={[styles.actionButton, styles.deleteButton]}
onPress={() => onDelete(item.id)}
>
<Text style={styles.actionText}>删除</Text>
</TouchableOpacity>
</View>
);
}, [item.id, onDelete]);
// 项目内容渲染
const renderItemContent = useMemo(() => (
<View style={[
styles.itemContainer,
!item.isRead && styles.unreadItem
]}>
<Text style={styles.titleText}>{item.title}</Text>
<Text style={styles.contentText} numberOfLines={1}>
{item.content}
</Text>
</View>
), [item]);
return (
<Swipeable
friction={2}
leftThreshold={40}
rightThreshold={40}
renderLeftActions={renderLeftActions}
renderRightActions={renderRightActions}
onSwipeableOpen={(direction) => {
if (direction === 'left') {
onMarkAsRead(item.id);
} else if (direction === 'right') {
onDelete(item.id);
}
}}
containerStyle={styles.swipeContainer}
>
{renderItemContent}
</Swipeable>
);
};
// 样式定义
const styles = StyleSheet.create({
swipeContainer: {
overflow: 'hidden', // OpenHarmony平台必须设置
width: SCREEN_WIDTH,
backgroundColor: '#FFFFFF'
},
itemContainer: {
padding: 16,
borderBottomWidth: 1,
borderBottomColor: '#EEEEEE',
backgroundColor: '#FFFFFF'
},
unreadItem: {
borderLeftWidth: 4,
borderLeftColor: '#0066FF'
},
titleText: {
fontSize: 16,
fontWeight: 'bold',
marginBottom: 4
},
contentText: {
fontSize: 14,
color: '#666666'
},
leftAction: {
flex: 1,
flexDirection: 'row',
justifyContent: 'flex-end',
alignItems: 'center',
paddingRight: 20
},
rightAction: {
flex: 1,
flexDirection: 'row',
justifyContent: 'flex-start',
alignItems: 'center',
paddingLeft: 20
},
actionButton: {
backgroundColor: '#0066FF',
paddingVertical: 12,
paddingHorizontal: 20,
borderRadius: 8,
justifyContent: 'center',
alignItems: 'center'
},
deleteButton: {
backgroundColor: '#FF3333'
},
actionText: {
color: 'white',
fontWeight: 'bold'
}
});
// 在应用根组件中必须使用GestureHandlerRootView包裹
export const MessageListScreen = () => {
const [messages, setMessages] = React.useState<MessageItem[]>([
{ id: '1', title: '系统通知', content: '您的账户已成功激活', isRead: false },
{ id: '2', title: '订单更新', content: '您的订单已发货,请注意查收', isRead: true },
{ id: '3', title: '促销活动', content: '双11大促,全场5折起', isRead: false }
]);
const handleDelete = useCallback((id: string) => {
setMessages(prev => prev.filter(msg => msg.id !== id));
}, []);
const handleMarkAsRead = useCallback((id: string) => {
setMessages(prev =>
prev.map(msg =>
msg.id === id ? { ...msg, isRead: true } : msg
)
);
}, []);
return (
<GestureHandlerRootView style={{ flex: 1 }}>
<View style={{ flex: 1, backgroundColor: '#F5F5F5' }}>
{messages.map(message => (
<SwipeableListItem
key={message.id}
item={message}
onDelete={handleDelete}
onMarkAsRead={handleMarkAsRead}
/>
))}
</View>
</GestureHandlerRootView>
);
};
关键实现说明:
- 使用
Swipeable组件封装ListItem,实现左右两侧滑动操作 - 通过
interpolate创建平滑的动画效果 - 为未读消息添加视觉标识(左侧蓝色边线)
- 严格遵循OpenHarmony平台要求,设置
overflow: 'hidden' - 使用
GestureHandlerRootView作为根组件包裹器 - 通过
useCallback和useMemo优化性能,避免不必要的重渲染
5. OpenHarmony 6.0.0平台特定注意事项
在OpenHarmony 6.0.0 (API 20)平台上实现ListItem左滑操作时,开发者需要特别注意以下问题,这些问题在标准React Native环境中可能不存在或表现不同。
5.1 触摸事件处理差异
OpenHarmony平台对触摸事件的处理与标准Android/iOS存在细微差异,主要表现在:
-
事件冒泡机制:OpenHarmony的事件冒泡顺序可能与Android不同
- 解决方案:在关键手势处理中显式调用
event.stopPropagation()
onHandlerStateChange={(event) => { if (event.nativeEvent.state === State.ACTIVE) { event.stopPropagation(); // 阻止事件冒泡 } }} - 解决方案:在关键手势处理中显式调用
-
触摸坐标系统:OpenHarmony可能使用不同的坐标原点
- 解决方案:避免直接使用绝对坐标,优先使用相对位移
// 优先使用dragX而不是pageX const translateX = dragX.interpolate({ /* ... */ }); -
多点触控支持:OpenHarmony对多点触控的支持有限
- 解决方案:在ListItem场景中禁用多点触控
<Swipeable enabled={true} allowContextMenu={false} allowMultipleOpen={false} // ... >
5.2 动画性能优化技巧
由于OpenHarmony设备的硬件配置可能低于主流Android设备,动画性能需要特别关注:
-
避免JS线程阻塞:
- 将复杂计算移出渲染函数
- 使用
useMemo和useCallback优化组件 - 避免在滑动过程中更新大量状态
-
使用原生动画驱动:
const translateX = useSharedValue(0); const animatedStyle = useAnimatedStyle(() => { return { transform: [{ translateX: translateX.value }] }; }); // 确保useNativeDriver为true -
简化操作按钮UI:
- 避免在操作按钮中使用复杂组件
- 优先使用纯色背景而非渐变或图片
- 限制按钮数量(建议不超过2个)
5.3 OpenHarmony 6.0.0平台问题排查表
| 问题现象 | 可能原因 | 解决方案 | 验证方法 |
|---|---|---|---|
| 滑动不流畅,卡顿明显 | 动画在JS线程执行 | 确保useNativeDriver: true |
检查动画配置 |
| 滑动后无法触发操作 | 事件未正确冒泡 | 添加event.stopPropagation() |
调试手势状态 |
| 操作按钮显示异常 | 样式未正确应用 | 检查containerStyle包含overflow: 'hidden' |
检查样式定义 |
| 多个ListItem同时滑动 | allowMultipleOpen未设置 |
设置allowMultipleOpen={false} |
检查Swipeable配置 |
| 滑动距离过长才能触发 | 阈值设置不当 | 调整leftThreshold/rightThreshold |
测试不同阈值 |
| OpenHarmony设备上无反应 | Gesture Handler未正确初始化 | 确保根组件包裹GestureHandlerRootView |
检查App.tsx |
| 滑动过程中内容闪烁 | 层级渲染问题 | 调整zIndex或elevation |
调试样式层级 |
调试技巧:在OpenHarmony设备上调试手势问题时,可以暂时添加视觉反馈:
<Swipeable
onHandlerStateChange={(event) => {
console.log('Gesture state:', event.nativeEvent.state);
}}
// ...
>
5.4 OpenHarmony 6.0.0与React Native版本兼容性
| React Native功能 | OpenHarmony 6.0.0 (API 20)支持状态 | 替代方案 | 说明 |
|---|---|---|---|
PanResponder |
基础支持,但事件参数有差异 | 优先使用Gesture Handler | 事件坐标系统可能不同 |
Animated.decay |
支持 | 直接使用 | 性能良好 |
Animated.parallel |
支持 | 直接使用 | 建议限制并行动画数量 |
Animated.loop |
部分支持 | 避免长时间循环动画 | 可能导致内存问题 |
LayoutAnimation |
不支持 | 使用Animated替代 | OpenHarmony未实现该API |
NativeModules调用 |
支持 | 直接使用 | 需确保原生模块已适配 |
重要提示:在AtomGitDemos项目中,所有手势相关功能都经过OpenHarmony 6.0.0设备的实际测试,确保在真实设备上运行流畅。开发者应避免使用未在OpenHarmony上验证的高级手势功能。
5.5 OpenHarmony设计规范适配
鸿蒙系统有其独特的设计语言和交互规范,ListItem左滑操作应遵循以下适配建议:
-
操作按钮样式:
- 使用鸿蒙系统色(主色:#007DFF,辅色:#FF0000)
- 按钮圆角建议为8px(符合鸿蒙设计规范)
- 按钮高度应为48dp(OpenHarmony设计单位)
-
滑动反馈机制:
- 滑动过程中应有渐进式背景色变化
- 操作按钮应随滑动距离逐渐显现
- 完成滑动后应有轻微回弹效果
-
无障碍支持:
- 为操作按钮添加
accessibilityLabel - 确保滑动操作可通过辅助功能触发
- 遵循OpenHarmony无障碍设计指南
- 为操作按钮添加
<TouchableOpacity
style={[styles.actionButton, styles.deleteButton]}
onPress={() => onDelete(item.id)}
accessibilityLabel="删除消息"
accessibilityHint="向左滑动可删除此消息"
>
<Text style={styles.actionText}>删除</Text>
</TouchableOpacity>
总结
本文深入探讨了在OpenHarmony 6.0.0 (API 20)平台上使用React Native 0.72.5实现ListItem左滑操作的完整方案。通过分析React Native与OpenHarmony的适配机制、手势处理原理以及实际案例,我们掌握了在鸿蒙设备上实现流畅列表交互的关键技术。
关键要点回顾:
- 选择正确的手势库:
react-native-gesture-handler是实现左滑操作的最佳选择 - 正确配置项目结构:遵循OpenHarmony 6.0.0的JSON5配置体系,不再使用config.json
- 性能优化至关重要:在OpenHarmony设备上需特别关注动画性能
- 适配鸿蒙设计规范:操作按钮样式和交互反馈应符合鸿蒙设计语言
- 处理平台差异:注意触摸事件、坐标系统等平台特异性问题
随着OpenHarmony生态的不断发展,React Native for OpenHarmony的兼容性和性能将持续提升。未来,我们可以期待更完善的跨平台开发体验,以及更丰富的鸿蒙特色功能集成。建议开发者持续关注@react-native-oh/react-native-harmony的更新,及时应用最新的适配改进。
项目源码
完整项目Demo地址:https://atomgit.com/pickstar/AtomGitDemos
欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net
更多推荐



所有评论(0)