Destructuring object and ignore one of the results

前端 未结 4 1531
挽巷
挽巷 2020-12-18 18:15

I have:

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

Inside this.

相关标签:
4条回答
  • 2020-12-18 18:39

    You can use the 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,
    });
    

    I assume that you already have support from this syntax based on your code above, but please be aware that this is a proposed syntax which is made available to you via the babel stage 1 preset. If you get syntax errors on execution you can install the preset as follows:

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

    And then add it to the presets section of your babel configuration. For example in your .babelrc file:

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

    Update based on comment on question by OP.

    Okay, so you say that you already have a styles variable declared before this block? We can manage this case too. You can rename your destructured arguments to avoid this.

    For example:

    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,
    });
    
    0 讨论(0)
  • 2020-12-18 18:40

    I like ctrlplusb's answer, but here is an alternative using Object.assign if you don't want to add a new babel preset:

    const section = cloneElement(this.props.children, {
        className: this.props.styles.section,
        ...Object.assign({}, this.props, {
            styles: undefined
        })
    });
    
    0 讨论(0)
  • 2020-12-18 18:45

    You could use Object Rest Spread operator magic.

    const props = { a: 1, b: 2, c: 3 };
    const { a, ...propsNoA } = props;
    console.log(propsNoA); // => { b: 2, c: 3 }
    

    So in your case it would be:

    const { styles, ...propsNoStyles } = this.props;
    const section = cloneElement(this.props.children, {
      className: this.props.styles.section
      ...this.propsNoStyles,
    });
    
    0 讨论(0)
  • 2020-12-18 18:50

    or you can do something like this...

    var newProp = (this.props = {p1, p2,...list out all props except styles});
    
    0 讨论(0)
提交回复
热议问题