2016-03-23 4 views
3

У меня есть компонент, Split, который занимает двоих детей. Первый ребенок будет отображаться в левой части экрана & вторым ребенком с правой стороны. Если ширина экрана будет ниже определенной точки, тогда отобразится только правая сторона, а левая сторона будет удалена из DOM.Реагировать: Предотвратить повторный набор, когда родительские ререйдеры

Пример детей может быть компонентом Sidebar и компонентом Content. Для мобильных устройств я не хочу отображать меню, но имею специальное мобильное меню, которое я всплываю.

Мой вопрос: Как я могу удалить компонент Sidebar без размонтирования & переустановка компонента Content?

В принципе у меня есть что-то вроде этого:

<Split> 
    <Sidebar/> 
    <Content/> 
</Split> 

И Split «s метод визуализации выглядит примерно так:

let children; 
let firstChild = this.props.children[0]; 
let lastChild = this.props.children.pop(); 
if (this.state.responsive === 'singleColumn') { 
    children = (
    <div> 
     <div style={{display: 'none'}}>{firstChild}</div> 
     {lastChild} 
    </div> 
); 
} else { 
    children = (
    <div> 
     {firstChild} 
     {lastChild} 
    </div> 
); 
} 

return (
    <div> 
    {children} 
    </div> 
); 

Даже если {LastChild} всегда визуализируется, независимо от того, что он по-прежнему размонтируется и монтируется каждый раз, когда раскол должен перерисовываться!

Даже имея рендер, который выглядит следующим образом:

return (
    <div> 
    {this.props.children.pop()} 
    </div> 
); 

вызывает последний ребенок (который никогда не меняется), чтобы быть демонтирована & перемонтирована перед тем, как оказано.

Если я вместо изменения Split и передать компонент, который всегда будет в DOM в качестве атрибута, как так:

<Split staticComponent={<Content />}> 
    <Sidebar /> 
</Split> 

он прекрасно работает. Тогда почему это не работает, когда я просто выталкиваю последнего такого ребенка {this.props.children.pop()} в противоположность этому {this.props.staticComponent}

Есть ли разумный способ решить эту проблему?

+0

Я понял, что вы имеете в виду сейчас, следовательно, вы пытаетесь использовать css здесь? это больше проблема с этим нет? при определенном размере экрана вам нужно изменить стиль на этом дочернем элементе: none..hope, который помогает – JordanHendrix

+0

проверить эту статью, примерно на полпути вниз, они проходят аналогичный сценарий на основе размера экрана https: // medium.com/@jviereck/modularise-css-the-react-way-1e817b317b04#.wew0pfsyh – JordanHendrix

+0

Ну, дело в том, что Split поступает из библиотеки, и это действительно приятно и отлично работает без написания каких-либо CSS, кроме этой проблемы. Поэтому чистым решением для CSS является не то, что я хочу. Я хочу, чтобы React переместил компонент {lastChild}, а не удалял и вставлял его в DOM. –

ответ

1

Наконец-то удалось решить проблему! Я переписал Split «s воздавать выглядеть примерно так:

let left; 
if (this.state.responsive !== 'singleColumn') { 
    left = this.props.children.slice(0, -1); 
} 

return (
    <div ref="split" className={classes.join(' ')}> 
    {left} 
    {this.props.children[this.props.children.length-1]} 
    </div> 
); 

Таким образом, последний ребенок всегда визуализируется. Очевидно, pop() не работал, потому что тогда я изменил исходный массив дочерних элементов, который вызвал странное поведение.

0

Это может быть сделано с помощью метода жизненного цикла: shouldComponentUpdate:

shouldComponentUpdate: function(nextProps, nextState) { 
    return this.props.value !== nextProps.value; 
} 

Если логика внутри возвращать ложь, то компонент не будет обновляться.

ЗАКАНЧИВАТЬ документы: https://facebook.github.io/react/docs/advanced-performance.html

+0

Компонент Split должен все же повторно отображать. Но последний переданный ребенок никогда не должен удаляться из DOM. Поэтому я не думаю, что shouldComponentUpdate поможет мне, к сожалению :( –

+0

это должно идти в компонент, который вы хотите контролировать, а не разделить – JordanHendrix

+0

shouldComponentUpdate будет мешать отображению компонента. Я хочу, чтобы компонент Split не размонтировал мой подкомпонент. –

0

Вы можете использовать функцию shouldComponentUpdate в жизненном цикле компонента. Если он возвращает false, в соответствии с документацией

Если shouldComponentUpdate возвращает false, то render() будет полностью пропущен до следующего изменения состояния. Кроме того, componentWillUpdate и componentDidUpdate не будут вызываться.

+0

Это только предотвращает рендеринг. Я хочу предотвратить от размонтирования и перекомпоновки моего компонента , потому что тогда он теряет его состояние и извлекает данные снова на componentDidMount –

+0

Так вы хотите повлиять только на компонент ? Мое предположение было бы то, что это должно быть обрабатывается внутри самого компонента , вы можете передать функцию через реквизиты , и когда это вызвано от , скроет себя (при визуализации), и это будет только один пострадавший, поэтому не влияет на northsideknight

+0

Да, я понимаю, я мог бы обойти это так. Но я использую библиотеку под названием Grommet, у которой есть этот компонент Split, который скрывает первого ребенка, когда окно становится слишком маленьким. Однако второй ребенок по-прежнему страдает от повторного подключения: (мне нужно, чтобы React понимал, что ничего не было сделано с , и поэтому его нельзя перемонтировать. –

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