# react-useContext **Repository Path**: cai-lunduo/react-use-context ## Basic Information - **Project Name**: react-useContext - **Description**: 包含useContext的实际场景用法和context的使用笔记 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-05-30 - **Last Updated**: 2023-02-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### useContext(补充) 我们通过`createContext`创建一个Context之后,在子组件可以通过`useContext`拿到我们在祖先组件创建的`Context`,但是前提是我们需要对子组件用`Context.Provider`标签进行包裹,然后通过`value`属性传值。 这里需要注意` const states = useContext(Context)`只能在子组件内部调用,不可在顶级元素使用。 例子如下: ```react import {createContext, useContext} from 'react' const Context = createContext() function Child() { const states = useContext(Context) return (
{states.map(state => { return (

{state}

) })}
) } function App() { return (
); } export default App; ``` 在这里我们通过`Context.Provider`传输了一个数字数组到子代组件,子代组件通过`const states = useContext(Context)`获取到父组件传过来的数据并进行展示。 ### 优化 假如我们要给多个子组件提供同一份数据,那么我可以将提供数据的父组件给抽离成一个单独的负责**提供数据**的组件: ```react import {createContext, useState} from 'react' export const Context = createContext() export function CountContextProvider({children}) { let [count, setCount] = useState(10) const countObj = { count, add() { setCount(++count) }, minus() { setCount(--count) } } return ( {children} ) } ``` 子组件: ```react import {useContext} from 'react' import {Context, CountContextProvider} from './CountContextProvider' function CountChild() { const {count, add, minus} = useContext(Context) return (

{count}

) } let r = () => { return ( ) } export default r ``` ## 14. Context Context 提供了一个无需为每层组件手动添加 props,就能在组件树间进行数据传递的方法。 因为典型的React应用数据是通过Props属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的(例如:地区偏好,UI 主题),这些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。 总体步骤 ```shell 1.creareContext 2.MyContext.Provider包裹通过value传值 3.在需要该值的组件static contextType = ThemeContext;接收context ``` ### 14.1 使用Context之前 **何时使用 Context** Context的目的是共享那些应该在全局共享的数据,例如当前用户的Token数据,或者首选语言。举个例子,在下面的代码中,我们通过一个 “theme” 属性手动调整一个按钮组件的样式: ```react class App extends React.Component { render() { return ; } } function Toolbar(props) { // Toolbar 组件接受一个额外的“theme”属性,然后传递给 ThemedButton 组件。 // 如果应用中每一个单独的按钮都需要知道 theme 的值,这会是件很麻烦的事, // 因为必须将这个值层层传递所有组件。 return (
); } class ThemedButton extends React.Component { render() { return