1. ホーム
  2. javascript

[解決済み] react.js エラー時に img src を置換する。

2022-12-02 17:38:46

質問

リアクトコンポーネントで、リストから詳細を表示するものがあります。

画像が存在せず、404エラーになった場合にデフォルトの画像に置き換えるようにしています。

通常であればimgタグのonerrorメソッドを使用するのですが、それがうまくいかないようです。

reactでどうすればいいのかよくわかりません。

私のコンポーネントはこちらです。

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,
};