Skip to content

Commit

Permalink
fix: portal with new context (#1866)
Browse files Browse the repository at this point in the history
  • Loading branch information
yongningfu authored May 14, 2020
1 parent 8646d78 commit 91bcb16
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
33 changes: 32 additions & 1 deletion packages/rax-create-portal/src/__tests__/createPortal.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* @jsx createElement */

import PropTypes from 'rax-proptypes';
import { Component, createElement, render, shared } from 'rax';
import { Component, createElement, render, shared, createContext, useContext, useState } from 'rax';
import ServerDriver from 'driver-server';
import unmountComponentAtNode from 'rax-unmount-component-at-node';
import createPortal from '../';
Expand Down Expand Up @@ -206,4 +206,35 @@ describe('createPortal', () => {
expect(portalContainer.childNodes[0].childNodes[0].data).toBe('initial');
expect(updatedCount).toBe(4);
});

it('should render correct when new context change', () => {
const container = createNodeElement('div');
const portalTarget = createNodeElement('div');
const Context = createContext(0);

let changeValue = null;
function Portal() {
const value = useContext(Context);
return <div>{value}</div>;
}

function App() {
const [value, setValue] = useState(1);
changeValue = setValue;
return (
<Context.Provider value={value}>
<div>0</div>
{createPortal(<Portal />, portalTarget)}
</Context.Provider>
);
}
render(<App />, container);
jest.runAllTimers();
expect(container.childNodes[0].childNodes[0].data).toBe('0');
expect(portalTarget.childNodes[0].childNodes[0].data).toBe('1');

changeValue(2);
jest.runAllTimers();
expect(portalTarget.childNodes[0].childNodes[0].data).toBe('2');
});
});
2 changes: 1 addition & 1 deletion packages/rax/src/vdom/instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ export default {
// Init root component with empty children
let renderedComponent = instantiateComponent(createElement(Root));
let defaultContext = parentContext || {};
let rootInstance = renderedComponent.__mountComponent(container, null, defaultContext);
let rootInstance = renderedComponent.__mountComponent(container, parent, defaultContext);
this.set(container, rootInstance);
// Mount new element through update queue avoid when there is in rendering phase
rootInstance.__update(element);
Expand Down

0 comments on commit 91bcb16

Please sign in to comment.