应用程序组件:
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) 我正在尝试创建一个基于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) 更新配置文件时,通过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) 我正在尝试找出创建保存 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) 我正在尝试使用这篇文章作为指导,从子组件动态设置父组件中的上下文
这是我的 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) 一些博客文章在使用React Context时将上下文分为两个单独的更新和状态上下文。我想知道这是否真的提高了性能或可以减少渲染周期。
所以最终的解决方案将是:
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) 希望你们在这种情况下一切顺利:) 在 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
我正在尝试开始使用 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) 我正在学习 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) 我正在开发我的第一个 React 项目,但遇到以下问题。我希望我的代码如何工作:
我尝试过的:
context)context.items列为 useEffect 中的依赖项context.items.lengthObject.values(context)您知道有什么方法可以修复此 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 ×10
use-context ×10
react-hooks ×4
typescript ×2
firebase ×1
javascript ×1
jestjs ×1
next.js ×1
rerender ×1
unit-testing ×1
use-effect ×1
usecallback ×1