Я розробляю новий додаток, використовуючи новий React Context API замість Redux, і раніше, Redux
коли, коли мені потрібно було отримати список користувачів, наприклад, я просто закликаю componentDidMount
свою дію, але тепер з React Context, мої дії живуть всередині мій споживач, який знаходиться всередині моєї функції візуалізації, що означає, що кожного разу, коли викликається моя функція візуалізації, він викликатиме мою дію, щоб отримати список моїх користувачів, і це погано, оскільки я буду робити багато непотрібних запитів.
Отже, як я можу зателефонувати лише один раз на свою дію, наприклад, componentDidMount
замість того, щоб зателефонувати в рендер?
Для прикладу подивіться на цей код:
Припустимо, що я обгортаю все своє Providers
в один компонент, ось так:
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>
)
}
}
Потім я розміщую цей компонент провайдера, який обгортає всю мою програму, наприклад:
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>
)
}
}
Тепер, наприклад, у моєму перегляді користувачів це буде приблизно так:
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
не перебувають у моєму перегляді користувачів. Який правильний спосіб це зробити, якщо це взагалі можливо?