Comment ajouter des attributs HTML personnalisés dans JSX

il y a différentes raisons derrière cela, mais je me demande comment ajouter simplement des attributs personnalisés à un élément dans JSX?

37
demandé sur usr1234567 2015-07-07 18:34:33

8 réponses

modifier: mise à jour pour refléter React 16

Les attributs personnalisés

sont supportés nativement dans React 16. Cela signifie que l'ajout d'un attribut personnalisé à un élément est maintenant aussi simple que son ajout à une fonction render , comme suit:

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

pour plus:

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


précédente réponse (React 15 and earlier)

Les attributs personnalisés

ne sont actuellement pas supportés. Voir ce numéro ouvert pour plus d'informations: https://github.com/facebook/react/issues/140

comme solution de contournement, vous pouvez faire quelque chose comme ça dans componentDidMount :

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

Voir https://jsfiddle.net/peterjmag/kysymow0/ pour un exemple. (Inspiré par la suggestion de syranide dans ce commentaire .)

44
répondu peterjmag 2018-09-25 14:17:25

vous pouvez ajouter un attribut en utilisant ES6 spread operator, par exemple

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

et dans la méthode render:

<MyComponent {...myAttr} />
32
répondu Spadar Shut 2016-11-08 14:02:11

Considérez que vous souhaitez passer un attribut personnalisé nommé myAttr avec la valeur myValue , cela va fonctionner:

<MyComponent data-myAttr={myValue} />
14
répondu Luca Fagioli 2017-06-26 11:55:15

vous pouvez utiliser l'attribut est " pour désactiver L'attribut React whitelist pour un élément.

Voir mon anwser ici: Stackoverflow

9
répondu Christian Steinmann 2017-05-23 12:10:47

j'ai rencontré ce problème beaucoup en essayant D'utiliser SVG avec react.

j'ai fini par utiliser une solution assez sale, mais il est utile de savoir que cette option existait. Ci-dessous, j'autorise l'utilisation de l'attribut vector-effect sur les éléments SVG.

import SVGDOMPropertyConfig from 'react/lib/SVGDOMPropertyConfig.js';
import DOMProperty from 'react/lib/DOMProperty.js';

SVGDOMPropertyConfig.Properties.vectorEffect = DOMProperty.injection.MUST_USE_ATTRIBUTE;
SVGDOMPropertyConfig.DOMAttributeNames.vectorEffect = 'vector-effect';

aussi longtemps que cela est inclus/importé avant que vous ne commenciez à utiliser react, cela devrait fonctionner.

4
répondu rbhalla 2015-07-08 18:43:25

selon la version de React que vous utilisez, vous pourriez avoir besoin d'utiliser quelque chose comme ça. Je sais que Facebook pense à dévaloriser les "string Ref" dans un avenir proche.

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

documentation de référence de Facebook

1
répondu Dixon Minnick 2016-09-07 17:37:09

selon ce qui vous empêche de faire cela, il y a une autre option qui ne nécessite aucun changement à votre implémentation actuelle. Vous devriez être en mesure de augmenter React dans votre projet avec un fichier .ts ou .d.ts (pas sûr lequel) à la racine du projet. Il ressemblerait à quelque chose comme ceci:

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

une autre possibilité est la suivante:

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

voir JSX / Type Contrôle

vous pourriez même avoir à envelopper dans un declare global { . Je n'ai pas atterri sur une solution définitive encore.

voir aussi: comment ajouter des attributs aux éléments HTML existants dans TypeScript/JSX?

0
répondu jedmao 2018-02-15 23:36:14

voir valeur d'attribut dans la console sur l'événement de clic

//...
   alertMessage (cEvent){
           console.log(cEvent.target.getAttribute('customEvent')); /*display attribute value */
        }
//...

simple ajouter customAttribute comme votre souhait dans la méthode de rendu

render(){
    return <div>
//..
    <button customAttribute="My Custom Event Message" onClick={this.alertMessage.bind(this) } >Click Me</button>
            </div>
        }
//...
0
répondu GMK Hussain 2018-06-26 07:40:25