使用 Hook 简化 Flux

在 React 16.8 版本引入 Hook 之后,在 React 中使用 Flux 概念变得比较简单了,这主要是通过useContext()useReducer()两个 Hook 函数。

借助于useContext(),全局 State 可以被注入到 Context 中,通过 Provider 向组件树提供。useReducer()可以直接将ReduceStore中的reduce()方法映射进组件类,并且直接向组件类提供dispatch()函数以分发 Action。原则上,由于useReducer()返回的 State 和dispatch()方法是成对的,所以在使用 Provider 向组件树提供 Context 时,要将两者都提供出去。以下给出一个参考示例。

const LoginInitialState = { loggedIn: false, user: '' };
const LoginContext = React.createContext(null);

function LoginReducer(state, action) {
  // 这里完成State变化操作
}

function App() {
  const [LoginState, dispatch] = useReducer(LoginReducer, LoginInitialState);
  return (
    <LoginContext.Provider value={{ LoginState, dispatch }}>
      <div>Application UI</div>
    </LoginContext.Provider>
  );
}

export { App as default, LoginContext };

在子组件上可以这样来使用。

import { LoginContext } from './App';

function LoginPage() {
  const loginCtx = useContext(LoginContext);
  const loginAction = () => {
    loginCtx.dispatch(loginActionCreator());
  };

  return <button onClick={loginAction}>登录</button>;
}

这样,在不引入 Flux 的情况下,只需要定义若干 Action Creator 和 Reduce 函数,搭配上不可变对象,即可直接完成全部全局 State 管理的功能。