- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 React Native 中渲染一个 ListView
,设法修复了这个 React 警告,但我不明白它是如何工作的以及为什么工作:
Warning: Any use of a keyed object should be wrapped in React.addons.createFragment(object) before being passed as a child.
// This array generates React Fragment warning.
var data1 = [{name: "bob"}, {name:"john"}]
// This array works, no warnings.
var data2 = [React.addons.createFragment({name: "bob"}),
React.addons.createFragment({name: "john"})]
// This also works, no warnings.
var data3 = ["bob", "john"]
class Listings extends React.Component {
constructor(props) {
super(props)
ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2})
this.state = {
dataSource: ds.cloneWithRows(data),
}
}
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={(rowData) => <Text>{rowData}</Text>} />
)
}
}
什么是 React 片段? React 中什么时候需要它?为什么带键的对象会导致此警告?
最佳答案
我将我的答案分为两部分,以涵盖我在您的问题中看到的两个要点。
为了解释什么是 React Fragment,我们需要退一步讨论 React Keys。
键帮助 React 识别哪些项目已更改、添加或删除。应将它们赋予数组内的元素,以便为元素提供稳定的标识(唯一性)。
选择键的最佳方法是使用一个字符串来唯一标识其同级列表项。大多数情况下,您会使用数据中的 ID 作为键。这是一个实际示例:
render() {
const todoItems = todos.map((todo) =>
<li key={todo.id}>
{todo.text}
</li>
);
return todoItems;
}
值得注意的是 todoItems
实际上是一个 <li>
的数组元素。
了解了这一点,让我们继续讨论为什么您会在用例中收到警告。
在大多数情况下,您可以使用 key
prop 来指定从渲染返回的元素上的键,就像上面的示例一样。但是,这在一种情况下会失败:如果您有两组需要重新排序的子项,则无法在不添加包装元素的情况下在每组上放置一个键。
这是 recently updated React docs 中的经典示例:
function Swapper(props) {
let children;
if (props.swapped) {
children = [props.rightChildren, props.leftChildren];
} else {
children = [props.leftChildren, props.rightChildren];
}
return <div>{children}</div>;
}
当您更改swapped
时, children 将卸载并重新安装prop 因为两组子项上没有标记任何键。
要解决此问题,您可以使用 createFragment 附加组件为子集提供键。 Follow the enhanced example, using the createFragment
here .
无论如何,您遇到的错误发生只是因为您尝试将 JavaScript 对象(而不是 JSX 元素或字符串)插入到某些 JSX 中。
尽管错误消息建议使用 createFragment
要解决这个问题,原因是因为您将变量插入到某些 JSX 中,该变量不是字符串或 JSX 元素,而是实际上是其他类型的对象!
您的用例中有这样一个误导性的警告,不是吗? :-)
关于reactjs - 何时使用 React createFragment?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002761/
我正在 React Native 中渲染一个 ListView,设法修复了这个 React 警告,但我不明白它是如何工作的以及为什么工作: Warning: Any use of a keyed ob
我正在阅读 https://facebook.github.io/react/docs/create-fragment.html文章并发现 FB 工程师依赖于对象内存布局(属性的顺序): if (th
我正在使用 ViewPager2 和 FragmentStateAdapter。 public class MyAdapter extends FragmentStateAdapter { p
当使用viewPager2.setCurrentItem(viewPager2.getCurrentItem()+1,true);为了通过按钮更改当前项目,FragmentStateAdapter 类
let playerInfo = [{ name: 'jose', country: 'USA', age: 47 }]; export default class Playe
我刚刚看到 flutter 路线图提到了将 flutter 添加到 existing project 的预览。 . 我仍然不确定在使用FlutterView 或Flutter.createFragme
React 总是通过非常简单的 dom 层次结构触发警告: "Warning: Any use of a keyed object should be wrapped in React.addons.
我收到以下警告: Any use of a keyed object should be wrapped in React.addons.createFragment(object) before b
我是一名优秀的程序员,十分优秀!