Match-id-a642a9a90565e0bc7897482ce61d1ac65f8120c5

This commit is contained in:
* 2022-03-23 10:28:58 +08:00 committed by *
parent e0ac32cda9
commit 3de86a411c
2 changed files with 40 additions and 10 deletions

View File

@ -51,7 +51,7 @@ export function recoverParentContext(vNode: VNode) {
while (parent !== null) {
if (parent.tag === ContextProvider) {
parent.context = parent.props.value;
setContext(parent, parent.props.value);
}
parent = parent.parent;
}

View File

@ -2,7 +2,7 @@ import * as Horizon from '@cloudsop/horizon/index.ts';
import { act } from '../../jest/customMatcher';
describe('useContext Hook Test', () => {
const { useState, useContext } = Horizon;
const { useState, useContext, createContext } = Horizon;
const { unmountComponentAtNode } = Horizon;
it('简单使用useContext', () => {
@ -14,16 +14,12 @@ describe('useContext Hook Test', () => {
const SystemLanguageContext = Horizon.createContext(defaultValue);
const SystemLanguageProvider = ({ type, children }) => {
return (
<SystemLanguageContext.Provider value={{ type }}>
{children}
</SystemLanguageContext.Provider>
);
return <SystemLanguageContext.Provider value={{ type }}>{children}</SystemLanguageContext.Provider>;
};
const TestFunction = () => {
const context = useContext(SystemLanguageContext);
return <p id="p">{context.type}</p>;
}
};
let setValue;
const App = () => {
const [value, _setValue] = useState(LanguageTypes.JAVA);
@ -34,8 +30,8 @@ describe('useContext Hook Test', () => {
<TestFunction />
</SystemLanguageProvider>
</div>
)
}
);
};
Horizon.render(<TestFunction />, container);
// 测试当Provider未提供时获取到的默认值'JavaScript'。
expect(container.querySelector('p').innerHTML).toBe('JavaScript');
@ -47,4 +43,38 @@ describe('useContext Hook Test', () => {
act(() => setValue(LanguageTypes.JAVASCRIPT));
expect(container.querySelector('p').innerHTML).toBe('JavaScript');
});
it('更新后useContext仍能获取到context', () => {
const Context = createContext({});
const ref = Horizon.createRef();
function App() {
return (
<Context.Provider
value={{
text: 'context',
}}
>
<Child />
</Context.Provider>
);
}
let update;
function Child() {
const context = useContext(Context);
const [_, setState] = useState({});
update = () => setState({});
return <div ref={ref}>{context.text}</div>;
}
Horizon.render(<App />, container);
expect(ref.current.innerHTML).toBe('context');
update();
expect(ref.current.innerHTML).toBe('context');
});
});