How to add custom html attributes in JSX

后端 未结 11 1819
南方客
南方客 2020-11-27 18:14

There are different reasons behind it, but I wonder how to simply add custom attributes to an element in JSX?

相关标签:
11条回答
  • 2020-11-27 18:54

    EDIT: Updated to reflect React 16

    Custom attributes are supported natively in React 16. This means that adding a custom attribute to an element is now as simple as adding it to a render function, like so:

    render() {
      return (
        <div custom-attribute="some-value" />
      );
    }
    

    For more:
    https://reactjs.org/blog/2017/09/26/react-v16.0.html#support-for-custom-dom-attributes
    https://facebook.github.io/react/blog/2017/09/08/dom-attributes-in-react-16.html


    Previous answer (React 15 and earlier)

    Custom attributes are currently not supported. See this open issue for more info: https://github.com/facebook/react/issues/140

    As a workaround, you can do something like this in componentDidMount:

    componentDidMount: function() {
      var element = ReactDOM.findDOMNode(this.refs.test);
      element.setAttribute('custom-attribute', 'some value');
    }
    

    See https://jsfiddle.net/peterjmag/kysymow0/ for a working example. (Inspired by syranide's suggestion in this comment.)

    0 讨论(0)
  • 2020-11-27 18:55

    Depending on what exactly is preventing you from doing this, there's another option that requires no changes to your current implementation. You should be able to augment React in your project with a .ts or .d.ts file (not sure which) at project root. It would look something like this:

    declare module 'react' {
        interface HTMLAttributes<T> extends React.DOMAttributes<T> {
            'custom-attribute'?: string; // or 'some-value' | 'another-value'
        }
    }
    

    Another possibility is the following:

    declare namespace JSX {
        interface IntrinsicElements {
            [elemName: string]: any;
        }
    }
    

    See JSX | Type Checking

    You might even have to wrap that in a declare global {. I haven't landed on a final solution yet.

    See also: How do I add attributes to existing HTML elements in TypeScript/JSX?

    0 讨论(0)
  • 2020-11-27 18:56

    Depending on what version of React you are using, you may need to use something like this. I know Facebook is thinking about deprecating string refs in the somewhat near future.

    var Hello = React.createClass({
        componentDidMount: function() {
            ReactDOM.findDOMNode(this.test).setAttribute('custom-attribute', 'some value');
        },
        render: function() {
            return <div>
                <span ref={(ref) => this.test = ref}>Element with a custom attribute</span>
            </div>;
        }
    });
    
    React.render(<Hello />, document.getElementById('container'));
    

    Facebook's ref documentation

    0 讨论(0)
  • 2020-11-27 18:57

    if you are using es6 this should work:

    <input {...{ "customattribute": "somevalue" }} />
    
    0 讨论(0)
  • 2020-11-27 18:58

    You can add an attribute using ES6 spread operator, e.g.

    let myAttr = {'data-attr': 'value'}
    

    and in render method:

    <MyComponent {...myAttr} />
    
    0 讨论(0)
提交回复
热议问题