本文将深入分析一个基于 React Native 构建的搜索结果应用,该应用展示了如何实现一个功能完整的商品搜索系统,同时兼顾了 React Native 与 HarmonyOS 的跨端兼容性。

数据结构

首先,我们来看一下核心数据结构的定义:

// 搜索商品类型
type SearchProduct = {
  id: string;
  name: string;
  category: string;
  price: number;
  originalPrice?: number;
  image: string;
  description: string;
  brand: string;
  rating: number; // 评分 1-5
  isOnSale?: boolean; // 是否促销
};

这个类型定义体现了良好的 TypeScript 实践,通过可选属性(originalPriceisOnSale)和明确的类型标注,为商品数据提供了严格的类型约束。特别值得注意的是,rating 字段的注释明确了其取值范围为 1-5,brand 字段为必填项,这些设计都增强了代码的可读性和可维护性。

状态管理

应用采用了 React 的 useState Hook 进行状态管理:

const [searchQuery, setSearchQuery] = useState('');
const [products] = useState<SearchProduct[]>([
  {
    id: '1',
    name: '无线蓝牙耳机',
    category: '数码配件',
    price: 199,
    originalPrice: 299,
    image: '🎧',
    description: '主动降噪,续航20小时',
    brand: 'SoundMax',
    rating: 4.5,
    isOnSale: true
  },
  // 更多商品数据...
]);

这里分别管理了搜索关键词和商品数据两个状态。搜索关键词状态是可变的,通过 setSearchQuery 函数更新;而商品数据状态在这个组件中是静态的,只获取了状态值而没有解构出更新函数。

UI 组件

应用的 UI 架构清晰明了,主要包含以下几个部分:

  1. 安全区域容器:使用 SafeAreaView 确保内容在各种设备上都能正确显示,避免被刘海屏或系统导航栏遮挡。
  2. 搜索头部:包含搜索输入框和操作按钮(筛选、排序),实现了核心的搜索功能。
  3. 搜索结果统计:显示找到的商品数量,提供直观的搜索结果反馈。
  4. 商品列表:使用 ScrollView 实现了可滚动的商品卡片列表,每个卡片包含商品图片、名称、品牌、描述、评分、价格等信息。

响应式布局

应用使用了 StyleSheet 进行样式管理,同时结合 Dimensions API 实现了响应式布局:

const { width, height } = Dimensions.get('window');

这种方式使得应用能够根据不同设备的屏幕尺寸自动调整布局,提高了跨设备的兼容性。特别值得一提的是,搜索头部和商品卡片的设计采用了 flexbox 布局,确保了在不同屏幕宽度下的良好显示效果。

业务逻辑

应用实现了以下核心业务逻辑:

  1. 搜索功能:通过 handleSearch 函数实现,当用户输入关键词并点击搜索按钮时,弹出搜索提示。
  2. 商品对比:通过 handleCompare 函数实现,点击商品对比按钮时,将商品加入对比列表。
  3. 筛选功能:通过 handleFilter 函数实现,点击筛选按钮时,打开筛选面板。
  4. 排序功能:通过 handleSort 函数实现,点击排序按钮时,打开排序选项。

应用在设计时充分考虑了 React Native 与 HarmonyOS 的跨端兼容性:

  1. 组件兼容性:使用的 SafeAreaViewScrollViewTouchableOpacityTextInput 等组件在 React Native 和 HarmonyOS 中都有对应实现。
  2. API 兼容性:使用的 Dimensions API 和 Alert API 在两个平台上都可用。
  3. 样式兼容性:使用的 StyleSheet API 在两个平台上的使用方式基本一致。

搜索系统

应用展示了一个完整的搜索系统前端架构,包括搜索输入、结果统计、商品展示、对比、筛选和排序功能。这种架构设计可以直接应用于实际的电商应用中。

用户交互

应用实现了流畅的用户交互,包括:

  • 搜索输入框的实时输入和提交
  • 搜索按钮的点击事件
  • 筛选和排序按钮的点击事件
  • 商品卡片的信息展示
  • 商品对比功能

视觉设计

应用采用了现代化的视觉设计,包括:

  • 清晰的布局结构
  • 合理的色彩搭配
  • 直观的图标使用
  • 信息层次分明的商品卡片设计

代码结构清晰,逻辑分明,采用了现代化的 React 开发实践:

  • 使用函数式组件和 Hooks
  • 使用 TypeScript 进行类型定义
  • 使用 StyleSheet 进行样式管理
  • 模块化的业务逻辑函数

  1. 虚拟列表实现:当商品数量较多时,建议使用 FlatList 替代 ScrollViewmap 函数,实现虚拟滚动,提高渲染性能。
  2. 搜索防抖:实现搜索输入的防抖功能,避免用户快速输入时频繁触发搜索请求。
  3. 图片加载优化:在实际生产环境中,建议使用图片懒加载和缓存机制,提高图片加载性能。

  1. 高级搜索功能:可以实现更复杂的搜索功能,如多条件搜索、搜索历史记录、热门搜索推荐等。
  2. 筛选功能完善:可以实现更详细的筛选功能,如按价格区间、品牌、评分等进行筛选。
  3. 排序功能完善:可以实现多种排序方式,如按价格、评分、销量等进行排序。
  4. 商品对比功能:可以实现更完善的商品对比功能,支持多个商品的详细对比。

代码结构

  1. 组件拆分:建议将搜索输入框、商品卡片、操作按钮等可复用的 UI 元素拆分为独立的组件,提高代码的复用性。
  2. 状态管理扩展:当应用规模扩大时,建议使用 useReducer 或 Redux 等状态管理库,提高状态管理的可扩展性。
  3. API 集成:在实际生产环境中,建议集成后端 API,实现真实的数据搜索和获取。

  1. 平台特定代码处理:使用 Platform.OS 检测当前平台,针对不同平台实现特定的功能或样式。
  2. HarmonyOS 适配:针对 HarmonyOS 的特性,进行相应的适配,如调整布局、优化性能等。
  3. 测试覆盖:在两个平台上进行充分的测试,确保应用在不同平台上的表现一致。

搜索输入实现

应用使用 TextInput 组件实现了搜索输入功能,通过 valueonChangeText 属性实现了受控组件,确保了搜索关键词状态的一致性。同时,通过 onSubmitEditing 属性实现了按下回车键提交搜索的功能。

商品卡片

商品卡片设计考虑了信息的层次结构,从上到下依次展示:

  • 商品图片
  • 商品名称
  • 商品品牌
  • 商品描述
  • 商品评分和评论数
  • 商品价格(当前价格、原价、促销标签)

这种信息层次设计符合用户的浏览习惯,有助于用户快速获取商品的关键信息。

价格展示

应用实现了灵活的价格展示逻辑,包括:

  • 显示当前价格
  • 当存在原价时,显示原价并添加删除线效果
  • 当商品处于促销状态时,显示促销标签

这种设计使得价格信息更加直观,突出了商品的优惠信息。

评分展示

应用实现了商品评分的展示,包括评分星星图标和具体的评分值,同时显示了评论数量,为用户提供了更多的商品参考信息。

本文分析的搜索结果应用展示了如何使用 React Native 构建一个功能完整的商品搜索系统,包括搜索输入、结果统计、商品展示、对比、筛选和排序功能。应用采用了现代化的 React 开发实践,包括函数式组件、Hooks、TypeScript 和 StyleSheet,同时充分考虑了 React Native 与 HarmonyOS 的跨端兼容性。


商品搜索类应用的核心挑战在于“检索交互流畅性、筛选排序逻辑完整性、跨端体验一致性”,而 React Native 凭借其“一次开发、多端部署”的技术特性,成为连接 iOS、Android 与鸿蒙(HarmonyOS)系统的最优技术选型。本文以商品搜索结果应用为例,从搜索交互设计、鸿蒙风格 UI 实现、筛选排序逻辑等核心维度,深度解析 React Native 对接鸿蒙系统的技术内核与商品检索场景的落地最佳实践。

一、搜索结果

本搜索结果应用聚焦商品检索、筛选排序、商品对比、价格展示等核心电商搜索场景,覆盖多维度商品属性(品牌、评分、促销状态等)的完整展示链路,整体架构遵循 React Native 组件化开发范式,同时深度契合鸿蒙系统的设计语言与电商搜索类应用的交互规范。从技术底层来看,应用基于 React 函数式组件 + TypeScript 构建,这种组合既保证了搜索数据的类型安全,又能最大化跨端复用率,是 React Native 适配鸿蒙系统电商搜索类应用的理想技术底座。

1. 搜索结果跨端

商品搜索类应用涉及多维度的商品属性(品牌、评分、促销状态、价格体系等),统一且精准的强类型数据模型是避免多端行为不一致的关键。代码中通过 TypeScript 严格定义了搜索商品的核心数据结构,覆盖电商搜索全场景的业务属性:

// 搜索商品核心数据模型
type SearchProduct = {
  id: string;
  name: string;
  category: string;
  price: number;
  originalPrice?: number;
  image: string;
  description: string;
  brand: string;
  rating: number; // 评分 1-5
  isOnSale?: boolean; // 是否促销
};

这种场景化的强类型定义不仅在开发阶段提供语法校验和智能提示,更关键的是在鸿蒙系统适配时,能够与 ArkTS 的类型系统形成天然映射。相较于纯 JavaScript 开发,TypeScript 可有效规避因数据类型模糊导致的商品评分展示错误、促销状态判断偏差等问题——尤其是在鸿蒙这类面向全场景智慧终端的操作系统中,类型安全能大幅降低多设备适配的调试成本,确保商品价格、品牌、评分等核心搜索数据在不同终端的一致性。

2. 双向绑定状态管理:

应用采用 React 内置的 useState Hook 实现搜索关键词的双向绑定,结合不可变数据模式管理商品列表状态,适配鸿蒙系统的交互响应规范:

const [searchQuery, setSearchQuery] = useState('');
const [products] = useState<SearchProduct[]>([
  {
    id: '1',
    name: '无线蓝牙耳机',
    category: '数码配件',
    price: 199,
    originalPrice: 299,
    image: '🎧',
    description: '主动降噪,续航20小时',
    brand: 'SoundMax',
    rating: 4.5,
    isOnSale: true
  },
  // 其他搜索商品数据
]);

这种状态管理方案中,searchQuery 的双向绑定完美契合鸿蒙系统对输入类组件的交互要求,相较于 Redux 等重型状态库,useState 无需额外的中间件和适配层,能够直接在 React Native 支持的所有平台(包括鸿蒙)上稳定运行。从鸿蒙系统的视角来看,useState 实现的状态响应逻辑与 ArkUI 的 @State 装饰器在设计理念上高度契合,开发者无需切换思维模式即可完成跨端搜索交互的状态管理,大幅降低了鸿蒙适配的学习成本。


React Native 的核心价值在于通过统一的组件抽象层,屏蔽不同平台的 UI 实现差异。本应用在 UI 层的设计深度复刻了鸿蒙系统的视觉风格与电商搜索类应用交互规范,同时保证多端体验的一致性,尤其针对搜索输入框、筛选排序按钮、商品卡片等核心元素做了专属适配。

1. Flex 布局

应用基于 React Native 的 Flex 布局系统构建整体界面,通过 Dimensions.get('window') 获取设备宽高,实现对不同尺寸鸿蒙设备(手机、平板、智慧屏)的自适应:

const { width, height } = Dimensions.get('window');

相较于鸿蒙系统的 DirectionalLayoutGridLayout,React Native 的 Flex 布局具备更强的跨端兼容性,通过 flexDirectionflex: 1justifyContent 等属性,能够精准还原鸿蒙系统的搜索结果界面布局逻辑。例如搜索栏的布局实现,通过 flex: 1 保证输入框在不同屏幕尺寸下的自适应:

<View style={styles.searchContainer}>
  <TextInput
    style={styles.searchInput}
    placeholder="输入商品关键词..."
    value={searchQuery}
    onChangeText={setSearchQuery}
    onSubmitEditing={handleSearch}
  />
  <TouchableOpacity 
    style={styles.searchButton}
    onPress={handleSearch}
  >
    <Text style={styles.searchIcon}>🔍</Text>
  </TouchableOpacity>
</View>

这段代码通过 flex: 1 赋予输入框自适应父容器宽度的能力,结合 flexDirection: 'row' 的横向布局,在不同尺寸的鸿蒙设备上都能保持搜索栏的合理展示比例,无需针对鸿蒙系统做额外的布局适配。

2. 视觉样式:

应用通过 StyleSheet.create 定义样式表,深度适配鸿蒙系统的商品搜索设计规范,核心体现在以下几个维度:

  • 搜索结果色彩体系:采用鸿蒙系统的科技感中性色系主色调(#f1f5f9#1e293b),搭配功能性色彩区分交互元素(搜索按钮-蓝色 #3b82f6、价格-红色 #ef4444、评分-橙色 #f59e0b 等),符合鸿蒙系统电商搜索类应用“清晰、高效”的视觉设计理念
  • 圆角与阴影:使用 borderRadius: 20(搜索框)和 borderRadius: 12(商品卡片)实现鸿蒙风格的差异化圆角设计,通过 elevation(Android)和 shadow(iOS)属性适配鸿蒙系统的阴影效果,兼顾搜索结果界面的层次感与跨端一致性
  • 搜索交互样式:通过精细化样式定义实现鸿蒙风格的搜索输入体验,同时强化商品信息的视觉层级:
<Text style={styles.currentPrice}>¥{product.price}</Text>
{product.originalPrice && (
  <Text style={styles.originalPrice}>¥{product.originalPrice}</Text>
)}
{product.isOnSale && (
  <View style={styles.saleTag}>
    <Text style={styles.saleText}>特价</Text>
  </View>
)}

这种样式设计方案完全基于 React Native 的标准 API 实现,在鸿蒙系统中能够通过 React Native 的渲染层自动转换为原生样式——textDecorationLine 对应鸿蒙的 text-decorationbackgroundColor 对应鸿蒙的 background-color,无需编写平台特定代码。

3. 交互组件:

应用中所有交互组件均基于 React Native 基础组件封装,同时适配鸿蒙系统的商品搜索交互规范,新增的 TextInput 组件更是完美适配鸿蒙的输入交互逻辑:

  • SafeAreaView:对应鸿蒙系统的 SafeArea 组件,适配刘海屏、挖孔屏等异形屏,保证搜索界面在鸿蒙不同终端设备上的完整性
  • TextInput:替代鸿蒙的 TextInput 组件,实现搜索关键词的输入、回显、提交等核心交互,结合 onChangeTextonSubmitEditing 事件,完全契合鸿蒙的输入交互规范
  • ScrollView:与鸿蒙的 List 组件逻辑一致,实现搜索结果的纵向滚动展示,适配鸿蒙系统的滑动交互逻辑
  • TouchableOpacity:替代鸿蒙的 Button 组件,实现搜索、筛选、排序、对比等核心搜索交互,符合鸿蒙的点击反馈规范
  • Alert:对应鸿蒙的 TextDialog 组件,实现搜索反馈、筛选提示、商品对比等弹窗交互,保持与鸿蒙原生电商搜索应用一致的交互体验

以搜索提交交互为例,代码通过输入状态判断实现鸿蒙风格的搜索触发逻辑:

const handleSearch = () => {
  if (searchQuery.trim()) {
    Alert.alert('搜索', `正在搜索: ${searchQuery}`);
  }
};

这种交互逻辑完全基于 React Native 的跨端 API 实现,在鸿蒙系统中能够保持与原生电商搜索应用一致的交互体验,无需针对鸿蒙系统做特殊处理。


除了 UI 层的适配,商品搜索业务逻辑的跨端兼容性是 React Native 开发的核心。本应用的核心业务逻辑包括搜索提交、商品对比、筛选触发、排序触发等,这些逻辑完全基于 JavaScript/TypeScript 实现,天然具备跨端运行能力。

1. 搜索交互

应用实现了基于输入状态的搜索提交逻辑,这是商品搜索场景的核心能力,通过纯函数实现跨端兼容:

const handleSearch = () => {
  if (searchQuery.trim()) {
    Alert.alert('搜索', `正在搜索: ${searchQuery}`);
  }
};

该逻辑通过 trim() 处理输入内容,避免空关键词提交,完全基于纯函数实现,不依赖任何平台特定 API,在 React Native 支持的所有平台(包括鸿蒙)上都能稳定运行。值得注意的是,代码中结合 onSubmitEditing 事件实现回车提交,这种交互逻辑在鸿蒙系统的 JS 引擎中能够无缝执行,体现了 React Native 跨端开发“一次编写,多端复用”的核心价值。

2. 商品操作

应用实现了基于商品 ID 的对比交互逻辑,区分不同商品的操作场景,适配鸿蒙系统的交互规范:

const handleCompare = (productId: string) => {
  const product = products.find(p => p.id === productId);
  if (product) {
    Alert.alert('商品对比', `已将 ${product.name} 加入对比列表`);
  }
};

const handleFilter = () => {
  Alert.alert('筛选', '打开筛选面板');
};

const handleSort = () => {
  Alert.alert('排序', '选择排序方式');
};

这种交互逻辑不仅符合 React 的设计理念,更重要的是在跨端场景下,能够避免因不同平台的运行时差异导致的商品操作行为不一致。对于鸿蒙系统而言,这类纯逻辑代码无需任何适配即可直接运行,是商品搜索类跨端开发的最优实践。

3. 搜索结果

应用针对搜索场景实现了鸿蒙风格的商品列表展示逻辑,完整呈现商品的多维度属性:

{products.map(product => (
  <View key={product.id} style={styles.productCard}>
    <Text style={styles.productImage}>{product.image}</Text>
    <View style={styles.productInfo}>
      <Text style={styles.productName}>{product.name}</Text>
      <Text style={styles.productBrand}>品牌: {product.brand}</Text>
      <Text style={styles.productDesc}>{product.description}</Text>
      {/* 评分、价格、操作按钮 */}
    </View>
  </View>
))}

这种展示逻辑基于纯 JavaScript 实现,能够有效保证搜索结果体验的跨端一致性,同时在鸿蒙系统中,动态列表渲染会被转换为鸿蒙的原生列表渲染逻辑,确保搜索结果的流畅展示。


从本应用的实现来看,React Native 对接鸿蒙系统商品搜索场景的核心在于“抽象层适配 + 搜索体验兼容”,具体体现在以下几个维度:

  1. JS 引擎层搜索兼容:鸿蒙系统内置了符合 ECMAScript 标准的 JavaScript 引擎,能够直接执行 React Native 的 JS 代码,这是跨端运行的底层基础。本应用中所有的商品搜索业务逻辑代码(搜索提交、商品对比、筛选触发)均运行在 JS 引擎层,无需任何修改即可在鸿蒙系统中执行,保证了商品搜索逻辑的跨端一致性。

  2. 组件映射层搜索适配:React Native 通过自定义渲染器,将 React 组件(TextInput、View、TouchableOpacity 等)映射为鸿蒙系统的原生组件。例如 TextInput 会被转换为鸿蒙的 TextInput 组件,ScrollView 会被转换为鸿蒙的 List 组件,这种映射关系由 React Native 的鸿蒙适配层自动完成,开发者无需关注底层实现细节,只需专注于商品搜索业务逻辑开发。

  3. 样式转换层搜索规范适配:React Native 的 StyleSheet 样式会被自动转换为鸿蒙系统的原生样式,本应用中定义的所有鸿蒙商品搜索风格样式(中性系主调、交互元素色彩、商品卡片样式)都能通过这一层完成自动转换,保证了商品搜索 UI 风格在鸿蒙系统中的一致性。

  4. 搜索体验跨端兼容:应用中所有交互逻辑均基于 React Native 的标准 API 实现,这些 API 在鸿蒙系统中会被替换为对应的原生 API 调用,例如 Alert.alert 对应鸿蒙的 TextDialogTextInputonChangeText 对应鸿蒙的输入监听,确保了商品搜索体验在不同平台的一致性。

本搜索结果应用的实现完整展现了 React Native 在鸿蒙跨端商品搜索开发领域的技术优势,核心要点可总结为:

  1. 强类型设计保障搜索数据一致性:TypeScript 场景化类型定义不仅提升代码质量,更能与鸿蒙 ArkTS 形成类型映射,降低商品搜索场景跨端适配成本,是电商搜索类应用跨端开发的基础保障
  2. 纯逻辑开发最大化搜索代码复用率:搜索提交、商品对比、筛选触发等核心商品搜索逻辑采用纯 JavaScript/TypeScript 实现,无需针对鸿蒙系统做特殊修改,大幅提升开发效率
  3. 标准 API 适配鸿蒙搜索生态:基于 React Native 标准组件(尤其是 TextInput)和 API 开发,通过底层适配层自动对接鸿蒙原生能力,兼顾开发效率与商品搜索场景的原生体验

真实演示案例代码:






// App.tsx
import React, { useState } from 'react';
import { SafeAreaView, View, Text, StyleSheet, TouchableOpacity, ScrollView, Dimensions, Alert, TextInput } from 'react-native';

// Base64 图标库
const ICONS_BASE64 = {
  search: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  filter: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  compare: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  sale: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  sort: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  price: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  brand: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
  rating: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==',
};

const { width, height } = Dimensions.get('window');

// 搜索商品类型
type SearchProduct = {
  id: string;
  name: string;
  category: string;
  price: number;
  originalPrice?: number;
  image: string;
  description: string;
  brand: string;
  rating: number; // 评分 1-5
  isOnSale?: boolean; // 是否促销
};

// 搜索结果应用组件
const SearchResultsApp: React.FC = () => {
  const [searchQuery, setSearchQuery] = useState('');
  const [products] = useState<SearchProduct[]>([
    {
      id: '1',
      name: '无线蓝牙耳机',
      category: '数码配件',
      price: 199,
      originalPrice: 299,
      image: '🎧',
      description: '主动降噪,续航20小时',
      brand: 'SoundMax',
      rating: 4.5,
      isOnSale: true
    },
    {
      id: '2',
      name: '智能手环',
      category: '穿戴设备',
      price: 299,
      image: '⌚',
      description: '心率监测,运动数据记录',
      brand: 'FitTech',
      rating: 4.2
    },
    {
      id: '3',
      name: '便携充电宝',
      category: '数码配件',
      price: 89,
      originalPrice: 129,
      image: '🔋',
      description: '20000mAh,支持快充',
      brand: 'PowerUp',
      rating: 4.0,
      isOnSale: true
    },
    {
      id: '4',
      name: '机械键盘',
      category: '电脑外设',
      price: 399,
      image: '⌨️',
      description: '青轴手感,RGB背光',
      brand: 'KeyMaster',
      rating: 4.7
    }
  ]);

  const handleSearch = () => {
    if (searchQuery.trim()) {
      Alert.alert('搜索', `正在搜索: ${searchQuery}`);
    }
  };

  const handleCompare = (productId: string) => {
    const product = products.find(p => p.id === productId);
    if (product) {
      Alert.alert('商品对比', `已将 ${product.name} 加入对比列表`);
    }
  };

  const handleFilter = () => {
    Alert.alert('筛选', '打开筛选面板');
  };

  const handleSort = () => {
    Alert.alert('排序', '选择排序方式');
  };

  return (
    <SafeAreaView style={styles.container}>
      {/* 搜索头部 */}
      <View style={styles.searchHeader}>
        <View style={styles.searchContainer}>
          <TextInput
            style={styles.searchInput}
            placeholder="输入商品关键词..."
            value={searchQuery}
            onChangeText={setSearchQuery}
            onSubmitEditing={handleSearch}
          />
          <TouchableOpacity 
            style={styles.searchButton}
            onPress={handleSearch}
          >
            <Text style={styles.searchIcon}>🔍</Text>
          </TouchableOpacity>
        </View>
        
        <View style={styles.actionButtons}>
          <TouchableOpacity 
            style={styles.actionButton}
            onPress={handleFilter}
          >
            <Text style={styles.actionIcon}>⚙️</Text>
            <Text style={styles.actionText}>筛选</Text>
          </TouchableOpacity>
          <TouchableOpacity 
            style={styles.actionButton}
            onPress={handleSort}
          >
            <Text style={styles.actionIcon}>📊</Text>
            <Text style={styles.actionText}>排序</Text>
          </TouchableOpacity>
        </View>
      </View>

      <ScrollView style={styles.content}>
        {/* 搜索结果统计 */}
        <View style={styles.resultsHeader}>
          <Text style={styles.resultsText}>找到 {products.length} 件相关商品</Text>
        </View>

        {/* 商品列表 */}
        <View style={styles.productsList}>
          {products.map(product => (
            <View key={product.id} style={styles.productCard}>
              <Text style={styles.productImage}>{product.image}</Text>
              
              <View style={styles.productInfo}>
                <Text style={styles.productName}>{product.name}</Text>
                <Text style={styles.productBrand}>品牌: {product.brand}</Text>
                <Text style={styles.productDesc}>{product.description}</Text>
                
                <View style={styles.ratingRow}>
                  <Text style={styles.ratingText}>{product.rating}</Text>
                  <Text style={styles.reviewCount}>(128条评论)</Text>
                </View>
                
                <View style={styles.priceRow}>
                  <Text style={styles.currentPrice}>¥{product.price}</Text>
                  {product.originalPrice && (
                    <Text style={styles.originalPrice}>¥{product.originalPrice}</Text>
                  )}
                  {product.isOnSale && (
                    <View style={styles.saleTag}>
                      <Text style={styles.saleText}>特价</Text>
                    </View>
                  )}
                </View>
                
                <View style={styles.cardActions}>
                  <TouchableOpacity 
                    style={styles.compareButton}
                    onPress={() => handleCompare(product.id)}
                  >
                    <Text style={styles.compareText}>对比</Text>
                  </TouchableOpacity>
                  <TouchableOpacity style={styles.buyButton}>
                    <Text style={styles.buyText}>立即购买</Text>
                  </TouchableOpacity>
                </View>
              </View>
            </View>
          ))}
        </View>

        {/* 搜索贴士 */}
        <View style={styles.tipsCard}>
          <Text style={styles.sectionTitle}>💡 搜索小贴士</Text>
          
          <View style={styles.tipItem}>
            <Text style={styles.tipEmoji}>🎯</Text>
            <View style={styles.tipContent}>
              <Text style={styles.tipTitle}>精准搜索</Text>
              <Text style={styles.tipDesc}>使用具体型号或功能词搜索更准确</Text>
            </View>
          </View>
          
          <View style={styles.tipItem}>
            <Text style={styles.tipEmoji}>📊</Text>
            <View style={styles.tipContent}>
              <Text style={styles.tipTitle}>智能筛选</Text>
              <Text style={styles.tipDesc}>按价格、品牌、评分等条件筛选</Text>
            </View>
          </View>
          
          <View style={styles.tipItem}>
            <Text style={styles.tipEmoji}>🆚</Text>
            <View style={styles.tipContent}>
              <Text style={styles.tipTitle}>商品对比</Text>
              <Text style={styles.tipDesc}>同时对比多个商品的参数和价格</Text>
            </View>
          </View>
        </View>

        {/* 使用说明 */}
        <View style={styles.infoCard}>
          <Text style={styles.sectionTitle}>📘 使用说明</Text>
          <Text style={styles.infoText}>• 支持模糊搜索和精确匹配</Text>
          <Text style={styles.infoText}>• 提供多维度筛选和排序功能</Text>
          <Text style={styles.infoText}>• 商品对比最多支持4个商品</Text>
          <Text style={styles.infoText}>• 特价商品享有额外优惠</Text>
        </View>
      </ScrollView>

      {/* 底部导航 */}
      <View style={styles.bottomNav}>
        <TouchableOpacity style={styles.navItem}>
          <Text style={styles.navIcon}>🏠</Text>
          <Text style={styles.navText}>首页</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.navItem}>
          <Text style={styles.navIcon}>🔍</Text>
          <Text style={styles.navText}>搜索</Text>
        </TouchableOpacity>
        <TouchableOpacity style={styles.navItem}>
          <Text style={styles.navIcon}>🆚</Text>
          <Text style={styles.navText}>对比</Text>
        </TouchableOpacity>
        <TouchableOpacity style={[styles.navItem, styles.activeNavItem]}>
          <Text style={styles.navIcon}>👤</Text>
          <Text style={styles.navText}>我的</Text>
        </TouchableOpacity>
      </View>
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#f1f5f9',
  },
  searchHeader: {
    flexDirection: 'column',
    padding: 16,
    backgroundColor: '#ffffff',
    borderBottomWidth: 1,
    borderBottomColor: '#cbd5e1',
  },
  searchContainer: {
    flexDirection: 'row',
    marginBottom: 12,
  },
  searchInput: {
    flex: 1,
    backgroundColor: '#f8fafc',
    borderRadius: 20,
    paddingHorizontal: 16,
    paddingVertical: 10,
    fontSize: 16,
    color: '#1e293b',
  },
  searchButton: {
    backgroundColor: '#3b82f6',
    paddingHorizontal: 16,
    paddingVertical: 10,
    borderRadius: 20,
    marginLeft: 8,
    justifyContent: 'center',
  },
  searchIcon: {
    fontSize: 18,
    color: '#ffffff',
  },
  actionButtons: {
    flexDirection: 'row',
    justifyContent: 'space-around',
  },
  actionButton: {
    alignItems: 'center',
    flex: 1,
  },
  actionIcon: {
    fontSize: 20,
    marginBottom: 4,
  },
  actionText: {
    fontSize: 12,
    color: '#64748b',
  },
  content: {
    flex: 1,
    marginTop: 12,
  },
  resultsHeader: {
    backgroundColor: '#ffffff',
    marginHorizontal: 16,
    marginBottom: 12,
    padding: 16,
    borderRadius: 12,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  resultsText: {
    fontSize: 16,
    color: '#1e293b',
    fontWeight: '500',
  },
  productsList: {
    marginHorizontal: 16,
  },
  productCard: {
    flexDirection: 'row',
    backgroundColor: '#ffffff',
    borderRadius: 12,
    padding: 16,
    marginBottom: 12,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  productImage: {
    fontSize: 40,
    marginRight: 12,
  },
  productInfo: {
    flex: 1,
  },
  productName: {
    fontSize: 16,
    fontWeight: '600',
    color: '#1e293b',
    marginBottom: 4,
  },
  productBrand: {
    fontSize: 12,
    color: '#64748b',
    marginBottom: 4,
  },
  productDesc: {
    fontSize: 12,
    color: '#94a3b8',
    marginBottom: 8,
  },
  ratingRow: {
    flexDirection: 'row',
    alignItems: 'center',
    marginBottom: 8,
  },
  ratingText: {
    fontSize: 14,
    color: '#f59e0b',
    fontWeight: '500',
    marginRight: 8,
  },
  reviewCount: {
    fontSize: 12,
    color: '#94a3b8',
  },
  priceRow: {
    flexDirection: 'row',
    alignItems: 'center',
    marginBottom: 12,
  },
  currentPrice: {
    fontSize: 18,
    fontWeight: 'bold',
    color: '#ef4444',
    marginRight: 8,
  },
  originalPrice: {
    fontSize: 14,
    color: '#94a3b8',
    textDecorationLine: 'line-through',
    marginRight: 8,
  },
  saleTag: {
    backgroundColor: '#ef4444',
    paddingHorizontal: 8,
    paddingVertical: 2,
    borderRadius: 12,
  },
  saleText: {
    fontSize: 10,
    color: '#ffffff',
    fontWeight: '600',
  },
  cardActions: {
    flexDirection: 'row',
    justifyContent: 'space-between',
  },
  compareButton: {
    backgroundColor: '#e2e8f0',
    paddingHorizontal: 16,
    paddingVertical: 6,
    borderRadius: 16,
  },
  compareText: {
    color: '#64748b',
    fontSize: 12,
    fontWeight: '500',
  },
  buyButton: {
    backgroundColor: '#3b82f6',
    paddingHorizontal: 16,
    paddingVertical: 6,
    borderRadius: 16,
  },
  buyText: {
    color: '#ffffff',
    fontSize: 12,
    fontWeight: '500',
  },
  tipsCard: {
    backgroundColor: '#ffffff',
    marginHorizontal: 16,
    marginBottom: 12,
    borderRadius: 12,
    padding: 16,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  sectionTitle: {
    fontSize: 16,
    fontWeight: '600',
    color: '#1e293b',
    marginBottom: 12,
  },
  tipItem: {
    flexDirection: 'row',
    alignItems: 'center',
    paddingVertical: 12,
    borderBottomWidth: 1,
    borderBottomColor: '#e2e8f0',
  },
  tipEmoji: {
    fontSize: 20,
    width: 30,
  },
  tipContent: {
    flex: 1,
  },
  tipTitle: {
    fontSize: 14,
    fontWeight: '600',
    color: '#1e293b',
    marginBottom: 2,
  },
  tipDesc: {
    fontSize: 12,
    color: '#64748b',
  },
  infoCard: {
    backgroundColor: '#ffffff',
    marginHorizontal: 16,
    marginBottom: 80,
    borderRadius: 12,
    padding: 16,
    elevation: 2,
    shadowColor: '#000',
    shadowOffset: { width: 0, height: 2 },
    shadowOpacity: 0.1,
    shadowRadius: 4,
  },
  infoText: {
    fontSize: 14,
    color: '#64748b',
    lineHeight: 20,
    marginBottom: 4,
  },
  bottomNav: {
    flexDirection: 'row',
    justifyContent: 'space-around',
    backgroundColor: '#ffffff',
    borderTopWidth: 1,
    borderTopColor: '#cbd5e1',
    paddingVertical: 12,
    position: 'absolute',
    bottom: 0,
    left: 0,
    right: 0,
  },
  navItem: {
    alignItems: 'center',
    flex: 1,
  },
  activeNavItem: {
    paddingTop: 4,
    borderTopWidth: 2,
    borderTopColor: '#3b82f6',
  },
  navIcon: {
    fontSize: 20,
    color: '#94a3b8',
    marginBottom: 4,
  },
  activeNavIcon: {
    color: '#3b82f6',
  },
  navText: {
    fontSize: 12,
    color: '#94a3b8',
  },
  activeNavText: {
    color: '#3b82f6',
    fontWeight: '500',
  },
});

export default SearchResultsApp;

请添加图片描述


打包

接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。

在这里插入图片描述

打包之后再将打包后的鸿蒙OpenHarmony文件拷贝到鸿蒙的DevEco-Studio工程目录去:

在这里插入图片描述

最后运行效果图如下显示:

请添加图片描述
本文介绍了一个基于React Native构建的商品搜索应用,展示了如何实现跨平台兼容的搜索系统。文章详细解析了应用的核心架构,包括:1)使用TypeScript定义商品数据结构,确保类型安全;2)采用React Hooks进行状态管理;3)实现响应式UI布局和组件化设计;4)集成搜索、筛选、排序等核心功能。该应用特别关注了React Native与HarmonyOS的跨端兼容性,为开发者提供了电商类应用开发的实践参考,同时提出了性能优化和功能扩展建议,如虚拟列表、搜索防抖等。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐