32 lines
1.0 KiB
TypeScript
32 lines
1.0 KiB
TypeScript
import invariant from 'invariant';
|
|
import {makeObject_Primitives, mutate, sum, useIdentity} from 'shared-runtime';
|
|
|
|
/**
|
|
* Here, `z`'s original memo block is removed due to the inner hook call.
|
|
* However, we also infer that `z` is non-reactive, so by default we would create
|
|
* the memo block for `thing = [y, z]` as only depending on `y`.
|
|
*
|
|
* This could then mean that `thing[1]` and `z` may not refer to the same value,
|
|
* since z recreates every time but `thing` doesn't correspondingly invalidate.
|
|
*
|
|
* The fix is to consider pruned memo block outputs as reactive, since they will
|
|
* recreate on every render. This means `thing` depends on both y and z.
|
|
*/
|
|
function MyApp({count}) {
|
|
const z = makeObject_Primitives();
|
|
const x = useIdentity(2);
|
|
const y = sum(x, count);
|
|
mutate(z);
|
|
const thing = [y, z];
|
|
if (thing[1] !== z) {
|
|
invariant(false, 'oh no!');
|
|
}
|
|
return thing;
|
|
}
|
|
|
|
export const FIXTURE_ENTRYPOINT = {
|
|
fn: MyApp,
|
|
params: [{count: 2}],
|
|
sequentialRenders: [{count: 2}, {count: 2}, {count: 3}],
|
|
};
|