React框架之Redux和react-router

150 阅读7分钟

本篇内容介绍React框架的周边工具,分别是Redux和react-router。在Redux工具上的总结有基本概念、单项数据流、react-redux、异步action、中间件。在react-router工具上的总结有路由模式和路由配置。

一、Redux 工具

1、基本概念

Redux是一个状态管理库,它可以帮助你管理React应用中的所有状态。Redux的核心概念包括:

  1. Store:一个存储应用所有状态的对象。你可以通过Redux提供的createStore函数来创建一个store对象。

  2. Action:一个描述状态变化的对象。它包含一个type字段和一些额外的数据。你可以通过Redux提供的action creator函数来创建一个action对象。

  3. Reducer:一个纯函数,它接收当前状态和一个action对象,并返回一个新的状态。你可以通过Redux提供的combineReducers函数来将多个reducer合并成一个。

  4. Dispatch:一个函数,它接收一个action对象,并将它发送给store。store会调用reducer函数来计算新的状态,并将新的状态存储起来。

  5. Subscribe:一个函数,它接收一个回调函数,并在store中的状态发生变化时自动调用这个回调函数。

Redux的工作流程如下:当你的应用中的某个组件需要改变状态时,它会调用一个action creator函数来创建一个action对象。这个action对象会被dispatch函数发送给store。store会调用reducer函数来计算新的状态,并将新的状态存储起来。最后,store会调用所有订阅者的回调函数,通知它们状态发生了变化。

2、单项数据流

Redux是一款流行的状态管理库,它的核心思想是单项数据流(One-Way Data Flow)。这意味着应用程序的状态(state)被存储在一个中央存储库(store)中,而所有的状态更改都必须通过发出一个动作(action)来触发。这个动作会被传递给一个纯函数(reducer),它会根据动作的类型和负载(payload)来计算新的状态,并将其返回给存储库。最终,这个新的状态会被用来更新应用程序的视图。

这种单项数据流的优点是:

  1. 状态更改变得可预测:由于所有的状态更改都必须通过发出动作来触发,因此我们可以非常容易地追踪状态的变化,从而更好地调试和测试代码。

  2. 状态更改变得可控:由于状态的更改是通过纯函数来计算的,因此我们可以确保状态更改是无副作用的,从而避免了许多常见的错误。

  3. 组件更易于维护:由于状态被集中存储在一个中央存储库中,因此我们可以更容易地跟踪应用程序的状态,从而更好地维护和优化组件的代码。

3、react-redux

react-redux是一个React绑定库,它提供了一种将Redux和React结合使用的方式。它为我们提供了一些组件和API,使得在React组件中使用Redux变得更加容易。

react-redux提供了两个主要的组件:Provider和Connect。

Provider组件是一个React组件,它接受一个Redux存储库作为其props,并将其传递给其子组件。这使得我们可以在整个应用程序中使用Redux存储库,而不必手动将其传递给每一个组件。

Connect组件是一个高阶组件(Higher-Order Component),它接受一个组件作为其参数,并返回一个新的组件。这个新的组件可以访问Redux存储库中的状态,并将其作为props传递给包装的组件。它还可以将动作(actions)作为props传递给包装的组件,以便在组件中触发动作。

4、异步action

在Redux中,异步操作可以使用异步action来实现。异步action是指action返回一个函数,而不是一个对象。这个函数可以在内部执行异步操作,例如发送网络请求或者定时器等,然后在异步操作完成后再dispatch一个普通的action,用于更新store中的state。

下面是一个简单的例子:

export const fetchData = () => {
  return (dispatch) => {
    dispatch({ type: 'FETCH_DATA_REQUEST' });
    fetch('/api/data')
      .then(response => response.json())
      .then(data => {
        dispatch({ type: 'FETCH_DATA_SUCCESS', payload: data });
      })
      .catch(error => {
        dispatch({ type: 'FETCH_DATA_FAILURE', payload: error.message });
      });
  };
};

在这个例子中,fetchData是一个异步action,它返回一个函数,这个函数接收一个dispatch参数。在函数内部,我们首先dispatch一个FETCH_DATA_REQUEST的action,然后使用fetch函数发送一个网络请求,获取数据后再dispatch一个FETCH_DATA_SUCCESS的action或者FETCH_DATA_FAILURE的action,用于更新store中的state。

需要注意的是,异步action需要使用中间件来处理,例如redux-thunk、redux-saga等。其中,redux-thunk是最常用的中间件之一,它可以让我们在action中使用异步操作。

5、中间件

在Redux中,中间件是一个功能强大的概念,它可以让我们在action被dispatch到reducer之前或之后执行一些额外的逻辑。常见的中间件有redux-thunk、redux-saga、redux-logger等。

redux-thunk是一个常用的中间件,它允许我们在action中使用异步操作。具体来说,当我们dispatch一个函数类型的action时,redux-thunk会拦截这个action,并将dispatch方法作为参数传递给这个函数。这样,我们就可以在函数内部执行异步操作,然后再dispatch一个普通的action,用于更新store中的state。

redux-saga是另一个常用的中间件,它基于generator函数实现,可以让我们以一种非阻塞的方式处理异步操作。具体来说,我们可以定义一些saga函数,用于监听action并执行相应的异步操作。saga函数可以使用一些特殊的effect来控制异步流程,例如call、put、take等。

redux-logger是一个用于开发环境的中间件,它可以将每个action的类型和payload打印到控制台上,方便我们调试和排查问题。

需要注意的是,中间件的顺序非常重要,它们会按照定义的顺序依次执行。一般来说,redux-thunk应该放在最前面,因为它可以让我们使用异步操作。而redux-logger应该放在最后面,因为它会打印所有的action,如果放在前面可能会影响其他中间件的执行。

二、react-router 工具

React Router 是 React 应用中最常用的路由管理工具之一。它可以帮助我们在 React 应用中实现多个页面之间的跳转和管理。React Router 提供了多种路由组件,例如 BrowserRouterHashRouterRouteLinkSwitch 等等。下面是一些常见的 React Router 的使用场景和相关知识点:

  1. 路由的基本使用:使用 BrowserRouterHashRouter 包裹应用的根组件,使用 Route 组件定义路由规则,使用 Link 组件实现跳转。

  2. 动态路由:使用 Route 组件的 path 属性中使用 :id 等占位符,然后在组件中通过 props.match.params 获取路由参数。

  3. 嵌套路由:使用 Route 组件的 children 属性或者嵌套 Route 组件实现。

  4. 路由守卫:使用 Route 组件的 render 属性或者高阶组件 withRouter 实现路由守卫。

  5. 路由传参:使用 Link 组件的 to 属性传递参数,或者使用 location 对象传递参数。

  6. 重定向:使用 Redirect 组件实现重定向。

  7. 路由懒加载:使用 React.lazySuspense 组件实现路由懒加载,可以提高应用的性能。