2017-02-18 2 views
0

Есть ли способ получить ширину детей с компонентами React. У меня есть компонент оболочки, называемый отсутствием имени Container, и я добавляю к нему дочерние элементы div типа из Component1. Пример ниже. Мне интересно, есть ли способ получить ширину каждого дочернего элемента div в контейнере, когда он монтируется.React props.children width

ОБНОВЛЕНО Примечание: Причина Я пытаюсь получить контейнеры детей ширины так, я могу установить динамические контейнеры ширины на основе общего количества детей. Установив ширину контейнеров на количество детской ширины, я могу разрешить некоторые эффекты горизонтальной прокрутки, которые я хочу сделать.

Компонент 1

export default class Component1 extends Component{ 
render(){ 
    return(
    <Container> 
     <div className="large-box"/> 
     <div className="large-box-dark"/> 
    </Container> 
) 
} 
} 

Теперь мой Container компонент.

export default class Container extends Component{ 
     componentDidMount(){ 
     this.props.children.forEach((el) => { 
     // get each child's width 
     console.log("el =", el); 
     }); 
     } 


    render() { 
    return (
     <div className="scroller" ref={(scroller) => { this.scroller = scroller }}> 
     {this.props.children} 
     </div> 
    ) 
    } 
} 
+1

Не могли бы вы объяснить, зачем это нужно? Возможно, я ошибаюсь, но это похоже на неправильный подход к более простому решению. –

+0

Итак, я хотел получить ширину всех детей, объединенных, чтобы я мог установить общую ширину в контейнере this.scroller. Вот почему. –

ответ

0

Я бы сказал, что технически это не представляется возможным. JSX

<div className="large-box"/> 

не относится к DOM элементу, (который имеет ширину, как только это было вынесено), но к React элемента, который является объектом в памяти, описывающая, как сделать DOM-элемент. Поскольку элемент React не отображается или даже связан с фактическим DOM в браузере, он не может знать ширину.

Помните, что React может отображаться на сервере - сервер не может знать, что браузер на другом компьютере будет отображаться.

Я бы также повторил то, что отметил Педро Насименто - это решение, вероятно, лучше всего решается каким-то другим способом, но без контекста его трудно помочь.

+1

Реакция может отображаться на сервере, но он выполняет обработку в компоненте componentDidMount, который является vaild, поскольку он работает только на клиенте. – Fyre

+0

Так что все, что я пытаюсь сделать, это получить ширину контейнеров детей. Довольно просто в большинстве инфраструктур JS. Спасибо за разъяснение выше, но я использую componentDidMount, поэтому компонент должен быть установлен вместе со своими дочерними элементами.Причина, по которой я хочу, чтобы ширина детей заключалась в том, чтобы получить общую ширину элементов в контейнере, чтобы я мог установить фиксированную ширину в контейнере для горизонтальной прокрутки. –

+0

Gotcha. Есть ли альтернатива, например, с помощью css [overflow-y] (https://www.w3schools.com/cssref/css3_pr_overflow-y.asp) для автоматической настройки области прокрутки? –

1

Вы можете использовать refs. Хотя вам следует избегать касания DOM до тех пор, пока не будет другого пути. Но здесь мы идем.

Дайте вашим дочерним компонентам ref, который является выходным люком, предоставленным React для доступа к DOM (с предупреждением использовать другие методы, прежде чем приступать к этому).

Детского компонент

class ChildComp extends Component { 
    getWidth =() => { 
    //Access the node here and get the width 
    return this.childNode.offsetWidth(); //or clientWidth(); 
    } 
    render() { 
    return (
     <div ref={(r) => {this.childNode = r}}> 
     </div> 
    ); 
    } 
} 

Родитель Компонент:

class ParentComp extends Component { 
    componentDidMount() { 
    //Access the child component function from here 
    this.childComponent.getWidth(); 
    } 
    render() { 
    return (
     <ChildComp 
      ref={(r) => {this.childComponent = r}} /> 
    ); 
    } 
} 

Но помните использовать вышеупомянутый метод, когда нет никакого способа получения вещи сделать декларативно.

+0

Спасибо Fyre, да, я начал использовать refs для детей, но подумал, что это немного надработало решение, чтобы добавить все это к детям, чтобы получить простую ширину. Извините, я не совсем понимаю ваше утверждение: «Хотя вам следует избегать касания DOM до тех пор, пока не будет другого пути». Если кто-то еще не купит здесь, но похоже, что другого пути нет. Кроме того, что происходит, не касаясь элемента DOM. React никогда не говорит, не трогайте DOM. Если вы не коснулись элемента DOM, как бы вы нашли его ширину? Спасибо за ваше решение. –

+1

Причиной не касания DOM являются операции DOM, которые дорогостоящие, и если вы неправильно их используете, ваша производительность действительно пострадает, поэтому вы должны позволить React обрабатывать операции DOM как оптимальные. Получение ширины - это сценарий, в котором нет другого пути (если вы не используете фиксированную ширину, которую вы можете хранить где-нибудь в конфигурациях JS). Не могли бы вы сообщить мне, почему это перегруженное решение. Если нам нужно что-то из динамического свойства DOM, такого как ширина или высота, нам нужно получить доступ к узлу DOM и отреагировать на это, используя метод refs. Пожалуйста, дайте мне знать, существуют ли другие способы. – Fyre

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