解构对象并忽略其中一个结果
Destructuring object and ignore one of the results
我有:
const section = cloneElement(this.props.children, {
className: this.props.styles.section,
...this.props,
});
在 this.props
中,我有一个 styles
属性 我不想传递给克隆的元素。
我该怎么办?
您可以使用 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
然后将其添加到 babel 配置的预设部分。例如在你的 .babelrc 文件中:
"presets": [ "es2015", "react", "stage-1" ]
根据 OP 对问题的评论进行更新。
好吧,你是说你已经在这个块之前声明了一个 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,
});
我喜欢 ctrlplusb 的回答,但如果您不想添加新的 babel 预设,这里有一个使用 Object.assign 的替代方法:
const section = cloneElement(this.props.children, {
className: this.props.styles.section,
...Object.assign({}, this.props, {
styles: undefined
})
});
或者你可以这样做...
var newProp = (this.props = {p1, p2,...list out all props except styles});
你可以使用 Object Rest Spread operator 魔法。
const props = { a: 1, b: 2, c: 3 };
const { a, ...propsNoA } = props;
console.log(propsNoA); // => { b: 2, c: 3 }
所以在你的情况下它将是:
const { styles, ...propsNoStyles } = this.props;
const section = cloneElement(this.props.children, {
className: this.props.styles.section
...this.propsNoStyles,
});
我有:
const section = cloneElement(this.props.children, {
className: this.props.styles.section,
...this.props,
});
在 this.props
中,我有一个 styles
属性 我不想传递给克隆的元素。
我该怎么办?
您可以使用 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
然后将其添加到 babel 配置的预设部分。例如在你的 .babelrc 文件中:
"presets": [ "es2015", "react", "stage-1" ]
根据 OP 对问题的评论进行更新。
好吧,你是说你已经在这个块之前声明了一个 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,
});
我喜欢 ctrlplusb 的回答,但如果您不想添加新的 babel 预设,这里有一个使用 Object.assign 的替代方法:
const section = cloneElement(this.props.children, {
className: this.props.styles.section,
...Object.assign({}, this.props, {
styles: undefined
})
});
或者你可以这样做...
var newProp = (this.props = {p1, p2,...list out all props except styles});
你可以使用 Object Rest Spread operator 魔法。
const props = { a: 1, b: 2, c: 3 };
const { a, ...propsNoA } = props;
console.log(propsNoA); // => { b: 2, c: 3 }
所以在你的情况下它将是:
const { styles, ...propsNoStyles } = this.props;
const section = cloneElement(this.props.children, {
className: this.props.styles.section
...this.propsNoStyles,
});