Skip to content

Commit 6e46a51

Browse files
blittlestaylor
authored andcommitted
fix: don't emit changes when the helmetData wrapper object changes
This makes the context free enviornment behave like a context environment, for example, the outer context could be destroyed and recreated, and emiting changes isn't effected. The helmetData should behave the same.
1 parent 906b53d commit 6e46a51

File tree

4 files changed

+13
-7
lines changed

4 files changed

+13
-7
lines changed

__tests__/server/helmetData.test.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,14 +76,13 @@ describe('Helmet Data', () => {
7676

7777
it('works with the same context object but separate HelmetData instances', () => {
7878
const context = {};
79-
const instances = [];
8079

8180
render(
8281
<div>
83-
<Helmet helmetData={new HelmetData(context, instances)}>
82+
<Helmet helmetData={new HelmetData(context)}>
8483
<base href="http://mysite.com" />
8584
</Helmet>
86-
<Helmet helmetData={new HelmetData(context, instances)}>
85+
<Helmet helmetData={new HelmetData(context)}>
8786
<base href="http://mysite.com/public" />
8887
</Helmet>
8988
</div>

index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ declare module 'react-helmet-async' {
8181
}
8282

8383
export class HelmetData {
84-
constructor(context: any, instances?: Array<any>)
84+
constructor(context: any)
8585
}
8686

8787
export class HelmetProvider extends React.Component<ProviderProps> {

src/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import invariant from 'invariant';
55
import { Context } from './Provider';
66
import HelmetData from './HelmetData';
77
import Dispatcher from './Dispatcher';
8+
import { without } from './utils';
89
import { TAG_NAMES, VALID_TAG_NAMES, HTML_TAG_MAP } from './constants';
910

1011
export { default as HelmetData } from './HelmetData';
1112
export { default as HelmetProvider } from './Provider';
1213

1314
/* eslint-disable class-methods-use-this */
14-
1515
export class Helmet extends Component {
1616
/**
1717
* @param {Object} base: {"target": "_blank", "href": "http://mysite.com/"}
@@ -63,7 +63,7 @@ export class Helmet extends Component {
6363
static displayName = 'Helmet';
6464

6565
shouldComponentUpdate(nextProps) {
66-
return !fastCompare(this.props, nextProps);
66+
return !fastCompare(without(this.props, 'helmetData'), without(nextProps, 'helmetData'));
6767
}
6868

6969
mapNestedChildrenToProps(child, nestedChildren) {
@@ -235,7 +235,7 @@ export class Helmet extends Component {
235235

236236
return helmetData ? (
237237
// eslint-disable-next-line react/jsx-props-no-spreading
238-
<Dispatcher {...newProps} context={helmetData.value} />
238+
<Dispatcher {...newProps} context={helmetData.value} helmetData={undefined} />
239239
) : (
240240
<Context.Consumer>
241241
{(

src/utils.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,3 +250,10 @@ export const prioritizer = (elementsList, propsToMatch) => {
250250
}
251251
return { default: elementsList };
252252
};
253+
254+
export const without = (obj, key) => {
255+
return {
256+
...obj,
257+
[key]: undefined,
258+
};
259+
};

0 commit comments

Comments
 (0)