У меня есть пользовательский компонент Foo
, чей «bar
» функция, которую я хочу, чтобы вызвать извне:React - Срабатывание метод компонент из другого компонента, как принадлежащие в том же делают()
class Foo extends React.Component {
bar() { ... }
}
Я оказание Foo
наряду с button
, целью которого является запуск Foo.bar()
:
render() {
return (
<Foo ...>
</Foo>
<Button onClick={I want to trigger Foo.bar()} />
);
}
вещи, которые я пробовал:
- Перемещение
<Button >
внутриFoo
, а затем добавитьonClick
из<Button/>
вFoo's
конструктору - связывание OnClick не работает - я вижу, что прилагается, но<Button />
еще не вызываетonClick
. (или, если он может работать, как это сделать правильно)?
Решения, которые не делают то, что я хочу:
Я вижу один potential solution, который предлагает слушать мыши во всем
MyComponent
, а затем сделать некоторые DOM-опрос, чтобы найти, если фактическая кнопка был нажат. Однако это не сработает для меня, потому чтоMyComponent
делает не собственными этими кнопками (эти кнопки не являютсяMyComponent.props.children
), и я предпочел бы мозговой штурм решения, которое не заставило бы меня переместить кнопки внутри.Another potential solution не работает: Я не могу иметь
render()
вернуть значение<MyComponent />
вvar myComp
, то внутри<Button onClick={() => {myComp.blah()}} />
, потому что сам<Button />
инстанциируется внутри<MyComponent />
как ребенок! (и они оба находятся в том же вызове render() anyways)Часть b) # 2 (выше), используя метод статического класса React-Component, также не будет работать: мне нужно это для каждого экземпляра основа.
Using app state (such as a store) не то, что я хочу, либо -
MyComponent
предназначается, чтобы быть повторно usaable виджет и не могут быть привязаны к определенному состоянию приложения или прослушивания каких-либо конкретных магазинов или магазинов действий.
Любые предложения?
Благодаря
Да, это будет работать великолепно.Большое спасибо за ясное объяснение и предложение :) – dev
Быстрое примечание: похоже, что «строка» refs не поддерживается последней версией реакции? Согласно последним документам реагирования (февраль 2017), ref теперь принимает обратный вызов, который имеет этот элемент в качестве первого параметра. Таким образом, ваше выше было бы ref = {(foo) => {this.foo = foo}} (на самом деле я получал жесткое инвариантное нарушение, используя устаревшее ref api, но используя обратный шаблон исправил проблему) – dev
Да, это хорошо идея. String refs все равно должен работать для общего случая, но в зависимости от того, как структурирован ваш код и «это», похоже, что это может привести к проблемам. Я обновил ответ, чтобы отразить использование обратного вызова для ссылки. – noveyak