React 窗口如何迭代你的数据?

Posted

技术标签:

【中文标题】React 窗口如何迭代你的数据?【英文标题】:React window how to iterate your data? 【发布时间】:2021-11-11 09:17:55 【问题描述】:
import  FixedSizeList as List  from 'react-window'
import AutoSizer from 'react-virtualized-auto-sizer'
const TrackTable = ( tracks ) => 
    const Row = ( index, style ) => (
        <div
            className=index % 2 ? 'ListItemOdd' : 'ListItemEven'
            style=style>
            Row index
        </div>
    )
    const AllRows = () => 
        const arr = [
             code: '12H', id: '1' ,
             code: '4gf', id: '2' ,
        ]
        return arr.map((i, index) => 
            return <div key=index>i.code</div>
        )
    
    return (
        <AutoSizer>
            ( height, width ) => (
                <List
                    className="List"
                    height=height
                    itemCount=tracks.length
                    itemSize=35
                    width=width>
                    AllRows()
                </List>
            )
        </AutoSizer>
    )

如果我将Row 放在&lt;List /&gt; 中,就像作者的示例一样,它可以工作,

但是如果我将我的数据 AllRows 放入 &lt;List /&gt;,我会收到错误 Error: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object.。我检查了我的数据是好的。那么我在这里做错了什么?

这里是沙盒: https://codesandbox.io/s/bvaughn-react-window-fixed-size-list-vertical-forked-jqmyx?file=/index.js

【问题讨论】:

你是如何实现 List 组件的? 是的。更新了代码 不完全是我的意思。列表组件中的某处可能有一行调用 props.children。您传递给 props.children 的参数将传递给 和 之间的函数 如果 List 或 FixedSizeList 不包含对 props.children 的调用,那么我对 facc 的看法是错误的,请参阅 Nokwiw 的回答。 在 AllRows 之后删除括号而不更改任何其他内容是否使其工作? 【参考方案1】:

你调用AllRows没有属性,在这种情况下tracksundefined ==>你会得到错误tracks.map is not a function

为避免这种情况,请使用数组调用 AllRows

        <List
            className="List"
            height=height
            itemCount=tracks.length
            itemSize=35
            width=width>
            AllRows(yourArray)
        </List>

编辑:

AllRows 定义如下,返回一个数组,在tracks.map 之前删除return

const AllRows = () => 
        if (tracks.length == 0) return ''
        return tracks.map((i, index) => 
            return <div key=i.index>i.code</div>
        )
    

改用它:

const AllRows = () => 
        if (tracks.length == 0) return <></>
        tracks.map((i, index) => 
            return <div key=i.index>i.code</div>
        )
    

或者:

const AllRows = () => 
   if (tracks.length == 0) return <></>
   return (
   
    tracks.map((i, index) => 
            return <div key=i.index>i.code</div>
        )
   
          ) 
    

【讨论】:

我更新问题和代码 您是否使用有效数组调用了AllRows 是的,我确实用有效的 arr 打电话 我只是简化了我的arr,里面有两个项目 我编辑了我的帖子【参考方案2】:

以上答案的补充,你也可以使用这个:

const AllRows = () => 
    (tracks || []).map((i, index) => 
        return <div key=i.index>i.code</div>
    )

【讨论】:

【参考方案3】:

这是工作示例。请检查

const arr = [
   code: "12H", id: "1" ,
   code: "4gf", id: "2" 
];
const AllRows = () => arr.map((i, index) => <div key=index>i.code</div>);

const Example = () => (
  <AutoSizer>
    ( height, width ) => (
      <List
        className="List"
        height=height
        itemCount=1000
        itemSize=35
        width=width
      >
        AllRows
      </List>
    )
  </AutoSizer>
);

【讨论】:

【参考方案4】:

您提到的第一个错误是tracks.map 未定义。这表明 List 组件调用它的子组件。从文档中,第一个参数具有索引和样式变量。所以你可以使用:

// arr is defined up here
const AllRows = ( index, style ) => 
  return <div key=index>arr[index].code</div>;
;

或者作为使用闭包的更通用的方法:

const AllRows2 = (arr2) => 
  return ( index, style ) => 
    return <div key=index>arr2[index].code</div>;
  ;
;

然后在列表组件中使用 AllRows2(arr)。这可能不需要。 Here 是一个工作示例。

【讨论】:

以上是关于React 窗口如何迭代你的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 即时窗口中获取迭代器的元素值? *迭代器不起作用[关闭]

React组件单元测试

如何在 React Native 中使用数组对象迭代数组

Map 在 React 中的第一次迭代后停止迭代

如何迭代你的操作系统?

在 React 中迭代数据数组时呈现 JSX 元素的最有效方法