React.js — Как я могу легко вызвать метод компонента из любого места?

#javascript #reactjs

Вопрос:

Я создаю приложение для обработки данных, которое часто обновляет пользователя тостами, поэтому я настроил <ToastContainer /> компонент, содержащий метод doToast(title, time, content){...} , и он отлично работает для создания тостов на экране, которые автоматически отображаются через некоторое время.

 export default class ToastContainer extends Component {

  constructor(props) {
    super(props);

    this.state = {
      toastList: [],
    }

    this.pushToast = this.pushToast.bind(this);
  }

  render() {
    return(
      
      <div id="toast-container" className="toast-container position-absolute top-0 end-0 p-3" style={{'zIndex': 999}}>

        {this.state.toastList.map(toast => (

          <Toast ... />

        ))}

      </div>
    )
  }

  pushToast(title, time, content)
  {

    var newToast = {
      title: title,
      time: time,
      content: content,
    }

    this.setState({
      toastList: [...this.state.toastList, newToast]
    })
  }

}
 

На протяжении всего моего приложения у меня есть компоненты, которые совершают вызовы AJAX на мой сервер, и я хотел бы иметь возможность легко уведомлять пользователя о том, что произошло во время/после вызова, с тостом (т. Е. успех, предупреждение, сбой и т. Д.).

Единственный известный мне способ вызова методов из другого компонента-передать этот метод в качестве поддержки дочернему компоненту. Я не хочу, чтобы мне приходилось передавать doToast метод в длинную цепочку компонентов каждый раз, когда я хочу вызвать тост-есть ли способ «глобального» вызова doToast() , чтобы я мог использовать его волей-неволей?

Комментарии:

1. Может быть, заглянуть в Context api? reactjs.org/docs/context.html

2. Я думаю, у вас могут быть useReducer функции, которые будут предоставлять функции для добавления любых новых тостов через контекст. Вы ToastContainer можете считывать состояние из контекста, а затем визуализировать. Сделает его действительно слабо связанным.

3. Я сделал нечто подобное, используя функциональные компоненты — replit.com/@jaybhatt21/Create-React-App . Он может попросить вас создать учетную запись, извините за это.