Предоставление частной функции без ссылок в React/в противном случае информация о высоте копания для реакции-бесконечности

116
16

ПРИМЕЧАНИЕ: нам нужна getStyle(). Height до отображения компонента

У меня есть свой собственный бесконечный параметр реакции, который, по сути, проходит через своих детей и передает высоты Бесконечному. Это отлично работает, когда компоненты имеют высоту, указанную в реквизитах. Например. эти работы просто прекрасны:

<InfAdapter><div style={{height:420}}/></InfAdapter>

а также

<InfAdapter><Foo height={420}/></InfAdapter>

Где Foo.render():

return <div style={{height:this.props.height}}/>

Из-за причин, я бы скорее передал стиль для ребенка Foo следующим образом:

return <div style={this.getStyle()}/>

Проблема в том, что если я использую метод getStyle, я не могу определить способ передать высоту InfAdapter.

До сих пор я пробовал следующее:

добавив {getStyle: this.getStyle} в getDefaultProps. Не получается, вероятно, потому, что getDefaultProps не имеет контекста.

делая setProps (...) в компонентеDidMount, жалуется, что компонент уже имеет родительский

делая setProps (...) в компонентеWillMount, жалуется, что компонент еще не был отображен

Fwiw InfAdapter получает такие высоты:

this.props.children.map(this.getHeight);

getHeight(c){
return c.props.height||c.props.style.height
}

Передача this.style вместо this.getStyle() также будет прекрасной, но менее идеальной. Как бы выкопать props.style.height из дочернего div, но я сомневаюсь, что это возможно, так как нам нужна высота для InfAdapter, прежде чем мы создадим Foo.

спросил(а) 2021-01-19T21:42:13+03:00 3 месяца, 2 недели назад
1
Решение
87

Решил это по-настоящему глупым взломом.

В то время как JSX преобразуется в JS, я проверяю, имеют ли классы поле стиля, и если они есть, создайте метод getDefaultProps(), который возвращает {style: whateverWasSpecifiedInThisStyle}.

Чрезвычайно уродливый, но он выполняет свою работу.

ответил(а) 2021-01-19T21:42:13+03:00 3 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема