Dans cet exemple, le react-hyperscript
est curry et expose un ensemble de fonctions par défaut, donc h('div', props, children)
devient div(props, children)
.
import hyperscript from 'react-hyperscript'; import {curry} from 'lodash'; const isString = v => typeof v === 'string' && v.length > 0; const isSelector = v => isString(v) && (v[0] === '.' || v[0] === '#'); const h = curry( (tagName, first, ...rest) => isString(tagName) && isSelector(first) ? hyperscript(tagName + first, ...rest) : hyperscript(tagName, first, ...rest) ); const TAG_NAMES = [ 'a', 'abbr', 'address', 'area', 'article', 'aside', 'audio', 'b', 'base', // ... ]; TAG_NAMES.forEach(tagName => Object.defineProperty(h, tagName, { value: h(tagName), writable: false, }) ); export default h;
Dans un autre module:
import h, {div} from 'lib/h'; console.log( h, // h div, // undefined <- problem! h('div'), // div h.div // div )
Cela peut être résolu en ajoutant ceci à l'exemple (zip from lodash):
const { a, abbr, address, area, // ... } = zip( TAG_NAMES, TAG_NAMES.map(h) ) export { a, abbr, address, area, // ... }
Mais cette solution n'est pas très élégante, est-ce que quelqu'un connaît une meilleure alternative?
Comment nommer les exportations dynamiquement
Vous ne pouvez pas. import
déclarations d' import
et d' export
sont spécifiquement conçues de cette façon car elles doivent être analytiquement statiques, c'est-à-dire que les noms d'importation et d'exportation doivent être connus avant l'exécution du code.
Si vous avez besoin de quelque chose de dynamique, faites ce que vous faites déjà: Exportez une "carte" (ou objet). Les gens peuvent encore utiliser la déstructuration pour obtenir ce qu'ils veulent:
const {div} = h;