gpt4 book ai didi

reactjs - 在渲染函数之外访问 React Context

转载 作者:行者123 更新时间:2023-12-03 12:54:22 26 4
gpt4 key购买 nike

我正在使用新的 React Context API 而不是 Redux 开发一个新应用程序,之前使用 Redux 时,例如,当我需要获取用户列表时,我只需调用 componentDidMount 我的操作,但现在有了 React Context,我的操作位于我的 Consumer 中,它位于我的渲染函数中,这意味着每次调用我的渲染函数时,它都会调用我的操作来获取我的用户列表和这不好,因为我会提出很多不必要的请求。

那么,我如何才能只调用一次我的操作,例如在 componentDidMount 中,而不是在渲染中调用?

举个例子,看看这段代码:

假设我将所有 Provider 包装在一个组件中,如下所示:

import React from 'react';

import UserProvider from './UserProvider';
import PostProvider from './PostProvider';

export default class Provider extends React.Component {
render(){
return(
<UserProvider>
<PostProvider>
{this.props.children}
</PostProvider>
</UserProvider>
)
}
}

然后我把这个 Provider 组件包装在我的所有应用程序中,如下所示:

import React from 'react';
import Provider from './providers/Provider';
import { Router } from './Router';

export default class App extends React.Component {
render() {
const Component = Router();
return(
<Provider>
<Component />
</Provider>
)
}
}

现在,例如,在我的用户 View 中,它将是这样的:

import React from 'react';
import UserContext from '../contexts/UserContext';

export default class Users extends React.Component {
render(){
return(
<UserContext.Consumer>
{({getUsers, users}) => {
getUsers();
return(
<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}}
</UserContext.Consumer>
)
}
}

我想要的是这样的:

import React from 'react';
import UserContext from '../contexts/UserContext';

export default class Users extends React.Component {
componentDidMount(){
this.props.getUsers();
}

render(){
return(
<UserContext.Consumer>
{({users}) => {
getUsers();
return(
<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}}
</UserContext.Consumer>
)
}
}

但是,上面的示例当然不起作用,因为 getUsers 并不存在于我的 Users View 属性中。如果可能的话,正确的方法是什么?

最佳答案

编辑:随着v16.8.0中引入react-hooks,您可以通过使用 useContext 在功能组件中使用上下文。钩子(Hook)

const Users = () => {
const contextValue = useContext(UserContext);
// rest logic here
}

编辑:从版本16.6.0开始。您可以使用 this.context 在生命周期方法中使用上下文,例如

class Users extends React.Component {
componentDidMount() {
let value = this.context;
/* perform a side-effect at mount using the value of UserContext */
}
componentDidUpdate() {
let value = this.context;
/* ... */
}
componentWillUnmount() {
let value = this.context;
/* ... */
}
render() {
let value = this.context;
/* render something based on the value of UserContext */
}
}
Users.contextType = UserContext; // This part is important to access context values
<小时/>

16.6.0版本之前,您可以通过以下方式进行

为了在生命周期方法中使用 Context,您可以像这样编写组件

class Users extends React.Component {
componentDidMount(){
this.props.getUsers();
}

render(){
const { users } = this.props;
return(

<h1>Users</h1>
<ul>
{users.map(user) => (
<li>{user.name}</li>
)}
</ul>
)
}
}
export default props => ( <UserContext.Consumer>
{({users, getUsers}) => {
return <Users {...props} users={users} getUsers={getUsers} />
}}
</UserContext.Consumer>
)

通常,您会在应用程序中维护一个上下文,因此将上述登录信息打包在 HOC 中以便重用它是有意义的。你可以这样写

import UserContext from 'path/to/UserContext';

const withUserContext = Component => {
return props => {
return (
<UserContext.Consumer>
{({users, getUsers}) => {
return <Component {...props} users={users} getUsers={getUsers} />;
}}
</UserContext.Consumer>
);
};
};

然后你就可以像这样使用它

export default withUserContext(User);

关于reactjs - 在渲染函数之外访问 React Context,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49809884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com