【问题标题】:Add dynamic html attributes to child component from parent component - React.js从父组件向子组件添加动态 html 属性 - React.js
【发布时间】:2018-07-22 16:40:12
【问题描述】:

子组件:

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属性

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

使用 Destructing 和 Babel Showing error(unexpected token) 如下图所示。

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

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    您可以在子组件中使用rest destructuring 模式。根据documentation

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

    当你直接将 props 分配给 DOM 元素时,你应该小心使用 rest 破坏,因为从 v16 onwards 开始,没有对属性进行检查,并且允许在 DOM 元素上传递所有属性,所以即使它不相关,属性将被传递到您可能不想要的 DOM 元素

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

    示例 sn-p

    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>
          );
      }
    }
    

    【讨论】:

    • 我们已经有了 babel preset-env,但是在安装 babeljs.io/docs/plugins/transform-object-rest-spread 之后在 {...rest} 中抛出了一个错误(意外的令牌)。它工作正常。既然我们有preset-env,那为什么我们需要额外的插件来支持这个功能。
    • @Balaji731,检查这个问题,github.com/babel/babel-preset-env/issues/49。这里提到所有 stage-x 问题都不包含在 preset-env 中,而 rest-spread 是一个 stage-3 提案,因此您需要一个插件
    • 所以如果我使用 babel-preset-stage-3,我不需要 transform-object-rest-spread 这个权利!!!据我了解,预设 env 仅支持 es6 完成的功能。除此之外,如果我需要使用其他 es6 不太稳定的提案,我应该安装 babel-stage-3 代替。我说的对吗?
    • 假设我们在孩子身上多了几个按钮。在那种情况下,我可能有不同的情况。有些样式适用于一个按钮,有些适用于其他按钮。那么在这种情况下如何将值从父母传递给孩子呢?
    • @AkhilaHegde 您可以使用您的样式创建多个此类对象并将它们传递给相应的按钮。或者,您可以拥有一个具有公共集合的对象,以及可以在传播公共属性时传递的额外对象
    【解决方案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>
    

    如果你想传递所有的动态属性,你应该相应地解构 props。像这样:{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

    【讨论】:

    • 我们已经有了 babel preset-env,但是在安装 babeljs.io/docs/plugins/transform-object-rest-spread 之后在 {...rest} 中抛出了一个错误(unexpected token)。它工作正常。既然我们有preset-env,那为什么我们需要额外的插件来支持这个功能
    猜你喜欢
    • 2019-04-30
    • 2015-04-25
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多