Big*_*boy 5 javascript callback jsx
考虑这两个函数:
const render = (entity) => {
// function body
}
const render = ({
entity,
isAdmin
}) => {
// function body
}
Run Code Online (Sandbox Code Playgroud)
现在假设我想调用这个函数。如果它接受解构的对象,我应该以不同的方式传递参数。
render({
name: 'John',
age: 40
})
// or
render({
entity: {
name: 'John',
age: 40
},
isAdmin: true
})
Run Code Online (Sandbox Code Playgroud)
有没有办法让我知道函数是否接受解构对象作为其参数?
请注意,render.length这两个函数都返回 1。并且arguments对我没有帮助,因为它可以在函数内部访问,而不是在函数外部访问。
更新。
这是真实的场景。
我们有一个管理面板(类似于 React Admin),许多公司的 500 多个项目都在使用它。您可以想象我们有数千个列表以表格格式显示。
现在,对于每个表,开发人员为我们提供了一个render函数,该函数是用于表的每一行的 React 组件。
这就是他们使用我们<List />组件的方式:
const Customers = () => {
return <List
// other props like title, headers, etc.
row={entity => <>
<td>{entity.name}</td>
</>}
/>
}
Run Code Online (Sandbox Code Playgroud)
我们不想强迫他们跨越数千个列表来编写row={({entity, metadata}) => <><td>{entity.name}</td></>}
我不清楚为什么你需要这样做。函数的参数一旦声明就不会也不能更改,并且在调用函数之前您应该始终知道函数接受哪些参数。
然而,只是为了方便起见,这里有一个可以实现此目的的示例。将函数字符串化,然后使用正则表达式来匹配({ })参数列表中的 。
const render1 = (entity) => {}
const render2 = ({
entity,
isAdmin
}) => {}
const render3 = (arg) => someotherFunc({arg})
function doesDestructure(func){
return /\({.+}\) =>/gm.test(func.toString().replaceAll("\n", ""))
}
console.log(doesDestructure(render1))
console.log(doesDestructure(render2))
console.log(doesDestructure(render3))Run Code Online (Sandbox Code Playgroud)
或者适用于所有功能的版本:
const render1 = (entity) => {}
const render2 = ({
entity,
isAdmin
}) => {}
const render3 = (entity) => subscribe(({entity}) => { })
function doesDestructure(func){
return /\({.+}\)/gm.test(func.toString().replaceAll("\n", "").split("=>")[0])
}
console.log(doesDestructure(render1))
console.log(doesDestructure(render2))
console.log(doesDestructure(render3))Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |