-
Notifications
You must be signed in to change notification settings - Fork 97
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
写vOn:click={this.method}直接提示语法错误 #77
Comments
我也遇到同样的问题,项目中需要在typescript中使用jsx,但是目前这个状态绑定不了事件,进行不下去了。 |
只能用spread语法来写了,满脸黑线。 |
Try this: <div onClick={() => {}} /> |
@chenjiahan 这样写的话,事件修饰符怎么加? |
修饰符没法加哈,不过 prevent/stop 这种都是一行代码能搞定的 |
@chenjiahan |
既然是jsx语法 就应该在语法上随从人家,vOn:click的写法太丑了,还有class也不能写成className |
+1 |
关键是两种都用不了,得用最麻烦的spread语法(手动捂脸) |
@xinayu 在typescript环境里无法使用vOn:click |
@TimYi 使用 on={{click: func}} |
// jsx-utils.ts
import { L } from 'ts-toolbelt';
export const keys = <{ <T>(o: NonNullable<T>): Array<keyof T> }>Object.keys;
type Decorators = { stop: boolean, prevent: boolean, self: boolean };
const defaultDecorators: Decorators = {
stop: false,
prevent: false,
self: false,
};
type Handler = (this: any, event: Event, ...args: any[]) => any;
type HandlerWrapper<F extends Handler> = {
(handler?: F): (this: ThisType<F>, event: Parameters<F>[0], ...args: L.Tail<Parameters<F>>)
=> ReturnType<F>
} & { [k in keyof Decorators]: HandlerWrapper<F> } & {
handler: (event: Parameters<F>[0]) => void
};
const generateWrapper = <F extends Handler>(params: Partial<Decorators>) => {
const { stop, prevent, self } = params;
const wrapper = ((fn?: F) => {
return function handler(event, ...args) {
if (prevent) {
event.preventDefault();
}
if (stop) {
event.stopPropagation();
}
if (fn && (!self || event.target === event.currentTarget)) {
return fn.call(this, event, ...args);
}
return undefined;
};
}) as HandlerWrapper<F>;
keys(defaultDecorators).forEach((k) => {
if (!(k in params)) {
wrapper[k] = generateWrapper({ ...params, [k]: true });
}
});
wrapper.handler = (event) => {
if (prevent) {
event.preventDefault();
}
if (stop) {
event.stopPropagation();
}
};
return wrapper;
};
export const stop = generateWrapper({ stop: true });
export const prevent = generateWrapper({ prevent: true });
export const self = generateWrapper({ self: true }); import { stop, prevent, self } from './jsx-utils'
export default {
// 使用 prevent,self,stop,三个方法
// 或者直接返回 prevent.handler, stop.handler
// 也可以 prevent.stop 这样链式使用
render() {
return <div
onClick={prevent.handler}
onMousedown={prevent.stop.self(() => { console.log('HelloWorld')})} />
}
} |
on-click={ this.fun } |
尽然 tsx 维护起来这么难 |
TS 4.2 已经支持此语法。请自行升级项目中的 TypeScript 版本。 |
还有一个edge case没有考虑到,例如 emit('update:someValue'), |
@galenjiang 最新版 TS 已经支持冒号了 |
是两个冒号不是一个冒号 |
两个冒号没有必要把? 直接 |
没效果,不触发事件。 |
The text was updated successfully, but these errors were encountered: