标签: use-context

useContext 在我的反应代码中不起作用

应用程序组件:

    import React,{createContext} from "react";
    import "./style.css";
    import A from "./A";
    
    export const userContext =createContext();
    
    function App() {
      return (
        <userContext.Provider name={"samuel"}>
          <div>
            <A />
          </div>
        </userContext.Provider>
      );
    }
    export default App;
Run Code Online (Sandbox Code Playgroud)

A组份

    import React from 'react';
    import B from './B';
    function A(){
      return (<div>
      <h3>Component A </h3>
      <B />
      </div>)
    }
    
    export default A;
Run Code Online (Sandbox Code Playgroud)

组分B:

        import React, { useContext } from "react";
        import {userContext} from "./App";
    
    function B() {
      const name = useContext(userContext);
      return (
        <div>
          <h3>Component B{name} </h3> …
Run Code Online (Sandbox Code Playgroud)

reactjs use-context

5
推荐指数
1
解决办法
8039
查看次数

如何使用自定义钩子和 useContext 仅渲染相关组件

我正在尝试创建一个基于useContext 的自定义挂钩useFocus以仅将焦点设置在我选择的组件上。它的工作,但其他组件正在呈现,即使我使用useCallback作为我的 useFocus 自定义挂钩返回的函数。

我只想重新渲染焦点变化的组件。

我知道如果代码很快,重新渲染可能是一个小问题,但我不明白为什么要重新渲染。你能给我一些解释或解决办法吗?

预期结果

单击“设置焦点”按钮时,我期望得到:

1 个 A/B/D 渲染

2 个 C/E 渲染

图像中的预期结果

谢谢。

这是我的代码:

import React, { createContext, useCallback, useContext, useState } from "react";
import "./styles.css";

const StepContext = createContext({});

//This is just to display number or render for each Items
function useRenderCounter() {
  const ref = React.useRef();
  React.useEffect(() => {
    ref.current.textContent = Number(ref.current.textContent || "0") + 1;
  });
  return (
    <span
      style={{
        backgroundColor: "#ccc",
        borderRadius: 4,
        padding: "2px 4px", …
Run Code Online (Sandbox Code Playgroud)

rerender reactjs react-hooks usecallback use-context

5
推荐指数
1
解决办法
958
查看次数

useContext 值在页面刷新和注销期间被清除

更新配置文件时,通过navlink (Navigation.js)profile.name显示。useContext()但是,一旦页面刷新或注销期间,profile.name 就会被清除,也profile.photo不会在导航链接中显示。

我想始终在导航链接中显示名称和照片,我该怎么做。?

UserProfileProvider.js

import React, { useMemo, useState} from 'react';
import UserProfileContext from '../context';

const UserProfileProvider = ({children}) => {

    const [profile, setProfile] = useState({ _id: '', photo: '', name: '', email:'', phonenumber:'', position:'', privilege:'', password:''});

    const value = useMemo(() => ({
        profile, setProfile
    }), [profile]);


    return (
       <UserProfileContext.Provider value={value}>
           {children}
       </UserProfileContext.Provider>
    )   
}
export default UserProfileProvider;
Run Code Online (Sandbox Code Playgroud)

Navigation.js

import React, { useContext } from 'react';
import { NavLink, useHistory } from 'react-router-dom'; …
Run Code Online (Sandbox Code Playgroud)

reactjs react-hooks use-context

4
推荐指数
1
解决办法
1万
查看次数

React - Firebase 身份验证和 useContext

我正在尝试找出创建保存 firebase 身份验证用户 ID 的全局状态变量的最佳方法。例如,下面的代码将检查用户是否登录,如果成功则将其发送到欢迎页面。

但我还需要在不同的文件上设置私有路由,我希望能够共享 getId 状态。我读到 useContext 可以做到这一点,但不确定如何实现它。请指教,谢谢

const [getId, setId] = useState("");

const login = async ( id ) => {
    return setId(id);
  };

firebase.auth().onAuthStateChanged((user) => {
    if (user) {
      login(user.uid).then(() => {
       
    history.push("/welcome");
        
      });
    } else {
     
      history.push("/");
     
    }
  });
Run Code Online (Sandbox Code Playgroud)
const PrivateRoute = ({ getId, component: Component, ...rest }) => (
  <Route
    {...rest}
    component={(props) =>
      getId ? (
        <div>
         
          <Component {...props} />
        </div>
      ) : (
        <Redirect to="/" />
      )
    }
  />
);
Run Code Online (Sandbox Code Playgroud)

firebase reactjs use-context

4
推荐指数
1
解决办法
6631
查看次数

打字稿错误 - 无法在包装的子组件中找到反应上下文

我正在尝试使用这篇文章作为指导,从子组件动态设置父组件中的上下文

这是我的 App.tsx:

export interface User {
  username: string;
}

export interface iUserContext {
  users: User[];
  setUsers: React.Dispatch<React.SetStateAction<User[]>>;
}

function App() {
  const [users, setUsers] = useState<User[]>([]);
  const value = { users, setUsers };

  // set defaults
  const UsersContext = createContext<iUserContext>({
    users: [],
    setUsers: () => {},
  });

  return (
    <div className="App">
      <Router>
        <UsersContext.Provider value={value}>
          <Layout>
            <Switch>
              <Route path="/generated-links">
                <GeneratedLinks />
              </Route>
              <Route path="/">
                <GenerateLinks />
              </Route>
            </Switch>
          </Layout>
        </UsersContext.Provider>
      </Router>
    </div>
  );
}
Run Code Online (Sandbox Code Playgroud)

然后,在GenerateLinks.tsx中:

const GenerateLinks = () …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs react-hooks use-context

3
推荐指数
1
解决办法
2507
查看次数

将上下文拆分为状态并更新以提高性能(减少渲染)?

一些博客文章在使用React Context时将上下文分为两个单独的更新和状态上下文。我想知道这是否真的提高了性能或可以减少渲染周期。

所以最终的解决方案将是:

  • 两个不同的上下文对象
  • 两个不同的钩子用于1.) 访问状态2.) 修改状态
  • 两个独立的提供者(包装成一个单独的提供者,如AuthProvider

拆分更新状态上下文的解决方案:

const authContext = React.createContext<AuthUser | null | undefined>(undefined)
const authUpdateContext = React.createContext<Dispatch<SetStateAction<AuthUser | null>> | null>(null)

export function useAuth() {
    const authUser = React.useContext(authContext);
    if (authUser === undefined) throw new Error(`useAuth must be used within a ContextAuthProvider`);
    return authUser;
}

export const useAuthUpdate = () => {
    const setAuthUser = React.useContext(authUpdateContext);
    if (!setAuthUser) throw new Error(`useAuthUpdate must be …
Run Code Online (Sandbox Code Playgroud)

reactjs react-hooks use-context

3
推荐指数
1
解决办法
4259
查看次数

React jest 测试错误 - useContext 对象未定义

希望你们在这种情况下一切顺利:) 在 React 应用程序的 App 组件中运行渲染测试时,我在 useContext 中遇到错误。

  • 这是上下文 api

    const { userId } = useContext(UserContext);

  • 这是错误

    TypeError:无法解构“(0,_react.useContext)(...)”的属性“userId”,因为它未定义。

    35 | 35 const { userId } = useContext(UserContext);

该对象一开始是未定义的,因为它是获取 userId 的 API 调用。登录后,用户 ID 可用。因此,在开发中运行时,它可以正常工作,但在运行测试时,它会显示此错误。

  • 最后是 UserContext 组件:

    导出 const UserContext = createContext();

     const UserProvider = ({ children }) => {
       const [userId, setUserId] = useState("");
       const getUserId = async () => {
         if (token) {
           await axios
             .get(`${baseURL}/auth/user`, {
               headers: {
                 authorization: token
               }
             })
             .then(function …
    Run Code Online (Sandbox Code Playgroud)

unit-testing reactjs jestjs react-testing-library use-context

3
推荐指数
1
解决办法
5002
查看次数

React Context Provider 未设置值

我正在尝试开始使用 React 上下文挂钩,但我似乎遇到了一个我不明白的问题。

我定义了一个用户上下文,它只是一个表示“hello user”的字符串,如下所示:

import { useContext, createContext } from "react"

export const UserContext = createContext<string | null>(null)

export interface IAuth {
  children: React.ReactNode;
}

const Auth: React.FC<IAuth> = (props) => {

  return(
    <UserContext.Provider value={"hello user"}>
      {props.children}
    </UserContext.Provider>
  )
}

export default Auth
Run Code Online (Sandbox Code Playgroud)

然后我尝试访问是这样的:

const Dash: NextPage<dashPageProps> = (props) => {

  const contextMsg = useContext(UserContext)

  const submitForm = () => {
    console.log("logout")
  }

  return (
    <Auth>
    <div className="w-screen">
      <div className='text-xl'>
        Dashboard
      </div>
      <h1>{contextMsg}</h1>
      <button className='bg-gray-400 border-2 border-gray-600 w-fit mt-5' …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs next.js use-context

3
推荐指数
1
解决办法
3887
查看次数

如何在自己的单独文件中创建 React Context?

我正在学习 React 并使用上下文构建一个项目。最初我在 App.js 组件中构建上下文,但我想将其分离到自己的文件中以保持 App.js 更干净。然而,我很难弄清楚这是如何完成的,或者是否可能。我认为我所关注的部分是如何提供上下文。我将新的 Context 文件与 App.js 一起粘贴在下面,并注释掉了原始的 Context 结构。有谁知道我怎样才能做到这一点?

// TaskManipulatorContext
import React, { useReducer } from "react";
import AddTask from "../Components/dnd_components/AddTask";

export const TaskManipulatorContext = React.createContext();

const taskManipulatorInitialState = {
  panelData: {
    height: 50,
    open: false,
    title: "title",
    content: "content",
  },
  newTask: false,
  deleteTask: false,
  taskContainer: null,
};

const taskManipulatorReducer = (state, action) => {
  switch (action.type) {
    case "addTask-botPanel":
      // Brings up bottom panel to add new task
      return {
        ...state,
        panelData: {
          ...state.panelData, …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs use-context

2
推荐指数
1
解决办法
2562
查看次数

如何以 useContext 作为依赖项正确使用 useEffect

我正在开发我的第一个 React 项目,但遇到以下问题。我希望我的代码如何工作:

  • 我将项目添加到可通过上下文访问的数组中(context.items)
  • 我想在组件中运行 useEffect 函数,只要值发生变化,就会显示 context.items

我尝试过的:

  1. 将上下文( 和contextcontext.items列为 useEffect 中的依赖项
  • 这导致组件在值更改时不更新
  1. 列出context.items.length
  • 然而,这导致组件在数组长度发生变化时更新,而不是在单个项目的值发生变化时更新。
  1. 将上下文包装在Object.values(context)
  • 结果正是我想要的,除了 React 现在抱怨*传递给 useEffect 的最后一个参数改变了渲染之间的大小。该数组的顺序和大小必须保持不变。*

您知道有什么方法可以修复此 React 警告或在上下文值更改时运行 useEffect 的不同方法吗?

好吧,不想添加代码,希望这对我来说是一些简单的错误,但即使有一些答案,我仍然无法解决这个问题,所以在这里,减少了希望简化。

上下文组件:

const NewOrder = createContext({
  orderItems: [{
    itemId: "",
    name: "",
    amount: 0,
    more:[""]
  }],
  addOrderItem: (newOItem: OrderItem) => {},
  removeOrderItem: (oItemId: string) => {},
  removeAllOrderItems: () => {},
});

export const NewOrderProvider: React.FC = (props) => {
  // state
  const [orderList, setOrderList] = useState<OrderItem[]>([]);

  const …
Run Code Online (Sandbox Code Playgroud)

reactjs use-effect react-functional-component use-context

2
推荐指数
1
解决办法
7990
查看次数