React 星評価コンポーネントの実装

React 星評価コンポーネントの実装

要件は、製品の評価データを渡すことであり、ページには対応する星の数が表示されます。

1. 異なる評価に対応する3つの星の写真を用意する

ここに画像の説明を挿入
ここに画像の説明を挿入ここに画像の説明を挿入

2. 期待される結果

そのような

ここに画像の説明を挿入

電話

<StarScore スコア={data.wm_poi_score}/>

3. 受信したデータを処理する

スコアの整数部分と小数部分を取得する必要があります

wm_poi_score を this.props.score || とします。
スコアをwm_poi_score.toString()とします。
scoreArray = score.split('.'); とします。

4.7が渡された場合、結果のスコア配列は['4', '7']になります。

4. データに基づいて対応する星の数を計算する

// 完全な星の数 let fullstar = parseInt(scoreArray[0]);
// 半分の星の数 let halfstar = parseInt(scoreArray[1]) >= 5 ? 1 : 0;
// 灰色の星の数 let nullstar = 5 - fullstar - halfstar;

5. 星の数に応じてコンポーネントをレンダリングする

starjsx = [] とします。
// 完全な星をレンダリングする for (let i = 0; i < fullstar; i++) {
  starjsx.push(<div key={i + 'full'} className="star fullstar"></div>)
}
// 半分の星をレンダリングする if (halfstar) {
  (j = 0; j < ハーフスター; j++) の場合 {
    starjsx.push(<div key={j + 'half'} className="star halfstar"></div>)
  }
}
// 灰色の星をレンダリングします if (nullstar) {
  (k = 0; k < nullstar; k++ とします) {
    starjsx.push(<div key={k + 'null'} className="star nullstar"></div>)
  }
}

はい、望んでいた効果が達成されました。

6. 手動スコアリング

ここに画像の説明を挿入

ページが最初に表示されるときに、5 つの灰色の星が表示されます。各星にクリック イベントを追加します。クリックすると、星に対応する下付き文字インデックスが取得され、それにハイライト スタイルが追加されます。

<div className="スターエリア">
  {this.renderStar()}
</div>
doEva(i) {
  this.setState({
    開始インデックス: i + 1
  });
}

レンダースター() {
  配列 = [] とする
  (i = 0; i < 5; i++ とします) {
    cls = i >= this.state.startIndex ? "スターアイテム" : "スターアイテム ライト" とします
    配列.push(
      <div onClick={() => this.doEva(i)} キー={i} クラス名={cls}></div>
    )
  }
  配列を返す
}

完全なコード

'react' から React をインポートします。
'./StarScore.scss' をインポートします。

// 5つ星スコアメソッドをレンダリングする class StarScore extends React.Component {
  レンダリングスコア() {
    wm_poi_score を this.props.score || とします。
    スコアをwm_poi_score.toString()とします。
    scoreArray = score.split('.'); とします。
    // 完全な星の数 let fullstar = parseInt(scoreArray[0]);
    // 半分の星の数 let halfstar = parseInt(scoreArray[1]) >= 5 ? 1 : 0;
    // 灰色の星の数 let nullstar = 5 - fullstar - halfstar;
    starjsx = [] とします。

    // 完全な星をレンダリングする for (let i = 0; i < fullstar; i++) {
      starjsx.push(<div key={i + 'full'} className="star fullstar"></div>)
    }
    // 半分の星をレンダリングする if (halfstar) {
      (j = 0; j < ハーフスター; j++) の場合 {
        starjsx.push(<div key={j + 'half'} className="star halfstar"></div>)
      }
    }
    // 灰色の星をレンダリングします if (nullstar) {
      (k = 0; k < nullstar; k++ とします) {
        starjsx.push(<div key={k + 'null'} className="star nullstar"></div>)
      }
    }
    starjsx を返します。
  }
  与える() {
    <div className="star-score">{this.renderScore()}</div> を返します。
  }
}

デフォルトの StarScore をエクスポートします。

スタースコア.scss

.星スコア {
  。星 {
    幅: 10px;
    高さ: 10px;
    フロート: 左;
    背景サイズ: カバー;
  }

  .fullstar {
    背景画像: url('./img/fullstar.png');
  }

  .ハーフスター{
    背景画像: url('./img/halfstar.png');
  }

  .nu​​llstar {
    背景画像: url('./img/gray-star.png');
  }
}
'./Main.scss' をインポートします。
'react' から React をインポートします。

クラスMainはReact.Componentを拡張します。
  コンストラクタ(props) {
    スーパー(小道具);
    }
  }
  
  /**
   * クリックして評価してください */
  実行Eva(i) {
    this.setState({
      開始インデックス: i + 1
    });
  }
  /**
   * レンダリング評価の星 */
  レンダースター() {
    配列 = [] とする
    (i = 0; i < 5; i++ とします) {
      cls = i >= this.state.startIndex ? "スターアイテム" : "スターアイテム ライト" とします
      配列.push(
        <div onClick={() => this.doEva(i)} キー={i} クラス名={cls}></div>
      )
    }
    配列を返す
  }
  与える() {
    戻る (
      <div クラス名="コンテンツ">
        <div className="スターエリア">
            {this.renderStar()}
          </div>
      </div>
    );
  }
}

デフォルトのメインをエクスポートします。
。コンテンツ {
  高さ: 100%;
  .eva-コンテンツ{
    背景色: #fff;
    オーバーフロー: 非表示;
    マージン: px2rem(10px);
    上マージン: px2rem(74px);
  }
  .star-area {
    テキスト配置: 中央;
    上マージン: px2rem(30px);
  }
  .スターアイテム{
    幅: px2rem(32px);
    高さ: px2rem(32px);
    背景画像: url('./img/gray-star.png');
    背景サイズ: カバー;
    表示: インラインブロック;
    右マージン: px2rem(10px);

    &。ライト {
      背景画像: url('./img/light-star.png');
    }
  }
}

React 星評価コンポーネントの実装に関するこの記事はこれで終わりです。React 星評価の関連コンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • React は antd のアップロード コンポーネントを使用してファイル フォーム送信機能を実装します (完全なコード)
  • React 純粋関数コンポーネント setState がページ更新を更新しない問題の解決方法
  • Reactは動的ポップアップウィンドウコンポーネントを実装します
  • Reactコンポーネントをフルスクリーンにする方法

<<:  CMDコマンドを使用してMySqlデータベースを操作する方法の詳細な説明

>>:  MySQL クエリの重複データ (重複データを削除し、ID が最も小さいデータのみを保持します)

推薦する

MySQL 4 データをインポートする方法

1. mysqlコマンドをインポートするmysql コマンドのインポート構文は次のとおりです。 my...

Vueは動的コンポーネントを使用してTAB切り替え効果を実現します

目次問題の説明Vueの動的コンポーネントとはアプリケーションシナリオの説明実装手順ステップ 1 (新...

LDAP ユーザー認証を使用するように Linux を構成する方法

私は CentOS に実装された LDAP ユーザー管理を使用しています。これはインターネット上のほ...

docker に nacos をインストールしてデータベースを構成する詳細なチュートリアル

環境の準備 Docker環境 MySQL 5.7 (公式イメージはmysql8をサポートしていません...

Reactの基本のまとめ

目次序文始めるReactライフサイクルリアクトファイバーリアクトセットステートReactイベントメカ...

Navicat for MySQL 15 登録とアクティベーションの詳細なチュートリアル

1. Navicat for MySQL 15をダウンロードするhttps://www.navica...

既存のDockerコンテナの内容を変更する方法

1. Docker psはコンテナをリストします 2. Docker cpはコンテナにファイルをコピ...

td セルを結合した場合の td 幅の問題

以下の例では、名前が入っている td の幅が 60px のとき、2 行目の文字数が少ない場合は正常に...

el-tree での不完全なテキスト表示の解決策

目次方法1: 水平スクロールバーを設定する最も簡単な方法方法2(新規):ドラッグバーを追加して外側の...

ウェブサイトのコンテンツが検索エンジンに含まれないようにする方法

通常、Web サイトを構築する目的は、検索エンジンにインデックス登録してもらい、プロモーションを拡大...

Docker での MySQL 8.0.20 のインストールと設定のチュートリアル

Dockerは参考までにMySQLバージョン8.0.20をインストールします。具体的な内容は以下のと...

mysql の find_in_set 関数の基本的な使い方

序文これは私が最近見つけた新しい機能です。プロジェクトでの私の使用シナリオは次のとおりです。アプリケ...

Ubuntuがネットワークに接続できない場合の解決策

仮想マシン内の Ubuntu がネットワークに接続できない場合の効果的な解決策: 1. Ubuntu...

Server-U 14バージョンのインストールと使用方法

Server-Uソフトウェアの紹介Server-U は非常に強力なファイル マネージャーです。FTP...