Skip to content

Commit 1e78de2

Browse files
Enable ref w/ adding more detailed warning about on___
1 parent f99307c commit 1e78de2

File tree

4 files changed

+35
-10
lines changed

4 files changed

+35
-10
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ Application.run({ create })
5252

5353
## Caveats
5454

55+
### Event handling
56+
57+
Use `on:raw-EventName` and `oncapture:RawEvent-Name` to register event handlers instead of `on___`. It may be a little annoying, but NativeScript uses case sensitive event names and don't have native event bubbling, which means delegation couldn't function.
58+
59+
To enable capture and bubble phase of an event, please refer to this [doc](https://github.com/SudoMaker/DOMiNATIVE#tweakabledefineeventoptioneventname-string-option-eventoption)
60+
61+
### Patching `package.json` of `solid-js`
62+
5563
You have to patch the `exports` key in the `package.json` form `node_modules/solid-js`. It is recommended to use [patch-package](https://www.npmjs.com/package/patch-package) for patching.
5664

5765
For example:

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@dominative/solid",
3-
"version": "0.0.1-alpha.3",
3+
"version": "0.0.2-alpha.2",
44
"description": "Custom render and patches for SolidJS to work with DOMiNATIVE",
55
"main": "src/index.js",
66
"type": "module",

src/renderer.js

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import './dom.js'
22
import { createRenderer } from 'solid-js/universal'
33

4+
45
export const {
56
render,
67
effect,
@@ -23,13 +24,29 @@ export const {
2324
replaceText(textNode, value) {
2425
textNode.nodeValue = value
2526
},
26-
setProperty(node, name, value) {
27-
if (name === 'style') {
28-
Object.assign(node.style, value)
29-
} else if (name.startsWith('on:')) node.addEventListener(name.slice(3), value)
30-
else if (name.startsWith('oncapture:')) node.addEventListener(name.slice(10), value, true)
31-
else {
32-
if (process.env.NODE_ENV !== 'production' && name.startsWith('on')) console.warn(`[DOMiSOLID] For event handlers, pleas use 'on:eventName' or 'oncapture:eventName'.`)
27+
// eslint-disable-next-line max-params
28+
setProperty(node, name, value, prev) {
29+
if (name === 'style') return Object.assign(node.style, value)
30+
if (value === prev) return
31+
32+
if (name === 'ref') return value(node)
33+
34+
if (name.startsWith('on:')) {
35+
const eventName = name.slice(3)
36+
if (prev) node.removeEventListener(eventName, prev)
37+
if (value) node.addEventListener(eventName, value)
38+
} else if (name.startsWith('oncapture:')) {
39+
const eventName = name.slice(10)
40+
if (prev) node.removeEventListener(eventName, prev, true)
41+
if (value) node.addEventListener(eventName, value, true)
42+
} else {
43+
if (process.env.NODE_ENV !== 'production' && name.startsWith('on')) {
44+
console.warn(`[DOMiSOLID] Can not register '${name}' as an event handler.
45+
For event handlers, pleas use 'on:raw-eventName' or 'oncapture:rawEvent-name'.
46+
Event delegation isn't supported, also event names are case sensitive on NativeScript.
47+
Refer to https://www.solidjs.com/docs/latest/api#on___oncapture___ for details about 'on:___' and 'oncapture:___'.
48+
Refer to https://github.com/SudoMaker/dominative#tweaking to learn how to enable event bubbling and capturing.`)
49+
}
3350
node.setAttribute(name, value)
3451
}
3552
},

0 commit comments

Comments
 (0)