Skip to content

Commit 8fa581c

Browse files
RSS1102uyarn
andcommitted
fix(QrCode): fix SVG QRCode not reactive to value prop changes (#3681)
* fix(QrCode): fix SVG QRCode not reactive to value prop changes * chore: remove useless attr * chore: add canvas devDep * chore: optimize --------- Co-authored-by: Uyarn <uyarnchen@gmail.com>
1 parent 0723b84 commit 8fa581c

File tree

4 files changed

+46
-26
lines changed

4 files changed

+46
-26
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@
141141
"babel-polyfill": "^6.26.0",
142142
"c8": "^7.12.0",
143143
"camelcase": "~6.3.0",
144+
"canvas": "~3.1.2",
144145
"cli-color": "^2.0.0",
145146
"commitizen": "^4.0.3",
146147
"cross-env": "^7.0.2",
@@ -159,7 +160,7 @@
159160
"gray-matter": "^4.0.3",
160161
"husky": "^7.0.4",
161162
"hyphenate": "^0.2.4",
162-
"jsdom": "^25.0.0",
163+
"jsdom": "^26.0.0",
163164
"less": "^4.1.2",
164165
"lint-staged": "^12.3.7",
165166
"mockdate": "^3.0.2",

src/qrcode/__tests__/index.test.jsx

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -64,18 +64,6 @@ describe('QRCode', () => {
6464

6565
// it(':iconSize[number|object]-svg', async () => {});
6666

67-
// const level = ['L', 'M', 'Q', 'H'];
68-
// level.forEach((item) => {
69-
// it(`:level[string]-[${item}]`, async () => {
70-
// const wrapper = mount({
71-
// render() {
72-
// return <QRCode level={item} value="https://tdesign.tencent.com/"></QRCode>;
73-
// },
74-
// });
75-
// expect(wrapper.find('.t-qrcode').attributes('level')).eq(item);
76-
// });
77-
// });
78-
7967
it(':size[number]', async () => {
8068
const size = 380;
8169
const wrapper = mount({
@@ -111,5 +99,34 @@ describe('QRCode', () => {
11199
await wrapper.setProps({ status: 'expired', statusRender });
112100
expect(statusRender).toBeCalled();
113101
});
102+
103+
it(':value[string] changes - canvas mode', async () => {
104+
const wrapper = mount({
105+
render() {
106+
return <QRCode type="canvas" value="https://tdesign.tencent.com/"></QRCode>;
107+
},
108+
});
109+
110+
expect(wrapper.find('.t-qrcode').find('canvas').exists()).eq(true);
111+
await wrapper.setProps({ value: 'https://github.com/Tencent/tdesign-vue-next' });
112+
expect(wrapper.find('.t-qrcode').find('canvas').exists()).eq(true);
113+
});
114+
115+
it(':value[string] changes - svg mode', async () => {
116+
const wrapper = mount({
117+
render() {
118+
return <QRCode type="svg" value="https://tdesign.tencent.com/"></QRCode>;
119+
},
120+
});
121+
122+
expect(wrapper.find('.t-qrcode').find('svg').exists()).eq(true);
123+
const initialPaths = wrapper.find('.t-qrcode').findAll('path');
124+
expect(initialPaths.length).eq(2); // 背景path + 前景path
125+
126+
await wrapper.setProps({ value: 'https://github.com/Tencent/tdesign-vue-next' });
127+
const updatedPaths = wrapper.find('.t-qrcode').findAll('path');
128+
expect(updatedPaths.length).eq(2);
129+
expect(wrapper.find('.t-qrcode').find('svg').exists()).eq(true);
130+
});
114131
});
115132
});

src/qrcode/components/qrcode-svg.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,27 @@ export default defineComponent({
99
name: 'QRCodeSVG',
1010
props: QRCodeSubComponentProps,
1111
setup(props) {
12-
const {
13-
margin, cells, numCells, calculatedImageSettings,
14-
} = useQRCode({
12+
const qrCodeData = computed(() => useQRCode({
1513
value: props.value,
1614
level: props.level,
1715
minVersion: DEFAULT_MINVERSION,
1816
includeMargin: DEFAULT_NEED_MARGIN,
1917
marginSize: props.marginSize,
2018
imageSettings: props.imageSettings,
2119
size: props.size,
22-
});
20+
}));
2321

2422
const cellsToDraw = computed(() => {
23+
const { cells, calculatedImageSettings } = qrCodeData.value;
2524
if (props.imageSettings && calculatedImageSettings.value?.excavation != null) {
2625
return excavateModules(cells.value, calculatedImageSettings.value.excavation);
2726
}
2827
return cells.value;
2928
});
3029

30+
const calculatedImageSettings = computed(() => qrCodeData.value.calculatedImageSettings.value);
31+
const margin = computed(() => qrCodeData.value.margin.value);
32+
const numCells = computed(() => qrCodeData.value.numCells.value);
3133
return {
3234
cellsToDraw,
3335
calculatedImageSettings,

0 commit comments

Comments
 (0)