从父组件 - React.js向子组件添加动态html属性

时间:2018-02-12 13:31:13

标签: reactjs

子组件:

export default class Button extends React.Component {
constructor(props) {
    super(props);
}
render() {
 return(
        <div className="form-group">
            <button

                // Need to add dynamic html attr here e.x: data-id

                key={index} 
                id={id} 
                className={`btn btn-default ${componentClass ? componentClass : null }`} 
                type="button"
                onClick={this.props.onClick}> 

                {text}

            </button>
        </div>
    );}}

父组件:

import Button from './Button';

Class App extends React.Component {
    constructor(props) {
        super(props);
    }
    render() {
        return (
            <div className="s">
             <Button data-id="exampleData" />  // Need to add data-id attr to child button
            </div>
        );
    }

按钮组件,拥有它自己的默认属性,如上所述:id,className,type,onClick

父组件,将调用Button组件并添加一些其他属性,如data-id,onChange。

注意:在搜索了一些想法后,我知道我可以使用如下的传播操作符:

父组件:

let dynamicAttributes = {"data-id":"someString", "data-attr":"someString", "data-url":"someString"};
    return (
        <div className="s">
         <Button dataSrc={ btnSrc } {...dynamicAttributes} />
        </div>
    );

我不知道如何将Button组件中的dynamicAttributes作为html attrib

调用

期待一个好的解决方案。提前谢谢。

使用了Destructing和Babel显示错误(意外令牌),如下图所示。

enter image description here

注意:已经安装了preset-env和preset-react。

2 个答案:

答案 0 :(得分:3)

您可以在子组件中使用rest destructuring模式。根据{{​​3}}

  

Rest属性收集剩余的自己的可枚举属性键   尚未被destructuring模式挑选出来。

当你直接将道具分配给DOM元素时,你应该小心地使用rest destruct,因为从v16 onwards没有对属性进行检查,所有属性都允许在DOM元素上传递,所以甚至如果它不相关,则属性将被传递给您可能不想要的DOM元素

  

P.S。确保您不想传递给所有属性   DOM是单独解构的。

示例代码段

export default class Button extends React.Component {
  constructor(props) {
      super(props);
  }
  render() {
     const { onClick, dataSrc, ...rest } = this.props;
     return(
          <div className="form-group">
              <button
                  {...rest}
                  key={index} 
                  id={id} 
                  className={`btn btn-default ${componentClass ? componentClass : null }`} 
                  type="button"
                  onClick={onClick}> 

                  {text}

              </button>
          </div>
      );
  }
}

答案 1 :(得分:2)

如果你想传递选择性道具,你可以这样做:

<button 
  dataSrc={ btnSrc }
  data-id={this.props.data-id}
  data-attr={this.props.data-attr}
  data-url={this.props.data-url}
  key={index} 
  id={id} 
  className={`btn btn-default ${componentClass ? componentClass : null }`} 
  type="button"
  onClick={this.props.onClick}
> 
  {text}
</button>

如果你想传递所有的动态属性,你应该相应地去构造道具。这样的事情:{onClick, dataSrc, ...dynamicAttrs} = this.props;然后像这样传递它们:

<button 
  {...dynamicAttrs}
  dataSrc={ btnSrc }
  key={index} 
  id={id} 
  className={`btn btn-default ${componentClass ? componentClass : null }`} 
  type="button"
  onClick={this.props.onClick}
> 
  {text}
</button>

另外,请访问此参考:Transferring props