在我的应用程序中,我从文件中获取了一个带有数据的Buffer对象。对于该缓冲区中的每个字节,我想渲染Bar并将该字节作为prop传递。但是,由于Bar根本无法渲染,因此map函数似乎对Buffer对象有问题。当我将数据更改为普通数组时,一切正常。
我在做什么错了?
import React from 'react';
function Bar(props) {
return (
<>
{console.log(props.data)}
</>
)
}
function foo() {
// var data = [0,1,2,3,4,5]
var data = new Buffer([0,1,2,3,4,5])
return(
<div>
{data.map((a) => {
console.log(a) //correct data here
return <Bar data={a} />;
})}
</div>
)
}
```
答案 0 :(得分:1)
Buffer
类是否具有方法map()
? JavaScript数组是Array
类的对象,该类具有Array.prototype.map方法。 Buffer
类可能缺少这种方法。您可以手动遍历Buffer,也可以为Buffer
类实现类似的方法。
答案 1 :(得分:1)
new Buffer
不返回Array
。它返回一个Uint8Array
。即使Uint8Array
的原型中实际上有一个.map
函数,React也不会正确地渲染它。
只需将其转换为Array
。
const data = [...new Buffer([0,1,2,3,4,5])];
或
const data = Array.from(new Buffer([0,1,2,3,4,5]));
注意:在Uint8Array
上映射仍然返回Uint8Array
,这就是为什么没有渲染任何内容的原因。 React渲染不不接受Uint8Array
。
答案 2 :(得分:1)
您的代码无法正常运行的原因是,由于缓冲区(Uint8Array
)上的地图回调方法应该返回另一个Uint8
,但由于您没有返回Uint8
值,假定默认值为0。
我不会详细解释,但是您可以按照以下代码片段来了解Uint8Array
上map函数的内部工作。
const uint8 = new Uint8Array([25, 36, 49]);
const mappedArray = uint8.map(i => 'a');
console.log(mappedArray);
您可以通过预先遍历缓冲区并准备要渲染的react元素数组来解决此问题,如下所示:
function Bar(props) {
return (
<span>
{props.value}
</span>
)
}
function Foo(props) {
const data = new Buffer([0, 1, 2, 3, 4, 5]);
const items = [];
for (const [index, value] of data.entries()) {
items.push(<Bar key={index} value={value} />);
}
return (
<div>
{items}
</div>
);
}