Ответ 1
Две основные проблемы с этой настройкой:
1. Вы никогда не должны обращаться к методам жизненного цикла реакции напрямую
2. Бэкворы в компоненты - плохая идея, которая разрушает работоспособность реагирования
Объявление 1:
Если вы вызываете render()
(или любой другой метод реагирования) напрямую, ответ, вероятно, не вызывает componentDidMount()
, componentDidUpdate() `и другие методы жизненного цикла в дереве компонентов.
Опасности:
- Многие проекты с реагирующим компонентом в значительной степени зависят от методов жизненного цикла:
getInitialState()
,componentWillReceiveProps()
,shouldComponentUpdate()
,componentDidMount()
и т.д. и т.д. Если вы вызываетеrender()
напрямую, многие компоненты, скорее всего, сломаются или показать странное поведение. - Вы рискуете взломать механизм разностных разностей: через управление жизненным циклом, реакция хранит виртуальную копию DOM в ее (внутренней) памяти. Чтобы правильно работать, целостность этой копии, если она необходима, чтобы реагировать на работу.
Лучше было бы (но все же в нарушение моей второй точки):
- Включите другой метод внутри компонента.
- Что имеет
setState()
, если вы хотите повторно выполнить рендеринг. - И вызовите этот метод извне.
Объявление 2. Прямая ссылка на смонтированный компонент (как ваш thisManager делает) имеет некоторые дополнительные риски. Реагирование конструкций и ограничений существует по одной причине: поддерживать однонаправленный поток и иерархию компонентов с помощью реквизита и состояния, чтобы упростить обслуживание.
Если вы нарушите этот шаблон - построив бэкдор в компонент, который позволяет манипулировать состоянием - вы нарушаете этот конструктивный принцип реакции. Это быстрый ярлык, но он может вызвать сильную боль и раздражение, когда ваше приложение растет.
Насколько я знаю, единственными допустимыми исключениями для этого правила являются:
- Методы внутри компонента, отвечающего на результаты вызова ajax, для обновления состояния (например, после извлечения данных с сервера)
- Методы внутри компонента для обработки триггеров из его дочерних дочерних компонентов (например, проверка выполнения в форме после нажатия дочерней кнопки)
Итак, если вы хотите использовать его для этой цели, тогда вам все будет в порядке.
Слово предупреждения: стандартный подход реагирования защищает произвольный доступ к компонентам, поскольку вызывающий компонент или метод должен иметь ссылку на компонент. В обоих примерах такая ссылка доступна.
В вашей настройке ЛЮБОЙ внешний фрагмент кода мог найти ref в "заголовке" в вашей таблице и вызвать метод, который обновляет состояние.
С такой косвенной ссылкой и никоим образом не указывая, какой источник на самом деле называется вашим компонентом, ваш код, вероятно, станет намного сложнее отлаживать/поддерживать.