简体   繁体   中英

reactjs unrecognized tag attributes

TLDR:

Is there a way to force-append an attribute to a react tag?

.

The full story:

I'm using reactjs and i've run into a problem with SVG and foreignObjects.

I wanted to center text in an SVG image so i figured the easiest approach would be to use a div in a foreign object.

It works fine on chrome, but in firefox the text isn't displayed.

On closer inspection, it appears that my

requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"
requiredExtensions="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/2000/svg"

Isn't coming through to the browser.

I've read the reactjs docs which suggested putting the prefix

data-

in, but the prefix stays in the browser.

I also tried to set the required features using the style={...}, but then this was inside the style string and not inserted as a tag attribute.

React Code: import React, {Component,PropTypes} from 'react';

export default class myComponent extends Component {
    render() {
        return (<svg width = {this.props.width}
            height = {this.props.height}>
            <foreignObject x = {0} y = {0}
            width = {this.props.width}>
            <div> <p> {this.props.title} </p> </div > </foreignObject> 
        </svg>)
    }

PARTIAL ANSWER: I haven't been able to get text in a foreignObject to work with react in firefox, but i did work out how to set 'arbitary' tag attributes.

For each of the react components i assigned refs, ie:

<div style={divStyle} ref="d2">
  <p style={{wordWrap: 'normal', textAlign: 'left', margin: 'auto', position: 'relative'}} key="p2">
    {Math.round(this.props.kW)} W
  </p>
</div>

Then in componentdidmount:

  componentDidMount() {
    this.refs.svg1.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
    this.refs.svg1.setAttribute('version', '1.2');
    this.refs.fo1.setAttribute('requiredExtensions', 'http://example.com/SVGExtensions/EmbeddedXHTML');
    this.refs.d1.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
    this.refs.fo2.setAttribute('requiredExtensions', 'http://example.com/SVGExtensions/EmbeddedXHTML');
    this.refs.d2.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
    this.refs.fo3.setAttribute('requiredExtensions', 'http://example.com/SVGExtensions/EmbeddedXHTML');
    this.refs.d3.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
    this.refs.fo4.setAttribute('requiredExtensions', 'http://example.com/SVGExtensions/EmbeddedXHTML');
    this.refs.d4.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
    this.refs.fo5.setAttribute('requiredExtensions', 'http://example.com/SVGExtensions/EmbeddedXHTML');
    this.refs.d5.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
    this.refs.fo6.setAttribute('requiredExtensions', 'http://example.com/SVGExtensions/EmbeddedXHTML');
    this.refs.d6.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
  }

This actually broke the foreign object in BOTH chrome and firefox!!

I think the issue is that i'm going by https://www.w3.org/TR/SVG/extend.html

and they have:

<body xmlns="http://www.w3.org/1999/xhtml">
    <p>Here is a paragraph that requires word wrap</p>
</body>

But since you can't use the <body> tag inside a react component, this doesn't get rendered.

I will manually edit the code in firefox and see if the inclusion of <body> in the foreign object fixes this issue.

I think the only option I have is to layer a second SVG component over the top of the first then use setInnerHTMLDangerously to write all of the foreign objects inside. Such a filthy hack!!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM