当前位置: 首页 > 面试题库 >

react.js替换img src onerror

叶冥夜
2023-03-14
问题内容

我有一个react组件,它是列表中的详细信息视图。

我试图用默认图像替换该图像,如果该图像不存在并且出现404错误。

我通常会在img标签中使用onerror方法,但这似乎不起作用。

我不确定如何做出反应。

这是我的组件:

import React from 'react';
import {Link} from 'react-router';
import ContactStore from '../stores/ContactStore'
import ContactActions from '../actions/ContactActions';

class Contact extends React.Component {
  constructor(props) {
    super(props);
    this.state = ContactStore.getState();
    this.onChange = this.onChange.bind(this); 
 }

componentDidMount() {
  ContactStore.listen(this.onChange);
  ContactActions.getContact(this.props.params.id);
}

componentWillUnmount() {
  ContactStore.unlisten(this.onChange);
}

componentDidUpdate(prevProps) {
  if (prevProps.params.id !== this.props.params.id) {
    ContactActions.getContact(this.props.params.id);
  }
}

onChange(state) {
  this.setState(state);
}

render() {
  return (
    <div className='container'>
      <div className='list-group'>
        <div className='list-group-item animated fadeIn'>
          <h4>{this.state.contact.displayname}</h4>
          <img src={this.state.imageUrl} />
        </div>
      </div>
    </div>
  );
}
}

export default Contact;

问题答案:

由于没有完美的答案,因此我正在发布我使用的代码段。我正在使用Image回退到的可重用组件fallbackSrc

由于后备图片可能再次失败并触发无限次重新渲染循环,因此我添加了errored状态。

import React, { Component } from 'react';

import PropTypes from 'prop-types';



class Image extends Component {

  constructor(props) {

    super(props);



    this.state = {

      src: props.src,

      errored: false,

    };

  }



  onError = () => {

    if (!this.state.errored) {

      this.setState({

        src: this.props.fallbackSrc,

        errored: true,

      });

    }

  }



  render() {

    const { src } = this.state;

    const {

      src: _1,

      fallbackSrc: _2,

      ...props

    } = this.props;



    return (

      <img

        src={src}

        onError={this.onError}

        {...props}

      />

    );

  }

}



Image.propTypes = {

  src: PropTypes.string,

  fallbackSrc: PropTypes.string,

};


 类似资料:
  • Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。 replace 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。 在你用一个不同的提交替换历史中的一个提交时,这会非常有用。 例如,你有一个大型的代码历史并想把自己的仓库分成一个短的历史和一个更大更长久的历史,短历史供新的开发者使用,后者给喜欢数据

  • 我正在使用一些非常古老的。 我试图通过删除非字母字符(标点符号和数字等)来净化一些输入 通常我会做这样的事情: 然而,是在中引入的!所以它不会编译!http://docs.oracle.com/javase/7/docs/api/java/lang/string.html#ReplaceAll(java.lang.string,java.lang.string) 在之前,我们是如何做到这一点的?

  • Parameter Position参数位置 Type参数类型 Required必需 Default默认 Description 1 string Yes n/a This is the string of text to be replaced. 将被替换的文本字串 2 string Yes n/a This is the string of text to replace with. 用来替换

  • 热替换 在运行时替换代码, 主要是两类的: ClojureScript 编译工具自动替换代码 从 REPL 当中刷新代码重新引入命名空间 shadow-cljs 在 shadow-cljs.edn 当中配置了 :devtools 就会自动激活热替换. REPL 跟 Clojure REPL 类似, ClojureScript 有命令行工具可以替换命名空间, 主要是 Planck 和 Lumo, 比

  • replace 将新的数据替换旧的数据replace($table, $column, $search, $replace, $where) table [string] 表名. columns [string/array] The target columns of data will be replaced. search [string] The value being searched f

  • replace 将新的数据替换旧的数据(个人认为非常难用...)replace($table, $column, $where) table [string] 表名. columns [string/array] The target columns of data will be replaced. where (optional) [array] The WHERE clause to fil