fix(Signature): should render tips correctly (#11794)

This commit is contained in:
neverland 2023-05-01 15:37:32 +08:00 committed by GitHub
parent 8987c5856a
commit 51f7cefd96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 69 additions and 15 deletions

View File

@ -5,7 +5,12 @@ import {
defineComponent, defineComponent,
type ExtractPropTypes, type ExtractPropTypes,
} from 'vue'; } from 'vue';
import { createNamespace, makeNumberProp, makeStringProp } from '../utils'; import {
inBrowser,
makeNumberProp,
makeStringProp,
createNamespace,
} from '../utils';
import { Button } from '../button'; import { Button } from '../button';
const [name, bem, t] = createNamespace('signature'); const [name, bem, t] = createNamespace('signature');
@ -19,6 +24,11 @@ export const signatureProps = {
export type SignatureProps = ExtractPropTypes<typeof signatureProps>; export type SignatureProps = ExtractPropTypes<typeof signatureProps>;
const hasCanvasSupport = () => {
const canvas = document.createElement('canvas');
return !!canvas.getContext?.('2d');
};
export default defineComponent({ export default defineComponent({
name, name,
@ -37,10 +47,7 @@ export default defineComponent({
isSupportTouch: 'ontouchstart' in window, isSupportTouch: 'ontouchstart' in window,
}); });
const hasCanvasSupport = () => { const isRenderCanvas = inBrowser ? hasCanvasSupport() : true;
const canvas = document.createElement('canvas');
return !!(canvas.getContext && canvas.getContext('2d'));
};
const touchMove = (event: TouchEvent) => { const touchMove = (event: TouchEvent) => {
if (!state.ctx) { if (!state.ctx) {
@ -118,7 +125,7 @@ export default defineComponent({
}; };
onMounted(() => { onMounted(() => {
if (hasCanvasSupport()) { if (isRenderCanvas) {
state.ctx = canvasRef.value?.getContext('2d'); state.ctx = canvasRef.value?.getContext('2d');
state.width = wrapRef.value?.offsetWidth || 0; state.width = wrapRef.value?.offsetWidth || 0;
state.height = wrapRef.value?.offsetHeight || 0; state.height = wrapRef.value?.offsetHeight || 0;
@ -128,7 +135,7 @@ export default defineComponent({
return () => ( return () => (
<div class={bem()}> <div class={bem()}>
<div class={bem('content')} ref={wrapRef}> <div class={bem('content')} ref={wrapRef}>
{(hasCanvasSupport() && ( {isRenderCanvas ? (
<canvas <canvas
ref={canvasRef} ref={canvasRef}
width={state.width} width={state.width}
@ -137,10 +144,11 @@ export default defineComponent({
onTouchmovePassive={touchMove} onTouchmovePassive={touchMove}
onTouchend={touchEnd} onTouchend={touchEnd}
/> />
)) || <p>{props.tips}</p>} ) : (
<p>{props.tips}</p>
)}
</div> </div>
<div class={bem('footer')}> <div class={bem('footer')}>
<p>{props.tips}</p>
<Button size="small" onClick={clear}> <Button size="small" onClick={clear}>
{t('cancel')} {t('cancel')}
</Button> </Button>

View File

@ -10,8 +10,6 @@ exports[`should render demo and match snapshot 1`] = `
</canvas> </canvas>
</div> </div>
<div class="van-signature__footer"> <div class="van-signature__footer">
<p>
</p>
<button type="button" <button type="button"
class="van-button van-button--default van-button--small" class="van-button van-button--default van-button--small"
> >
@ -42,8 +40,6 @@ exports[`should render demo and match snapshot 1`] = `
</canvas> </canvas>
</div> </div>
<div class="van-signature__footer"> <div class="van-signature__footer">
<p>
</p>
<button type="button" <button type="button"
class="van-button van-button--default van-button--small" class="van-button van-button--default van-button--small"
> >
@ -74,8 +70,6 @@ exports[`should render demo and match snapshot 1`] = `
</canvas> </canvas>
</div> </div>
<div class="van-signature__footer"> <div class="van-signature__footer">
<p>
</p>
<button type="button" <button type="button"
class="van-button van-button--default van-button--small" class="van-button van-button--default van-button--small"
> >

View File

@ -0,0 +1,31 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`should render tips correctly 1`] = `
<div class="van-signature">
<div class="van-signature__content">
<p>
Canvas is not supported
</p>
</div>
<div class="van-signature__footer">
<button type="button"
class="van-button van-button--default van-button--small"
>
<div class="van-button__content">
<span class="van-button__text">
Cancel
</span>
</div>
</button>
<button type="button"
class="van-button van-button--primary van-button--small"
>
<div class="van-button__content">
<span class="van-button__text">
Confirm
</span>
</div>
</button>
</div>
</div>
`;

View File

@ -56,3 +56,24 @@ test('submit() should output a valid canvas', async () => {
expect(data.canvas).toBeNull(); expect(data.canvas).toBeNull();
expect(data.filePath).toBe(''); expect(data.filePath).toBe('');
}); });
test('should render tips correctly', async () => {
const createElement = document.createElement.bind(document);
const spy = jest.spyOn(document, 'createElement');
spy.mockImplementation((tagName, options) => {
if (tagName === 'canvas') {
return {} as HTMLCanvasElement;
}
return createElement(tagName, options);
});
const wrapper = mount(Signature, {
props: {
tips: 'Canvas is not supported',
},
});
expect(wrapper.html()).toMatchSnapshot();
spy.mockRestore();
});