2016-06-15 4 views
4

у меня есть:деструктурирующего объект и игнорировать один из результатов

const section = cloneElement(this.props.children, { 
    className: this.props.styles.section, 
    ...this.props, 
}); 

Внутри this.props, у меня есть styles свойства, что я не хочу, чтобы перейти к клонированному элементу.

Как я могу это сделать?

+0

Сейчас я просто определяю 'styles: null' после' ... this.props', и это работает, но это не супер приятно. –

+0

Вы попробовали мой ответ? – ctrlplusb

+0

Да, жаль, что это не работает для меня, потому что у меня уже есть стили. –

ответ

9

Вы можете использовать object rest/spread syntax:

// We destructure our "this.props" creating a 'styles' variable and 
// using the object rest syntax we put the rest of the properties available 
// from "this.props" into a variable called 'otherProps' 
const { styles, ...otherProps } = this.props; 
const section = cloneElement(this.props.children, { 
    className: styles.section, 
    // We spread our props, which excludes the 'styles' 
    ...otherProps, 
}); 

Я предполагаю, что у вас уже есть поддержка от этого синтаксиса на основе кода выше, но следует помнить, что это планируемая синтаксис, который доступен для вас через babel stage 1 preset. Если вы получаете ошибки синтаксиса на исполнение можно установить пресет следующим образом:

npm install babel-preset-stage-1 --save-dev 

А затем добавить его в разделе предустановок вашей конфигурации Бабель. Например, в вашем файле .babelrc:

"presets": [ "es2015", "react", "stage-1" ] 

Обновление на основе комментариев по вопросу по ОП.

Хорошо, вы говорите, что у вас уже есть переменная styles, объявленная перед этим блоком? Мы можем справиться и с этим делом. Чтобы избежать этого, вы можете переименовать свои деструктивные аргументы.

Например:

const styles = { foo: 'bar' }; 

const { styles: otherStyles, ...otherProps } = this.props; 
const section = cloneElement(this.props.children, { 
    className: otherStyles.section, 
    // We spread our props, which excludes the 'styles' 
    ...otherProps, 
}); 
+1

Я не думаю, что это работает из коробки с предварительной настройкой. Было бы полезно, если бы вы объяснили, как настроить Babel для использования этого. –

+0

Это действительно творческий ответ, я не знал, что это возможно с помощью оператора спреда –

0

Мне нравится ответ ctrlplusb, но здесь является альтернативой использования Object.assign, если вы не хотите, чтобы добавить новое столпотворение предустановленное:

const section = cloneElement(this.props.children, { 
    className: this.props.styles.section, 
    ...Object.assign({}, this.props, { 
     styles: undefined 
    }) 
}); 
+0

. Тогда у вас есть неопределенное свойство –

+0

. Это не должно иметь значения для вашего приложения. Если вы попытаетесь получить доступ к 'prop', который не был передан вашему компоненту, значение будет' undefined' в любом случае. Это почти эквивалентно, если вы не полагаетесь на существование определенного ключа, предоставленного вашим реквизитам. –

0

или вы можете сделать что-то вроде этого ...

var newProp = (this.props = {p1, p2,...list out all props except styles}); 
Смежные вопросы