Luk*_*uke 6 html javascript validation reactjs react-jsx
如何确认通过道具(children例如)收到的反应元素在我的渲染方法中是否为给定类型?
说我有一个List元素和一个ListItem元素.在渲染方法中List,我想寻找所有被传递的孩子,并对任何孩子做一些特别的事情ListItem.
我确实找到了一个有效的实现,但只有经过反复试验才能实现.请参阅下面的代码.(React 15.4.2)
List.jsx
import ListItem from 'list-item';
...
React.Children.map(children, child => {
console.log(child); // function ListItem() { ... }
console.log(ListItem); // function ListItem() { ... }
if (isListItem(child)) {
return (...);
}
return child;
})
// this implementation does not work
isListItem(element) {
return (element.type === ListItem);
}
// this implementation does work, but might break if I'm using something like uglify or if I use `react-redux` and `connect()` ListItem (as that will change the display name)
isListItem(element) {
return (element.type.displayName === 'ListItem');
}
// this implementation does work
isListItem(element) {
return (element.type === (<ListItem />).type);
}
Run Code Online (Sandbox Code Playgroud)
ListItem.jsx
class ListItem expends React.component {
...
}
export default ListItem;
Run Code Online (Sandbox Code Playgroud)
所以,最后的实现似乎有效,但为什么第一个实现不起作用?我在反应文档中找不到与此相关的任何材料,尽管我确实发现了一些关于同一事物的堆栈溢出问题.但是,这些问题中提供的答案表明第一个实现应该有效(尽管它们适用于旧版本的React)
虽然这个问题很老了,但我在使用时遇到了这个问题react-hot-loader,并花了一段时间才终于找到这个 GitHub 问题,解释了为什么它会这样。
这是有意的,react-hot-loader@3 补丁
React.createElement(<ImportedComponent />)相当于React.createElement(ImportedComponent)它返回组件的代理包装器元素而不是原始组件,这是允许在不卸载的情况下替换组件上的方法的一部分。
除了您发现的方法之外,RHL 现在还提供了一个areComponentsEqual()函数,并在其 README 中提供了专门的部分。
import { areComponentsEqual } from 'react-hot-loader'
const element = <Component />
areComponentsEqual(element.type, Component) // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
878 次 |
| 最近记录: |