返回

RxJS 6 与 Recompose:构建 React 中的 GitHub 搜索功能

前端

前言

在本文中,我将演示如何使用 RxJS 6 和 Recompose 在 React 中构建一个 GitHub 搜索功能。这篇文章适合有一定 React 和 RxJS 使用经验的读者。我将分享一些我个人在设计这个 UI 时觉得有用的模式。代码托管在我的 Github 上,master 分支是一个已完成的项目, 而 feature/rxjs-recompose 分支包含了本文中提到的代码。

为什么选择 RxJS 和 Recompose?

RxJS 是一个用于处理异步数据流的库。它提供了许多操作符,可以帮助你轻松地处理各种异步操作,例如网络请求、计时器和事件处理。RxJS 6 是最新版本,它引入了一些新的特性和改进,使其更易于使用。

Recompose 是一个 React 库,它允许你以函数式风格编写 React 组件。这使得你的代码更易于阅读和维护,尤其是当你处理复杂的组件时。Recompose 还提供了一些有用的高阶组件(HOC),可以帮助你轻松地实现常见的功能,例如状态管理、事件处理和数据绑定。

项目结构

项目的结构非常简单,有一个 index.js 文件作为入口,一个 App.js 文件作为根组件,一个 Search.js 文件作为搜索组件,一个 Results.js 文件作为结果组件,以及一个 style.css 文件作为样式表。

实现步骤

1. 安装依赖项

首先,我们需要安装 RxJS 和 Recompose:

npm install rxjs recompose --save

2. 创建 App 组件

App 组件是根组件,它负责渲染搜索组件和结果组件。

import React from 'react';
import Search from './Search';
import Results from './Results';

const App = () => (
  <div>
    <Search />
    <Results />
  </div>
);

export default App;

3. 创建 Search 组件

Search 组件负责处理用户输入和搜索请求。

import React, { useState } from 'react';
import { Observable } from 'rxjs';
import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
import Recompose from 'recompose';

const Search = () => {
  const [query, setQuery] = useState('');

  const search$ = Observable.fromEvent(document, 'input')
    .pipe(
      debounceTime(300),
      distinctUntilChanged(),
      switchMap(e => Observable.ajax.getJSON(`https://api.github.com/search/repositories?q=${e.target.value}`))
    );

  return (
    <input
      type="text"
      value={query}
      onChange={e => setQuery(e.target.value)}
    />
  );
};

export default Recompose.pure(Search);

4. 创建 Results 组件

Results 组件负责渲染搜索结果。

import React from 'react';

const Results = ({ results }) => (
  <ul>
    {results.map(result => (
      <li key={result.id}>{result.full_name}</li>
    ))}
  </ul>
);

export default Results;

5. 样式

input {
  width: 100%;
  padding: 12px 20px;
  margin: 8px 0;
  box-sizing: border-box;
  border: 1px solid #ccc;
  border-radius: 4px;
}

ul {
  list-style-type: none;
  padding: 0;
  margin: 0;
}

li {
  padding: 12px 20px;
  margin-bottom: 8px;
  background-color: #f1f1f1;
  border: 1px solid #ccc;
  border-radius: 4px;
}

6. 运行项目

npm start

总结

在本教程中,我们演示了如何使用 RxJS 6 和 Recompose 在 React 中构建一个 GitHub 搜索功能。我们使用了 RxJS 来处理异步数据流,并使用了 Recompose 来以函数式风格编写 React 组件。这种方式使我们的代码更易于阅读和维护。希望这篇文章对你有帮助!