Задать вопрос
@romaro

Как правильно модифицировать children-компоненты из родителя?

У меня есть компонент-обертка, в который могут помещаться другие компоненты (так же могут иметь вложения). Возникла необходимость модифицировать атрибут draggable у всех дочерних компонентов. По сути, мне нужно получить доступ к их html-тегам и выполнить setAttribute('draggable', 'false').

Конечно, я легко могу поправить это в дочернем компоненте:
return (
            <div>
                <a href={uri} draggable={false}>
                    {label}
                </a>
            </div>
        );


Но хотелось бы модифицировать из компонента-обертки. Я думаю, нужно использовать React.Children или есть другой способ?
  • Вопрос задан
  • 33 просмотра
Подписаться 1 Средний Комментировать
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Мидл фронтенд-разработчик
    5 месяцев
    Далее
  • Яндекс Практикум
    React-разработчик
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик
    10 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
React.cloneElement
https://habr.com/ru/post/676384/

тут два момента. Во первых, это надо сделать иммутабельно, то есть ты не можешь просто взять и поменять атрибут, обойдя дерево чилдренов - нужно делать замену поддеревьев, подобно тому, как это делается в редуксе. Задачка не то чтобы сложная, но вполне себе кодоварсная.

Во вторых, если у тебя не просто верстка, а например
return (
            <div>
                <a href={uri} draggable={false}>
                    {label}
                </a>
                <CustomComponent ... />
            </div>
        );

то внутрь CustomComponent ты с этим своим React.cloneElement не залезешь, там ещё нет верстки, потому что ещё не было рендера CustomComponent.
Так что если надо всё дерево патчить, то только в useLayoutEffect, не ранее, и работать уже с готовым DOM. Какие тут могут быть подводные камни, сказать трудно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 50 000 до 90 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽
IT ATLAS Москва
от 200 000 до 250 000 ₽