From 73e8ec7fc750b6e89d827d9a3e03d1ef6e0bcb55 Mon Sep 17 00:00:00 2001 From: cntchen <cntchen@tencent.com> Date: Tue, 21 Jan 2020 21:03:41 +0800 Subject: [PATCH 1/3] fix: add support for jsx camel case event binding --- packages/babel-plugin-transform-vue-jsx/src/index.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-vue-jsx/src/index.js b/packages/babel-plugin-transform-vue-jsx/src/index.js index e36143a..40688fb 100644 --- a/packages/babel-plugin-transform-vue-jsx/src/index.js +++ b/packages/babel-plugin-transform-vue-jsx/src/index.js @@ -166,7 +166,15 @@ const parseAttributeJSXAttribute = (t, path, attributes, tagName, elementType) = prefix = prefixes.find(el => name.startsWith(el)) || 'attrs' name = name.replace(new RegExp(`^${prefix}\-?`), '') - name = name[0].toLowerCase() + name.substr(1) + + // in jsx, event binding use Camel case, such as `onClick`, `onMouseDown`; + // in HTML Specification, event binding is all lower case, such as `onclick`, `onmousedown` + // so for `on` and `nativeOn` attribute in jsx, transform `name` to all lower case + if (prefix === 'on' || prefix === 'nativeOn') { + name = name.toLowerCase() + } else { + name = name[0].toLowerCase() + name.substr(1) + } const valuePath = path.get('value') let value From 7ff8f5059db3bf8ff92eb70d2ede348998474cdd Mon Sep 17 00:00:00 2001 From: cntchen <cntchen@tencent.com> Date: Wed, 22 Jan 2020 11:35:13 +0800 Subject: [PATCH 2/3] fix: custom component attrs prefix on treat as event --- packages/babel-plugin-transform-vue-jsx/src/index.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/babel-plugin-transform-vue-jsx/src/index.js b/packages/babel-plugin-transform-vue-jsx/src/index.js index 40688fb..a04ba0c 100644 --- a/packages/babel-plugin-transform-vue-jsx/src/index.js +++ b/packages/babel-plugin-transform-vue-jsx/src/index.js @@ -165,6 +165,13 @@ const parseAttributeJSXAttribute = (t, path, attributes, tagName, elementType) = ;[name, argument] = name.split(':') prefix = prefixes.find(el => name.startsWith(el)) || 'attrs' + + // For custom components(which tag name is not html tag), event binding need to use `nativeOn` but not `on` + // `on` prefix should transfrom to `attrs` + if (!htmlTags.includes(tagName) && prefix === 'on') { + prefix = 'attrs' + } + name = name.replace(new RegExp(`^${prefix}\-?`), '') // in jsx, event binding use Camel case, such as `onClick`, `onMouseDown`; From d1c8bfe3e680450d2ccad2cea821a32fc8dfd161 Mon Sep 17 00:00:00 2001 From: cntchen <cntchen@tencent.com> Date: Wed, 22 Jan 2020 13:32:38 +0800 Subject: [PATCH 3/3] docs: update comment --- packages/babel-plugin-transform-vue-jsx/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-vue-jsx/src/index.js b/packages/babel-plugin-transform-vue-jsx/src/index.js index a04ba0c..686d6e8 100644 --- a/packages/babel-plugin-transform-vue-jsx/src/index.js +++ b/packages/babel-plugin-transform-vue-jsx/src/index.js @@ -167,7 +167,7 @@ const parseAttributeJSXAttribute = (t, path, attributes, tagName, elementType) = prefix = prefixes.find(el => name.startsWith(el)) || 'attrs' // For custom components(which tag name is not html tag), event binding need to use `nativeOn` but not `on` - // `on` prefix should transfrom to `attrs` + // `on` prefix should transform to `attrs` if (!htmlTags.includes(tagName) && prefix === 'on') { prefix = 'attrs' }