react native 项目优化方向

89 阅读2分钟

还有react native中的架构技术或者其他技术手段,我感觉我的代码有点low,写的过于复杂,业务数据都在一个页面里面

以下是一些提升 React Native 应用架构和代码质量的技术和方案:

  1. 模块化架构(推荐)
src/
├── modules/
│   ├── user/
│   │   ├── components/
│   │   ├── screens/
│   │   ├── services/
│   │   ├── hooks/
│   │   └── types/
│   ├── crm/
│   │   ├── components/
│   │   ├── screens/
│   │   ├── services/
│   │   └── hooks/
├── shared/
│   ├── components/
│   ├── hooks/
│   ├── utils/
│   └── services/
  1. 自定义 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}
    />
  );
}

  1. 服务层抽象

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;
  }
}
  1. 状态管理 - 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 })
}));
  1. 依赖注入容器

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');
  1. 错误处理中心

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('未知错误,请稍后重试');
    }
  }
}
  1. 性能优化 - React.memo & useMemo

const EmployeeCard = React.memo(({ employee }) => {
  const formattedName = useMemo(() => {
    return employee.name.toUpperCase();
  }, [employee.name]);

  return <Text>{formattedName}</Text>;
});
  1. 响应式编程 - RxJS
import { BehaviorSubject } from 'rxjs';

class UserObservableService {
  private userSubject = new BehaviorSubject(null);
  
  user$ = this.userSubject.asObservable();

  updateUser(user) {
    this.userSubject.next(user);
  }
}

推荐架构演进路径:

  1. 先用 Hooks 解耦
  2. 引入服务层
  3. 使用轻量状态管理
  4. 逐步引入依赖注入
  5. 完善错误处理
  6. 性能优化

关键原则:

  • 单一职责
  • 高内聚
  • 低耦合
  • 可测试性
  • 可维护性

建议:

  1. 将大组件拆分成更小的组件
  2. 使用自定义 Hooks 封装逻辑
  3. 抽象服务层
  4. 使用轻量级状态管理
  5. 重视错误处理
  6. 持续重构

最佳实践:

  • 保持组件简洁
  • 逻辑下沉到 Hooks 和 Service
  • 使用类型系统(TypeScript)
  • 遵循函数式编程思想