【问题标题】:Convert Blob to image inside Cell in React在 React 中将 Blob 转换为 Cell 内的图像
【发布时间】:2020-09-23 01:29:19
【问题描述】:

可以像这样访问该值:myObj.value,它是blob:http://localhost:3000/304dbb9b-6465-4dc8-8b2c-5a25fae7e452

单元组件:

export default class Cell extends React.PureComponent {
  render() {
    const { label, value } = this.props;
    return (
      <td>
        {label && (
          <div>
            <span className="cell-label">{label}</span>
            <br />
          </div>
        )}<span>{value}</span>                              
        )}
      </td>
    );
  }
}

如果我像下面的例子那样做,它会显示字符串值,我想显示实际的图像。这可能吗?

<tr>
    {myObj.map(item => (
                <Cell
                  key={myObj.indexOf(item)}
                  label={item.label}
                  value={item.value} //I guess something here must be changed
                />
              ))}
</tr>

【问题讨论】:

    标签: javascript reactjs blob


    【解决方案1】:

    尝试将 blob 转换为 dataUrl:

    URL.createObjectURL(blob)
    

    来源:https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL

    然后你可以将它加载为图像:

    <img src={URL.createObjectURL(dataUrl)} />
    

    或在您的代码中类似:

    <tr>
        {myObj.map(item => (
            <Cell
                key={myObj.indexOf(item)}
                label={item.label}
                value={URL.createObjectURL(item.value)}
            />
        ))}
    </tr>
    

    我希望你能把它翻译成你需要的东西。您可以在呈现&lt;Cell /&gt; 的组件内部或Cell 内部转换blob。将它放在 Cell 中听起来很合适,因此没有其他组件需要关心 blob 到 dataUrl 逻辑的实现细节。

    如果你把它放在Cell里面,那么你需要这样称呼它:

    // URL.createObjectURL(this.props.blob)
    
    
    export default class ImageCell extends React.PureComponent {
      render() {
        const { label, blob } = this.props;
        return (
          <td>
            {label && (
              <div>
                <span className="cell-label">{label}</span>
                <br />
              </div>
            )}
              <span>
                <img src={URL.createObjectURL(blob)}>
              </span>
            )}
          </td>
        );
      }
    }
    

    ...

    <tr>
        {myObj.map(item => (
            <ImageCell
                key={myObj.indexOf(item)}
                label={item.label}
                blob={item.value}
            />
        ))}
    </tr>
    

    【讨论】:

    • 所以我在 Cell 组件中写了 blobToDataUrl 方法,在渲染之前的开头,它说:Expected 'this' to be used by class method 'blobToDataURL' 我不知道该放在哪里
    • 所以它在一个无状态的功能组件中。我将编辑我的答案。
    • 我仔细看了你的问题,主要问题是你的代码没有区分可以进入表格单元格的数据类型。 &lt;span&gt;{value}&lt;/span&gt; 用于文本值。您需要一个图像值,因此您可以创建一个新组件或向您的 Cell 添加逻辑。
    • 这里我会使用 ObjectURL 而不是 fileReader
    • 是的,因为您不必将其编码为 b64,然后再将其解码回二进制。 objecturl 将只是指向磁盘文件的指针并节省更多内存
    猜你喜欢
    • 2020-09-22
    • 2018-06-14
    • 2022-08-12
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 2020-06-16
    相关资源
    最近更新 更多