2014-10-01 7 views
3

РЕАКТА документация содержит следующее предупреждение:Использование рефов в реакцию

рефов доступа Никогда внутри штукатурки метода любого компонента - или в то время как метод визуализации любого компонента даже работает в любом месте в стеке вызовов.

Почему? Моя проблема заключается в том, что я пишу компонент, который излагает своих детей способами, зависящими от размеров детей. То есть мне нужно измерить узлы DOM, поэтому мне нужно получить доступ к каждому ребенку, который я планировал делать с помощью refs, в рендеринге. Что в этом плохого? Конечно, мне нужно учесть тот факт, что некоторые дети могут еще не существовать в ref (в первом рендере не существует ни одного ребенка).

Кстати, мой рендер кажется сработавшим.

ответ

4

Отказ от ответственности: Я не являюсь разработчиком ядра React, но я использую его довольно широко в большом проекте.

TL; DR: Самое безопасное место - использовать методы жизненного цикла, в методе .render() компонент по-прежнему является только декларативным описанием того, что должно быть сделано.

Beacuse, что вы строите в вашем методе .render() не компонент, который собирается быть оказаны, это описание того, что вы хотите Реагировать построить для вас. Эта конструкция происходит позже (вот когда все оптимизация приходит). В то же время объект, который вы вернули в React.createClass, будет заменен новым объектом. Визуализируйте его так, как будто вы отправляете письмо в React (объект, отправленный на .createClass()), и React отвечает пакетом (компонентом). Если вам нужно что-то сделать с субкомпонентами, которые будут созданы, посмотрите в lifecycle methods. До: .componentDidMount().

+0

Якоб, я знаю об этом. BTW, ref ref контейнера не будет заполняться, когда компонентWillMount. componentWillMount вызывается перед рендером, поэтому пока еще не созданы дети. Самый первый контейнерный рендеринг в ссылках не увидит ничего. Позже дети будут созданы и будут заполнены. В следующем рендеринге я хочу их использовать. В чем проблема? – Eduardo

+0

Возможно, мне нужно что-то прояснить. Все дети имеют уникальные ключи, а ключ для каждого ребенка - ключ. Я ожидаю, что как только refs [key] установлен, он никогда не изменится, пока ребенок существует. Я ошибаюсь в своих ожиданиях? – Eduardo

+0

Я бы по-прежнему использовал методы жизненного цикла, f.ex 'componentWillUpdate' вместо рендеринга. Зачем? А почему бы не. Это то, что рекомендуют спецификации. Если вы вычисляете размеры «на лету» в методе рендеринга, вам лучше вычислять их внутри 'componentDidMount', а затем устанавливать состояния и повторно отображать с помощью новых вычислений. – David

Смежные вопросы