Skip to content

Commit bfd9f0d

Browse files
Merge pull request #172 from preactjs/bugfix/invoke-diff-hook
2 parents 02ecec3 + 2d84daf commit bfd9f0d

File tree

3 files changed

+48
-3
lines changed

3 files changed

+48
-3
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
"transpile": "microbundle src/index.js -f es,umd --target web --external preact",
2828
"transpile:jsx": "microbundle src/jsx.js -o dist/jsx.js --target web --external none && microbundle dist/jsx.js -o dist/jsx.js -f cjs",
2929
"copy-typescript-definition": "copyfiles -f src/*.d.ts dist",
30-
"test": "eslint src test && tsc && mocha -r babel-core/register test/**/*.js",
30+
"test": "eslint src test && tsc && npm run test:mocha",
31+
"test:mocha": "mocha -r babel-core/register test/**/*.js",
3132
"format": "prettier src/**/*.{d.ts,js} test/**/*.js --write",
3233
"prepublishOnly": "npm run build",
3334
"release": "npm run build && git commit -am $npm_package_version && git tag $npm_package_version && git push && git push --tags && npm publish"

src/index.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,10 @@ function renderToString(vnode, context, opts, inner, isSvgMode, selectValue) {
101101
__h: []
102102
});
103103

104-
// options.render
104+
// options._diff
105+
if (options.__b) options.__b(vnode);
106+
107+
// options._render
105108
if (options.__r) options.__r(vnode);
106109

107110
if (

test/render.js

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { render, shallowRender } from '../src';
2-
import { h, Component, createContext, Fragment } from 'preact';
2+
import { h, Component, createContext, Fragment, options } from 'preact';
33
import { useState, useContext, useEffect, useLayoutEffect } from 'preact/hooks';
44
import chai, { expect } from 'chai';
55
import { spy, stub, match } from 'sinon';
@@ -1049,6 +1049,47 @@ describe('render', () => {
10491049
});
10501050
});
10511051

1052+
it('should invoke options._render and options._diff', () => {
1053+
const calls = [];
1054+
// _diff
1055+
const oldDiff = options.__b;
1056+
options.__b = (...args) => {
1057+
calls.push(['_diff', args]);
1058+
if (oldDiff) oldDiff(...args);
1059+
};
1060+
// _render
1061+
const oldRender = options.__r;
1062+
options.__r = (...args) => {
1063+
calls.push(['_render', args]);
1064+
if (oldRender) oldRender(...args);
1065+
};
1066+
1067+
function Component1({ children }) {
1068+
return children;
1069+
}
1070+
1071+
function Component2() {
1072+
return <div />;
1073+
}
1074+
1075+
const vnode2 = <Component2>1</Component2>;
1076+
const vnode1 = <Component1>{vnode2}</Component1>;
1077+
1078+
render(vnode1);
1079+
1080+
expect(calls).to.deep.equal([
1081+
['_diff', [vnode1]],
1082+
['_render', [vnode1]],
1083+
['_diff', [vnode2]],
1084+
['_render', [vnode2]]
1085+
]);
1086+
1087+
expect(calls.length).to.equal(4);
1088+
1089+
options.__b = oldDiff;
1090+
options.__r = oldRender;
1091+
});
1092+
10521093
it('should render select value on option', () => {
10531094
let res = render(
10541095
<select value="B">

0 commit comments

Comments
 (0)