Skip to content

Commit 7295100

Browse files
committed
pass data attributes through as data prop
1 parent 92e8523 commit 7295100

File tree

2 files changed

+55
-1
lines changed

2 files changed

+55
-1
lines changed

src/createElementPortal.js

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,31 @@ import React, { PropTypes } from 'react';
22
import ReactDOM from 'react-dom';
33
import invariant from 'invariant';
44

5+
const reDataAttr = /^data\-(.+)$/;
6+
7+
export const getNodeData = (node) => {
8+
// fallback
9+
if (!node.datset) {
10+
const result = {};
11+
const attributes = node.attributes;
12+
for (let i = 0; i < attributes.length; i++) {
13+
const attr = attributes[i];
14+
const match = attr.name.match(reDataAttr);
15+
if (match) {
16+
const key = match[1];
17+
result[key] = attr.value;
18+
}
19+
}
20+
return result;
21+
}
22+
23+
return Object.keys(node.dataset)
24+
.reduce((result, key) => {
25+
result[key] = node.dataset[key];
26+
return result;
27+
}, {});
28+
};
29+
530
const createElementPortal = (Provider, contextKeys) => {
631

732
invariant(
@@ -63,7 +88,7 @@ const createElementPortal = (Provider, contextKeys) => {
6388
const View = this.props.view;
6489

6590
const children = View ?
66-
<View domNode={node}/> :
91+
<View domNode={node} data={getNodeData(node)}/> :
6792
React.Children.only(this.props.children);
6893

6994
ReactDOM.render(

test/ElementPortal.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,35 @@ test('can render to ElementPortal using selector with custom component', t => {
8585
t.is(elements[1].textContent, 'Hello Mary');
8686
});
8787

88+
test('can pass along data attributes', t => {
89+
const node = document.createElement('div');
90+
document.body.appendChild(node);
91+
const headerId = uniqueId();
92+
const appId = uniqueId();
93+
node.innerHTML = `
94+
<div id="${headerId}" data-name="Joe">
95+
</div>
96+
<div id="${appId}">
97+
</div>
98+
`;
99+
const Greeting = ({data}) => (<div>Hello {data.name}</div>);
100+
render(
101+
<div>
102+
<ElementPortal id={headerId} view={Greeting}/>
103+
</div>,
104+
document.getElementById(appId)
105+
);
106+
t.is(document.getElementById(headerId).textContent, 'Hello Joe');
107+
// Another render should get same data.
108+
render(
109+
<div>
110+
<ElementPortal id={headerId} view={Greeting}/>
111+
</div>,
112+
document.getElementById(appId)
113+
);
114+
t.is(document.getElementById(headerId).textContent, 'Hello Joe');
115+
});
116+
88117
test('erases classes and styles', t => {
89118
const node = document.createElement('div');
90119
document.body.appendChild(node);

0 commit comments

Comments
 (0)