useContext使用讲解

177 阅读1分钟

引言

随着我们的项目越来越复杂,我们会把组件拆得越来越多,越来越小,如果还是通过props将父组件法数据一级一级往下传递,显然会让代码更加not clean,而且臃肿。本文介绍如何使用react的useContext,来实现深层跨级父子(嵌套较深)的数据管理。

用法

首先记住和useContext相关的两个api: createContext,

  1. 创建context
import React from 'react';

const CurrencyContext = React.createContext(null);

export { CurrencyContext };
  1. 在顶层父组件上使用Provide包裹子组件,设置value值
import React from 'react';

import { CurrencyContext } from './currency-context';

const App = () => {
  return (
    <CurrencyContext.Provider value="€">
      <Books list={DATA} />
    </CurrencyContext.Provider>
  );
};
  1. 在底层子组件上使用useContext获取传递下来的value
import React, { useContext } from "react";
import { CurrencyContext } from "./currency-context";

const Book = ({ item }) => {
  const currency = useContext(CurrencyContext);

  return (
    <li>
      {item.title} - {item.price} {currency}
    </li>
  );
};
export default Book;

查看在线示例

最佳实践

  1. 创建一个单独的context文件
import React from 'react';

const CurrencyContext = React.createContext(null);

export { CurrencyContext };
  1. 创建一个单独的自定义hooks
import React from 'react';

const CurrencyContext = React.createContext(null);

const useCurrency = () => React.useContext(CurrencyContext);

export { CurrencyContext, useCurrency };
  1. 自定义provider文件
import React from 'react';

const CurrencyContext = React.createContext(null);

const useCurrency = () => React.useContext(CurrencyContext);

const CurrencyProvider = ({ value, children }) => {
  return (
    <CurrencyContext.Provider value={value}>
      {children}
    </CurrencyContext.Provider>
  );
};

export { CurrencyProvider, useCurrency };

总结

总的来讲,useContext的使用场景就是多层嵌套组件之间的单向通信(父→子)。

参考资料

  1. www.robinwieruch.de/react-useco…