还有react native中的架构技术或者其他技术手段,我感觉我的代码有点low,写的过于复杂,业务数据都在一个页面里面
以下是一些提升 React Native 应用架构和代码质量的技术和方案:
- 模块化架构(推荐)
src/
├── modules/
│ ├── user/
│ │ ├── components/
│ │ ├── screens/
│ │ ├── services/
│ │ ├── hooks/
│ │ └── types/
│ ├── crm/
│ │ ├── components/
│ │ ├── screens/
│ │ ├── services/
│ │ └── hooks/
├── shared/
│ ├── components/
│ ├── hooks/
│ ├── utils/
│ └── services/
- 自定义 Hooks 解耦业务逻辑
function useTravelRecord(userId: string) {
const [records, setRecords] = useState([]);
const [loading, setLoading] = useState(false);
const [error, setError] = useState(null);
const fetchTravelRecords = useCallback(async (date: string) => {
setLoading(true);
try {
const result = await KQApiService.GetTravelRecordInfo({
operatorId: userId,
searchDate: date,
TenantId: mmkv.getString(ERP_TENANTID)
});
setRecords(result);
} catch (err) {
setError(err);
} finally {
setLoading(false);
}
}, [userId]);
return {
records,
loading,
error,
fetchTravelRecords
};
}
// 使用示例
function TravelRecordPage() {
const { records, loading, fetchTravelRecords } = useTravelRecord(userId);
useEffect(() => {
fetchTravelRecords(currentDate);
}, [currentDate]);
return (
<FlatList
data={records}
renderItem={renderTravelRecordItem}
/>
);
}
- 服务层抽象
class TravelRecordService {
static async getTravelRecords(params: {
userId: string,
date: string,
tenantId: string
}) {
try {
return await KQApiService.GetTravelRecordInfo(params);
} catch (error) {
// 统一错误处理
ErrorHandler.handle(error);
return [];
}
}
static calculateAverageSpeed(records: TravelRecord[]) {
return records.map(record => ({
...record,
averageSpeed: this.calculateSpeed(record)
}));
}
private static calculateSpeed(record: TravelRecord) {
const length = Number(record.roadLength) || 0;
const time = Number(record.elapsedTime) || 0;
return time > 0 ? Number((length / time).toFixed(2)) : 0;
}
}
- 状态管理 - Zustand(轻量级状态管理)
import create from 'zustand';
interface EmployeeState {
employees: Employee[];
currentEmployee?: Employee;
loading: boolean;
fetchEmployees: () => Promise<void>;
setCurrentEmployee: (employee: Employee) => void;
}
const useEmployeeStore = create<EmployeeState>((set) => ({
employees: [],
currentEmployee: undefined,
loading: false,
fetchEmployees: async () => {
set({ loading: true });
try {
const employees = await EmployeeService.getEmployees();
set({
employees,
loading: false,
currentEmployee: employees[0]
});
} catch (error) {
set({ loading: false });
ErrorHandler.handle(error);
}
},
setCurrentEmployee: (employee) =>
set({ currentEmployee: employee })
}));
- 依赖注入容器
class DIContainer {
private static instances: Map<string, any> = new Map();
static register<T>(key: string, instance: T) {
this.instances.set(key, instance);
}
static resolve<T>(key: string): T {
const instance = this.instances.get(key);
if (!instance) {
throw new Error(`No instance found for ${key}`);
}
return instance;
}
}
// 使用示例
DIContainer.register('userService', new UserService());
DIContainer.register('authService', new AuthService());
const userService = DIContainer.resolve<UserService>('userService');
- 错误处理中心
class ErrorHandler {
static handle(error: Error) {
// 集中处理错误
if (error instanceof NetworkError) {
ToastUtils.show('网络错误,请检查网络');
} else if (error instanceof AuthError) {
// 自动跳转登录
NavigationService.navigate('Login');
} else {
// 上报错误
LogService.error(error);
ToastUtils.show('未知错误,请稍后重试');
}
}
}
- 性能优化 - React.memo & useMemo
const EmployeeCard = React.memo(({ employee }) => {
const formattedName = useMemo(() => {
return employee.name.toUpperCase();
}, [employee.name]);
return <Text>{formattedName}</Text>;
});
- 响应式编程 - RxJS
import { BehaviorSubject } from 'rxjs';
class UserObservableService {
private userSubject = new BehaviorSubject(null);
user$ = this.userSubject.asObservable();
updateUser(user) {
this.userSubject.next(user);
}
}
推荐架构演进路径:
- 先用 Hooks 解耦
- 引入服务层
- 使用轻量状态管理
- 逐步引入依赖注入
- 完善错误处理
- 性能优化
关键原则:
- 单一职责
- 高内聚
- 低耦合
- 可测试性
- 可维护性
建议:
- 将大组件拆分成更小的组件
- 使用自定义 Hooks 封装逻辑
- 抽象服务层
- 使用轻量级状态管理
- 重视错误处理
- 持续重构
最佳实践:
- 保持组件简洁
- 逻辑下沉到 Hooks 和 Service
- 使用类型系统(TypeScript)
- 遵循函数式编程思想