Skip to content

Commit

Permalink
(fix) Handle the stale ref for fwd (#2075)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristianbote committed Oct 31, 2019
1 parent 2c33682 commit a81e96b
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 4 deletions.
6 changes: 3 additions & 3 deletions compat/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -417,9 +417,9 @@ function memo(c, comparer) {
*/
function forwardRef(fn) {
function Forwarded(props) {
let ref = props.ref;
delete props.ref;
return fn(props, ref);
let clone = assign({}, props);
delete clone.ref;
return fn(clone, props.ref);
}
Forwarded.prototype.isReactComponent = true;
Forwarded._forwarded = true;
Expand Down
32 changes: 31 additions & 1 deletion compat/test/browser/forwardRef.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@ import {
hydrate,
memo,
useState,
useRef,
useImperativeHandle
} from '../../src';
import { setupScratch, teardown } from '../../../test/_util/helpers';
import { setupRerender } from 'preact/test-utils';
import { setupRerender, act } from 'preact/test-utils';
/* eslint-disable react/jsx-boolean-value, react/display-name, prefer-arrow-callback */

/** @jsx h */
Expand Down Expand Up @@ -351,4 +352,33 @@ describe('forwardRef', () => {
expect(spy).to.be.calledOnce;
expect(spy).to.be.calledWithExactly({ foo: 100 });
});

it('stale ref missing with passed useRef', () => {
let _ref = null;
let _set = null;
const Inner = forwardRef((props, ref) => {
const [_, setState] = useState(null);
_ref = ref;
_set = setState;
return <div ref={ref} />;
});

const Parent = () => {
const parentRef = useRef(null);
return <Inner ref={parentRef}>child</Inner>;
};

act(() => {
render(<Parent />, scratch);
});

expect(_ref).not.to.be.undefined;

act(() => {
_set(1);
rerender();
});

expect(_ref).not.to.be.undefined;
});
});

0 comments on commit a81e96b

Please sign in to comment.