DangerouslySetInnerHTML 与 React.JS 中的本地图像

Posted

技术标签:

【中文标题】DangerouslySetInnerHTML 与 React.JS 中的本地图像【英文标题】:DangerouslySetInnerHTML with a Local Image in React.JS 【发布时间】:2021-11-18 14:36:09 【问题描述】:

在 react.js 中,下面的代码应该根据第 6 行提供给函数的数字显示本地图像一定次数。在实际程序中,该数字将根据从远程获取的信息而改变服务器,所以我不能硬编码它。

第 22 行调用图像的次数正确,但它显示替代文本而不是实际照片。

第 23 行完美地调用了图像。所以,我知道它被正确导入了。

如何让第 22 行显示图像而不仅仅是文本?

import React from 'react'
import local_image from '../images/local_image.png'

export default class Album extends React.Component 

  displayXImages(num)  // line 6
    let x = 0
    let img_html = ''
    while (x < num) 
      img_html = img_html + "<img src=local_image.png alt='local image' className='image' />" // line 10
      x = x + 1
    
    
    return img_html // line 14
  

  render() 
    const inner_html = displayXImages(3) // line 18

    return(
      <main>
        <div className='album' dangerouslySetInnerHTML=inner_html) /> // line 22
        <img src=local_image.png alt='local image' className='image' /> // line 23
      </main>
    )
  

【问题讨论】:

【参考方案1】:

更新 #1:

import React from "react";
import local_image from '../images/local_image.png'

export default class Album extends React.Component 
  displayXImages(num) 
    // line 6
    let x = 0;
    let img_html = "";
    while (x < num) 
      img_html =
        img_html +
        `<img src=$local_image alt='local image' className='image' />`; // EDITED: Template literal string with local_image being casted to its value
      x = x + 1;
    

    return  __html: img_html ; // EDIT: dangeruslySetInnerHTML accepts an object type containing __htmo prop that should hold ur HTML content
  

  render() 
    const inner_html = this.displayXImages(3); // line 18
    
    return (
      <main>
        <div className="album" dangerouslySetInnerHTML=inner_html />
      </main>
    );
  

不同的方法:

我利用 Refs 制作了这个简单的应用程序。它应该转化为您的需求。

import React from 'react'

export default class Album extends React.Component 
  constructor(props) 
    super(props);
    this.imageContainer = React.createRef();
  

  setImageContainerContent() 
    const imgSRC = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/React.svg/250px-React.svg.png";
    if(this.imageContainer.current) 
      const newImgEl = document.createElement("img");
      newImgEl.src = imgSRC;
      newImgEl.alt = "Some image alt text"
      /*
       * would you remove everything else from the tree with every update??
       * if u shall >> this.imageContainer.current.innerHTML = "";
       *
       */
      this.imageContainer.current.appendChild(newImgEl);
    
  

  componentDidMount() 
    this.setImageContainerContent();
  

  render() 
    return(
      <main>
        <div className='album' ref=this.imageContainer />
      </main>
    )
  

【讨论】:

我试过了。此解决方案仅调用图像一次。我需要根据提供给函数的数字多次调用它。但是您通过向我展示 createElement 确实帮助我弄清楚了其他一些事情,非常感谢。 我相信如果你修改displayXImages fn 以实际使用和调用setImageContainerContent 而不是返回字符串化的img 元素,它会起作用。 Wlc 布列塔尼。 @BrittanyFarrell 已更新为原始方法。

以上是关于DangerouslySetInnerHTML 与 React.JS 中的本地图像的主要内容,如果未能解决你的问题,请参考以下文章

React dangerouslySetInnerHTML api 的介绍与使用

javascript dangerouslySetInnerHTML

未捕获的错误:输入是一个空元素标签,既不能有`children`也不能使用`dangerouslySetInnerHTML`

反应使用 dangerouslySetInnerHTML 来呈现带有 html 标签的 json

警告:输入是一个空元素标签,不能有 `children` 或使用 `props.dangerouslySetInnerHTML`。检查 null 的渲染方法

如何将 onclick 事件添加到 reactjs 中由 dangerouslysetInnerHtml 呈现的字符串?