【问题标题】:How to set the background image for a div in React?如何在 React 中为 div 设置背景图像?
【发布时间】:2018-01-23 12:42:00
【问题描述】:

我正在创建一个反应应用程序,并且我有一个或多或少定义如下的组件:

import React, { Component } from 'react';
import axios from 'axios';
import './App.css';

class App extends Component {
  constructor(props) {
    super(props);

    this.state = {
      data: [],
      loading: true,
      error: null
    };
  }

  componentDidMount() {
    var _this = this;
    this.serverRequest = 
      axios
        .get("LinkToAPI")
        .then(result => {
          _this.setState({
            data: result.data,
            loading: false,
            error: null
          });
        })
        .catch(err => {
          _this.setState({
            loading: false,
            error: err
          });
        });
  }

  componentWillUnmount() {
    this.serverRequest.abort();
  }

  renderLoading() {
    return <div>Loading...</div>
  }

  renderError() {
    return (
      <div>
        Something when wrong: {this.state.error.message}
      </div>
    );
  }

  renderData() {
    const { error, data} = this.state;

    if (error) {
      return this.renderError();
    }

    return (
      <div>
        {data.map(d=> {
          if (d.imageUrl) {
            <div className="dataDiv" style="background: url('{d.imageUrl}')" key={d.Id}>{d.name}</div>
          } else {
            <div className="dataDiv" style="background: url('LinkToSomeImage')" key={d.Id}>{d.name}</div>
          }
        }
        )}
      </div>
    )
  }

  render() {
    return (
      <div className="App">
        {this.props.loading ? this.renderLoading() : this.renderData()}
      </div>
    );
  }
}

它基本上从 API 获取 JSON 数据,并使用它呈现一些带有 JSON 内数据的 div。我正在申请包含 dataDiv 类数据的 div,该类在我的 App.css 文件中定义。此外,我想为 div 设置背景图像。我到底想要做的是,如果数据条目包含一个名为imageUrl 的字段,我想将该 url 用作背景图像的 url,否则,如果它为 null 或空,我想使用默认 url我从网上找到的。在 React 中处理这个问题的正确方法是什么?上面的代码段似乎不起作用,尤其是 renderData 函数中的 if-else 语句。我该如何修复这段代码,或者有什么方法可以更优雅地处理这个问题,可能在 CSS 中?

【问题讨论】:

  • 可以设置类名,映射到特定的background-url,或者直接在元素上设置{background-url: 'url'}
  • @DanielLizik 但是,我基本上是从 API 获取 url。我该怎么做?
  • &lt;div style={{backgroundUrl: this.state.url}}&gt;
  • @DanielLizik 好的,谢谢。以及您建议如何处理 return 语句中的 if-else 部分,因为它是给我错误的主要部分。
  • 返回一个没有样式的不同组件

标签: javascript css reactjs


【解决方案1】:

我会这样做 请确保检查 backgroundUrl 是否等于您想要的 CSS。

{data.map(d => {
  let backgroundUrl = "LinkToSomeImage";
  if (d.imageUrl) {
    backgroundUrl = d.imageUrl;
  } 
  
  return (
    <div className="dataDiv" style={{backgroundImage: `url(${backgroundUrl})`}} key={d.Id}>{d.name}</div>
  )
})}

编辑

完整的功能是:

renderData() {
  const { error, data} = this.state;

  if (error) {
    return this.renderError();
  }

  return (
    <div>
      {data.map(d => {
        let backgroundUrl = "LinkToSomeImage";
        if (d.imageUrl) {
          backgroundUrl = d.imageUrl;
        } 

        return (
          <div className="dataDiv" style={{backgroundImage: `url(${backgroundUrl})`}} key={d.Id}>{d.name}</div>
        )
      })}
    </div>
  )
}

【讨论】:

  • 这种破坏了我的代码。我没有收到任何错误,但也没有显示任何内容。你能写出整个函数而不仅仅是剪掉的代码吗?
  • 同样,这就是我的函数的外观:jsfiddle.net/v5eqL44c
  • 对不起,应该是backgroundImage。所以style={{backgroundImage: ...}}
  • 再次相同。你检查我的jsfiddle了吗?问题可能是我们试图在地图内返回吗?
  • 完整功能更新。你在renderData 中没有return
【解决方案2】:
          <Box
            onClick={() => {
              history.push({
                pathname: `/p/c/${data.ProductName.replace(/\//g, "~")}/1`
              });
            }}
            css={{
              backgroundImage:`url(${data.imageUrl||"/default-placeholder.png"})`,
              backgroundPosition: 'center',
              backgroundRepeat: 'no-repeat'
            }}
          >

【讨论】:

  • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。
猜你喜欢
  • 2020-11-17
  • 1970-01-01
  • 2019-08-11
  • 2022-07-11
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多