【发布时间】:2019-04-19 09:51:21
【问题描述】:
我应该如何将 jsx 库和元素转换为正常的函数调用?以下两个代码示例之间是否有任何区别(带有 react-router 组件的示例简单应用程序组件只是一个示例,可以是任何东西,也可以是任何元素类型,如 'div'、'p' 或其他 jsx 库):
// normal jsx
const PublicApp = () => (
<Switch>
<Route path="/register" component={Register} />
<Route path="/login" component={Login} />
<Route path="/about" component={About} />
<Redirect to="/login" />
</Switch>
)
// desired api
const PublicApp = () =>
Switch(
{},
Route({ path: '/register', component: Register }),
Route({ path: '/login', component: Login }),
Route({ path: '/about', component: About }),
Redirect({ to: '/login' })
)
// required helpers
import { createElement as h } from 'react'
import * as ReactRouter from 'react-router'
export const Switch = (props, ...children) =>
h(ReactRouter.Switch, props, ...children)
export const Route = (props, ...children) =>
h(ReactRouter.Route, props, ...children)
export const Redirect = (props, ...children) =>
h(ReactRouter.Redirect, props, ...children)
export const Div = (props, ...children) => h('div', props, ...children)
. . . .
两者似乎都可以正常工作。大规模这样做有什么问题吗?此外,必须手动包装每个元素类型似乎有点愚蠢。有没有比使用这样的转换器更好的方法:
const converter = el => (props, ...children) => h(el, props, ...children)
export const Switch = converter(ReactRouter.Switch)
export const Route = converter(ReactRouter.Route)
export const Redirect = converter(ReactRouter.Redirect)
export const Div = converter('div')
【问题讨论】:
-
如果你不想使用 JSX,为什么不直接调用
React.createElement(...)呢?如果你希望每个元素都有一个命名函数,为什么不直接使用 JSX? -
@MTCoster 为什么不把番茄酱倒在你的意大利面上呢?我的意思是,它比那种精美的 marinara 酱更接近你……我不是
仇恨者,有时它会使代码看起来更干净。现在,无论出于何种原因,我只想使用干净的 javascript 并跳过所有花哨的废话。
标签: javascript reactjs