প্রতিক্রিয়া - ডিওএম রেন্ডার করার সময় লোডিং স্ক্রিনটি প্রদর্শন করবেন?


149

এটি গুগল অ্যাডসেন্স অ্যাপ্লিকেশন পৃষ্ঠা থেকে একটি উদাহরণ। মুখ্য পৃষ্ঠা পরে প্রদর্শিত হওয়ার আগে লোডিং স্ক্রিন প্রদর্শিত হবে।

এখানে চিত্র বর্ণনা লিখুন

প্রতিক্রিয়াটির সাথে একই জিনিসটি কীভাবে করা যায় তা আমি জানি না কারণ আমি যদি প্রতিক্রিয়া উপাদান দ্বারা লোডিং স্ক্রিনটি রেন্ডার করি তবে পৃষ্ঠাটি লোড করার সময় এটি প্রদর্শিত হবে না কারণ এর আগে ডমের রেন্ডারটির জন্য অপেক্ষা করতে হয়েছিল।

আপডেট করা হয়েছে :

আমি স্ক্রীন লোডারটি রেখে index.htmlএটিকে প্রতিক্রিয়াশক জীবন componentDidMount()পদ্ধতিতে মুছে ফেলে আমার পদ্ধতির উদাহরণ তৈরি করেছি ।

উদাহরণ এবং প্রতিক্রিয়া-লোডিং-স্ক্রিন


আপনি সরল জেএসে কী দেখাতে চান তা প্রদর্শন করুন, তারপরে এটিকে লুকিয়ে রাখুন বা প্রতিক্রিয়া দেখা দিলে ডম থেকে সরান। আপনাকে যা করতে হবে তা হ'ল প্রতিক্রিয়া কোড থেকে এটি আড়াল করা।
FurkanO

এটি কেবল দুর্দান্ত! ধন্যবাদ.
আরমান করিমি

উত্তর:


100

এটি আপনার এইচটিএমএল ফাইলে লোডিং আইকনটি রেখে দেওয়া যেতে পারে (প্রাক্তন সূচী। Html), যাতে ব্যবহারকারীরা এইচটিএমএল ফাইলটি লোড হওয়ার সাথে সাথে আইকনটি দেখতে পান।

যখন আপনার অ্যাপ্লিকেশনটি লোডিং শেষ করে, আপনি কেবল একটি লাইফেসাইকেলের মধ্যে সেই লোডিং আইকনটি সরিয়ে ফেলতে পারেন, আমি সাধারণত এটি করি componentDidMount


11
আপনি যদি সেই আইকনের প্যারেন্ট নোডে রুট উপাদানটি মাউন্ট করেন তবে এটিকে ম্যানুয়ালি সরানোর দরকার নেই no প্রতিক্রিয়া মাউন্ট নোডের বাচ্চাদের পরিষ্কার করবে এবং তার পরিবর্তে তার নিজস্ব নতুন রেন্ডারড ডিওএম স্থাপন করবে।
রিশাত

6
আমি প্রতিক্রিয়া অ্যাপ্লিকেশনটির মূল নোডের ভিতরে আইকনটি রাখি না, এটি কেবল আমার কাছে ঠিক বোধ করে না
kkkkkkk

170

লক্ষ

এইচটিএমএল পৃষ্ঠাটি যখন রেন্ডার করা হয়, তখনই একটি স্পিনার তাত্ক্ষণিকভাবে প্রদর্শন করুন (প্রতিক্রিয়া লোড করার সময়) এবং প্রতিক্রিয়া প্রস্তুত হওয়ার পরে এটি লুকান।

স্পিনার যেহেতু খাঁটি এইচটিএমএল / সিএসএসে প্রকাশিত হয় (প্রতিক্রিয়া ডোমেনের বাইরে), প্রতিক্রিয়া দেখানো / লুকানোর প্রক্রিয়া সরাসরি নিয়ন্ত্রণ করা উচিত নয় এবং বাস্তবায়নের প্রতিক্রিয়া স্বচ্ছ হতে হবে।

সমাধান 1 - দ্য: খালি সিউডো-ক্লাস

যেহেতু আপনি কোনও ডিওএম ধারকটিতে প্রতিক্রিয়া রেন্ডার করেন - <div id="app"></div>আপনি সেই ধারকটিতে কোনও স্পিনার যোগ করতে পারেন এবং যখন প্রতিক্রিয়া লোড হবে এবং রেন্ডার হবে তখন স্পিনার অদৃশ্য হয়ে যাবে।

প্রতিক্রিয়া মূলের অভ্যন্তরে আপনি একটি ডিওএম উপাদান (উদাহরণস্বরূপ একটি ডিভ) যুক্ত করতে পারবেন না, যেহেতু রিএ্যাকটি ReactDOM.render()ডেকে যাওয়ার সাথে সাথে ধারকটির সামগ্রীগুলি প্রতিস্থাপন করবে । এমনকি আপনি যদি রেন্ডার করেন nullতবে সামগ্রীটি এখনও একটি মন্তব্যে প্রতিস্থাপন করা হবে - <!-- react-empty: 1 -->। এর অর্থ হ'ল আপনি যদি প্রধান উপাদানটি মাউন্ট করার সময় লোডারটি প্রদর্শন করতে চান তবে ডেটা লোড হচ্ছে, তবে কিছুই আসলে রেন্ডার করা হয়নি, ধারকটির ভিতরে একটি লোডার মার্কআপ রাখা হয়েছে (<div id="app"><div class="loader"></div></div> কাজ করবে না উদাহরণস্বরূপ)।

একটি কার্যপ্রণালী হ'ল প্রতিক্রিয়াশীল ধারকটিতে স্পিনার ক্লাস যুক্ত করা এবং :emptyসিউডো ক্লাস ব্যবহার করা । স্পিনারটি দৃশ্যমান হবে, যতক্ষণ না কোনও কিছুই ধারকটিতে রেন্ডার করা হয় না (মন্তব্য গণনা করা হয় না)। প্রতিক্রিয়ার সাথে সাথে মন্তব্য ব্যতীত অন্য কিছু রেন্ডার হয়ে যায়, লোডার অদৃশ্য হয়ে যাবে।

উদাহরণ 1

উদাহরণস্বরূপ আপনি এমন একটি উপাদান দেখতে পাবেন যা nullএটি প্রস্তুত না হওয়া অবধি রেন্ডার করে । ধারকটি হ'ল লোডারও - <div id="app" class="app"></div>এবং লোডার শ্রেণিটি কেবল তখনই কাজ করবে :empty(কোডে মন্তব্যগুলি দেখুন):

উদাহরণ 2

:emptyকোনও নির্বাচককে দেখানোর / আড়াল করার জন্য সিউডো ক্লাসটি ব্যবহারের ক্ষেত্রে তারতম্য , স্পিনারকে অ্যাপ কনটেয়ারে ভাইবোন উপাদান হিসাবে সেট করে এবং সংলগ্ন ভাইবাল সংযুক্তকারী ( +) ব্যবহার করে ধারকটি খালি থাকলে যতক্ষণ না এটি প্রদর্শিত হয় :


সমাধান 2 - প্রপস হিসাবে পাস স্পিনার "হ্যান্ডলার"

স্পিনাররা প্রদর্শন রাষ্ট্র উপর আরো একটি সূক্ষ্ম গ্রেইনড নিয়ন্ত্রণ আছে, দুই ফাংশন তৈরি showSpinnerএবং hideSpinner, এবং সাজসরঞ্জাম মাধ্যমে রুট ধারক তাদের পাস। ফাংশনগুলি ডিওএমকে পরিচালনা করতে পারে, বা স্পিনারকে নিয়ন্ত্রণ করার জন্য যা প্রয়োজন তা করতে পারে। এইভাবে, প্রতিক্রিয়াটি "বাইরের বিশ্বের" সম্পর্কে সচেতন নয় বা ডমকে সরাসরি নিয়ন্ত্রণ করার প্রয়োজন নেই। আপনি পরীক্ষার জন্য ফাংশনগুলি সহজেই প্রতিস্থাপন করতে পারেন, বা আপনার যদি যুক্তিটি পরিবর্তন করতে হয় এবং আপনি এগুলি প্রতিক্রিয়া গাছের অন্যান্য উপাদানগুলিতে দিতে পারেন।

উদাহরণ 1

উদাহরণ 2 - হুকস

এই উদাহরণটি useEffectউপাদানটি মাউন্ট করার পরে স্পিনারকে আড়াল করতে হুক ব্যবহার করে ।


শেষ 2 কোড বিভাগগুলি কোথায় হওয়া উচিত তা আপনি পরিষ্কার করতে পারেন? প্রথমটি প্রতিক্রিয়া উপাদানটির জন্য জাভাস্ক্রিপ্ট এসআরসি ফাইলটিতে স্পষ্টভাবে রয়েছে, তৃতীয়টি আমি অনুমান করছি যে এইচটিএমএল টেমপ্লেটে জেএস ফাইলটি রেন্ডার করা যায়, তবে দ্বিতীয়টি কোথায় যায়?
লেভরাইনজানির

1
২ য় হ'ল সিএসএস। আমি গ্লোবাল সিএসএস ব্যবহার করেছি তবে আপনি সিএসএস মডিউল বা সিএসএস ব্যবহার করতে পারেন জেএসে। তৃতীয়টি এইচটিএমএল ফাইল যা প্রয়োজন অনুসারে স্পিনার মার্কআপ অন্তর্ভুক্ত করতে পারে (২ য় উদাহরণ)।
অরি দ্রোরি

কর্মক্ষমতা বিবেচনায় নেওয়া হলে সময়সীমাটি ভাল হয় না।
ড্রাইলিফ

4
@ ড্রাইলিফ - সেটটাইমআউট সমাধানের অংশ নয়। এটি সামগ্রীটি রেন্ডার করার আগে একটি অ্যাসিঙ্ক ক্রিয়াটির জন্য অপেক্ষা করার অনুকরণ করে।
ওরি দ্রোরি

আমি অনুরূপ পদ্ধতির ব্যবহার। আমি ওয়েবপ্যাকে এমন কোনও কিছুই খুঁজে পাচ্ছি না যা লোডারের জন্য প্রয়োজনীয় সিএসএস ফাইলের জন্য আবদ্ধ ক্যাশে আমাকে সহায়তা করতে পারে। তুমি কি সাহায্য করতে পারো?
হামজা-জুট

40

এটির জন্য কার্যকর কাজটি হ'ল:

আপনার রেন্ডার ফাংশনে এই জাতীয় কিছু করুন:

constructor() {
    this.state = { isLoading: true }
}

componentDidMount() {
    this.setState({isLoading: false})
}

render() {
    return(
        this.state.isLoading ? *showLoadingScreen* : *yourPage()*
    )
}

কনস্ট্রাক্টারে সত্য হিসাবে ইজলোডিং আর ইম্পোনালডিডমাউন্টে মিথ্যা সূচনা করুন


যখন আমরা শিশুদের উপাদানগুলিতে ডেটা লোড করতে এজ্যাক্স পদ্ধতিতে কল করেছি। চাইল্ড উপাদান উপাদান ডেটা পপুলিংয়ের আগে घटकডিডমাউন্ট কল করা হয়। আমরা এই ধরণের সমস্যাটি কীভাবে কাটিয়ে উঠি?
dush88c

2
লাইফ কাইল মাউন্টিংয়ের জন্য এটি ঠিক আছে, আপনি কি আপডেট লাইফ চক্রের জন্য কিছু যুক্ত করতে চান?
জাকির

আমাকে কী সমস্ত পৃষ্ঠায় বা কেবল অ্যাপ এন্ট্রি করতে হবে
পেড্রো জেআর

16

উপরের ব্যবহারের ক্ষেত্রে যদি কেউ ড্রপ-ইন, শূন্য-কনফিগারেশন এবং শূন্য-নির্ভরতা গ্রন্থাগারটি সন্ধান করে তবে পেস.জেএস চেষ্টা করুন ( http://github.hubspot.com/pace/docs/welcome/ ) ।

এটি স্বয়ংক্রিয়ভাবে ইভেন্টগুলিতে (আজাক্স, রেডিস্টেট, ইতিহাস পুশস্টেট, জেএস ইভেন্ট লুপ ইত্যাদি) হুক করে এবং একটি অনুকূলিতযোগ্য লোডার দেখায় show

আমাদের প্রতিক্রিয়া / রিলে প্রকল্পগুলির সাথে ভাল কাজ করেছে (রিএ্যাক্ট রাউটার ব্যবহার করে নেভিগেশন পরিবর্তনগুলি পরিচালনা করে, রিলে অনুরোধগুলি) (সংযুক্ত নয়; আমাদের প্রকল্পের জন্য পেস.জেএস ব্যবহার করেছে এবং এটি দুর্দান্ত কাজ করেছে)


হে! আপনি কীভাবে এটি প্রতিক্রিয়া সহ ব্যবহার করতে পারেন আমাকে বলতে পারেন?
uneet7

কেবল স্ক্রিপ্টটি সংযুক্ত করুন public/index.htmlএবং একটি শৈলী চয়ন করুন। এটি মৃত সহজ, আশ্চর্যজনক প্লাগইন। ধন্যবাদ.
পিজে

এই উত্তর ছাড়া আমি গতি খুঁজে পেতাম না। এটি অন্তর্ভুক্ত করা এত সহজ ছিল এবং সামান্য সিএসএস যাদু এবং কিছু ইভেন্ট সংযুক্তির সাহায্যে আমি স্থানান্তরের সময় অ্যাপটিকে অবরোধ / অক্ষম করতে এবং স্পিনারটিকে কাস্টমাইজ করতে সক্ষম হয়েছি।
invertedSpear

12

যখন আপনার প্রতিক্রিয়া অ্যাপটি বিশাল হয়, পৃষ্ঠাটি লোড হয়ে যাওয়ার পরে এটি উঠতে এবং চলতে সত্যই সময় লাগে। বলুন, আপনি অ্যাপ্লিকেশনটির আপনার প্রতিক্রিয়া অংশটি মাউন্ট করেছেন #app। সাধারণত, আপনার সূচক html এ এই উপাদানটি খালি ডিভ হয়:

<div id="app"></div>

পৃষ্ঠার লোড এবং প্রাথমিক প্রতিক্রিয়ার অ্যাপ্লিকেশনটিকে ডিওমে রেন্ডারিংয়ের মধ্যে আরও ভাল দেখানোর জন্য আপনি এর পরিবর্তে যা কিছু করতে পারেন তা সেখানে কিছু স্টাইলিং এবং একগুচ্ছ চিত্র রেখে দেওয়া হয়েছে:

<div id="app">
  <div class="logo">
    <img src="/my/cool/examplelogo.svg" />
  </div>
  <div class="preload-title">
    Hold on, it's loading!
  </div>
</div>

পৃষ্ঠাটি লোড হওয়ার পরে, ব্যবহারকারী তাত্ক্ষণিকভাবে সূচিপত্রের html এর মূল সামগ্রীটি দেখতে পাবেন। খুব শীঘ্রই, যখন প্রতিক্রিয়া এই ডিওএম নোডে রেন্ডারযুক্ত উপাদানগুলির পুরো শ্রেণিবিন্যাস মাউন্ট করার জন্য প্রস্তুত হয়, ব্যবহারকারী প্রকৃত অ্যাপ্লিকেশনটি দেখতে পাবেন।

নোট class, না className। কারণ এটি আপনার এইচটিএমএল ফাইলের মধ্যে রাখা দরকার।


আপনি যদি এসএসআর ব্যবহার করেন তবে বিষয়গুলি কম জটিল কারণ ব্যবহারকারী পৃষ্ঠাটি লোড হওয়ার ঠিক পরে আসল অ্যাপটি দেখতে পাবেন।


এটি আমার দু'টি জায়গায় যেখানে লোডিং ঘটে তাও কাজ করে। একটি হ'ল বিশাল অ্যাপ। এবং পরবর্তী হয় প্রস্তুতি (বিভিন্ন উপাদান মাউন্টিং।) কারণ app.render লাগে বেশী তাই আমি একটি ঝলকানি পদক্ষেপ পেতে এবং অ্যানিমেশন রিসেট পায় ( প্রতিস্থাপিত সত্যিই।) হায় একটি উপায় যে ফ্ল্যাশ এড়াতে সেখানে? প্রতিক্রিয়া কি ডোমকে একের সাথে তুলনা করবে? তবে আমি যা বুঝি সেগুলি থেকে ট্যাগগুলিতে সমস্ত ধরণের ব্যক্তিগত ডেটা যুক্ত হয় ...
অ্যালেক্সিস উইলক

12

মূলেরReactDOM.render() নিয়ন্ত্রণ নেওয়ার আগে এটি ঘটবে । অর্থাৎ আপনার অ্যাপ্লিকেশনটি এখনও পর্যন্ত মাউন্ট করা যাবে না। <div>

সুতরাং আপনি নিজের index.htmlফাইলটিতে আপনার লোডারটি মূলের অভ্যন্তরে যুক্ত করতে পারেন<div> । এবং প্রতিক্রিয়া গ্রহণ না করা পর্যন্ত এটি পর্দায় দৃশ্যমান হবে।

আপনার জন্য যে কোনও লোডার উপাদানটি সর্বোত্তমভাবে কাজ করে তা আপনি ব্যবহার করতে পারেন ( svgউদাহরণস্বরূপ অ্যানিমেশন সহ)।

আপনার কোনও জীবনকালীন পদ্ধতিতে এটি সরানোর দরকার নেই। প্রতিক্রিয়াটি এর মূলের যে কোনও শিশুকে <div>আপনার রেন্ডারের সাথে প্রতিস্থাপন করবে <App/>, যেমন আমরা নীচের জিআইএফে দেখতে পাচ্ছি।

কোডস্যান্ডবক্সে উদাহরণ

এখানে চিত্র বর্ণনা লিখুন

index.html

<head>
  <style>
    .svgLoader {
      animation: spin 0.5s linear infinite;
      margin: auto;
    }
    .divLoader {
      width: 100vw;
      height: 100vh;
      display: flex;
      align-items: center;
      justify-content: center;
    }
    @keyframes spin {
      0% { transform: rotate(0deg); }
      100% { transform: rotate(360deg); }
    }
  </style>
</head>

<body>
  <div id="root">
    <div class="divLoader">
      <svg class="svgLoader" viewBox="0 0 1024 1024" width="10em" height="10em">
        <path fill="lightblue"
          d="PATH FOR THE LOADER ICON"
        />
      </svg>
    </div>
  </div>
</body>

index.js

রান debuggerকরার আগে পৃষ্ঠাটি পরিদর্শন করতে ব্যবহার করা ReactDOM.render()

import React from "react";
import ReactDOM from "react-dom";
import "./styles.css";

function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

debugger; // TO INSPECT THE PAGE BEFORE 1ST RENDER

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

একটি সুন্দর এবং মার্জিত সমাধান
গাল মার্গালিট

1
আমি আনন্দিত এটি সাহায্য করে!
সিবিডিভেলপার

9

আজকাল আমরা প্রতিক্রিয়া 16.8 তে হুকগুলিও ব্যবহার করতে পারি:

import React, { useState, useEffect } from 'react';

const App = () => {
  const [ spinner, setSpinner ] = useState(true);

  // It will be executed before rendering

  useEffect(() => {
    setTimeout(() => setSpinner(false), 1000)
  }, []);

  // [] means like componentDidMount

  return !spinner && <div>Your content</div>;
};

export default App;

5

কম্পোনেন্টডিডমাউন্টে টাইমআউট সেট করা কাজ করে তবে আমার আবেদনে আমি একটি মেমরি ফাঁসের সতর্কতা পেয়েছি। এরকম কিছু চেষ্টা করুন।

constructor(props) {
    super(props)
    this.state = { 
      loading: true,
    }
  }
  componentDidMount() {
    this.timerHandle = setTimeout(() => this.setState({ loading: false }), 3500); 
  }

  componentWillUnmount(){
    if (this.timerHandle) {
      clearTimeout(this.timerHandle);
      this.timerHandle = 0;
    }
  }

4

আমাকে সম্প্রতি এই সমস্যার সাথে মোকাবিলা করতে হয়েছিল এবং একটি সমাধান নিয়ে এসেছি, যা আমার পক্ষে ঠিক কাজ করে। তবে, আমি উপরে ওরি ডেরি সমাধানটি চেষ্টা করেছি এবং দুর্ভাগ্যক্রমে এটি ঠিক কাজ করে না (কিছুটা বিলম্ব হয়েছে + আমি এর ব্যবহার পছন্দ করি না)setTimeout সেখানে ফাংশনটির )।

এটিই আমি নিয়ে এসেছি:

index.html ফাইল

ভিতরে head ট্যাগ - সূচক জন্য শৈলী:

<style media="screen" type="text/css">

.loading {
  -webkit-animation: sk-scaleout 1.0s infinite ease-in-out;
  animation: sk-scaleout 1.0s infinite ease-in-out;
  background-color: black;
  border-radius: 100%;
  height: 6em;
  width: 6em;
}

.container {
  align-items: center;
  background-color: white;
  display: flex;
  height: 100vh;
  justify-content: center;
  width: 100vw;
}

@keyframes sk-scaleout {
  0% {
    -webkit-transform: scale(0);
    transform: scale(0);
  }
  100% {
    -webkit-transform: scale(1.0);
    opacity: 0;
    transform: scale(1.0);
  }
}

</style>

এখনbody ট্যাগ:

<div id="spinner" class="container">
  <div class="loading"></div>
</div>

<div id="app"></div>

এবং তারপরে একটি খুব সাধারণ যুক্তি আসবে, app.jsফাইলের অভ্যন্তরে (রেন্ডার ফাংশনে):

const spinner = document.getElementById('spinner');

if (spinner && !spinner.hasAttribute('hidden')) {
  spinner.setAttribute('hidden', 'true');
}

এটা কিভাবে কাজ করে?

যখন প্রথম উপাদানটি (আমার অ্যাপ্লিকেশনে এটি app.jsবেশিরভাগ ক্ষেত্রে পাশাপাশি spinnerরয়েছে ) সঠিকভাবে মাউন্ট করে, তখন hiddenএটিতে বৈশিষ্ট্য প্রয়োগ করে লুকানো হচ্ছে ।

আরও যুক্ত করার জন্য আরও গুরুত্বপূর্ণ - !spinner.hasAttribute('hidden')শর্তটি hiddenপ্রতিটি উপাদান মাউন্ট সহ স্পিনারের সাথে অ্যাট্রিবিউট যোগ করতে বাধা দেয় , সুতরাং পুরো অ্যাপটি লোড হওয়ার পরে এটি কেবলমাত্র একবার যুক্ত করা হবে।


4

আমি প্রতিক্রিয়া-অগ্রগতি -2 এনপিএম প্যাকেজটি ব্যবহার করছি যা শূন্য-নির্ভরতা এবং রিঅ্যাকটিজেএসে দুর্দান্ত কাজ করে।

https://github.com/milworm/react-progress-2

স্থাপন:

npm install react-progress-2

আপনার প্রকল্পে প্রতিক্রিয়া-অগ্রগতি -2 / মেইন সিএসএস অন্তর্ভুক্ত করুন।

import "node_modules/react-progress-2/main.css";

react-progress-2এটি শীর্ষ-উপাদানটিতে কোথাও অন্তর্ভুক্ত করুন এবং রাখুন:

import React from "react";
import Progress from "react-progress-2";

var Layout = React.createClass({
render: function() {
    return (
        <div className="layout">
            <Progress.Component/>
                {/* other components go here*/}
            </div>
        );
    }
});

এখন, যখনই আপনাকে কোনও সূচক দেখাতে হবে, কেবল কল করুন Progress.show(), উদাহরণস্বরূপ:

loadFeed: function() {
    Progress.show();
    // do your ajax thing.
},

onLoadFeedCallback: function() {
    Progress.hide();
    // render feed.
}

দয়া করে নোট করুন, এটি showএবং hideকলগুলি স্ট্যাক করা আছে, সুতরাং এন-পরপর শো কলগুলির পরে, আপনাকে একটি সূচককে আড়াল করতে n হাইড কলগুলি করতে হবে বা আপনি ব্যবহার করতে পারেন Progress.hideAll()


4

আমি আমার অ্যাপে প্রতিক্রিয়াও ব্যবহার করছি। অনুরোধগুলির জন্য আমি অক্ষর ইন্টারসেপ্টারগুলি ব্যবহার করছি, লোডার স্ক্রিনটি তৈরি করার দুর্দান্ত উপায় (আপনি যেমন একটি উদাহরণ দেখিয়েছেন তেমন পূর্ণ পৃষ্ঠা) হ'ল উদাহরণস্বরূপ অভ্যন্তরীণ অভ্যন্তরগুলির (যেমন কিছু কাস্টম কোড সহ অফিসিয়াল ডকুমেন্টেশন থেকে কোড) শ্রেণি বা আইডি যুক্ত করা:

// Add a request interceptor
axios.interceptors.request.use(function (config) {
    // Do something before request is sent
     document.body.classList.add('custom-loader');
     return config;
  }, function (error) {
    // Do something with request error
    return Promise.reject(error);
  });

// Add a response interceptor
axios.interceptors.response.use(function (response) {
    // Do something with response data
       document.body.classList.remove('custom-loader');
       return response;
  }, function (error) {
    // Do something with response error
    return Promise.reject(error);
  }); 

এবং তারপরে সিএসএসে আপনার লোডারটি সিউডো-এলিমেন্টগুলির মাধ্যমে প্রয়োগ করুন (বা শ্রেণিতে বা আইডি যুক্ত করুন বিভিন্ন উপাদানকে, আপনার পছন্দ মতো দেহটি নয়) - আপনি ব্যাকগ্রাউন্ডের রঙটি অস্বচ্ছ বা স্বচ্ছ ইত্যাদি সেট করতে পারেন ... উদাহরণ:

custom-loader:before {
    background: #000000;
    content: "";
    position: fixed;
    ...
}

custom-loader:after {
    background: #000000;
    content: "Loading content...";
    position: fixed;
    color: white;
    ...
}

3

সর্বজনীন ফোল্ডারে আপনার সূচি। Html ফাইলের অবস্থান সম্পাদনা করুন । আপনার চিত্রটিকে সর্বজনীন ফোল্ডারে সূচক html হিসাবে একই স্থানে অনুলিপি করুন । এবং তারপরে <div id="root"> </div>নীচের প্রদত্ত এইচটিএমএল কোডটিতে ট্যাগযুক্ত সূচক । Html এর সামগ্রীর অংশটি প্রতিস্থাপন করুন ।

<div id="root">  <img src="logo-dark300w.png" alt="Spideren" style="vertical-align: middle; position: absolute;
   top: 50%;
   left: 50%;
   margin-top: -100px; /* Half the height */
   margin-left: -250px; /* Half the width */" />  </div>

লোডিং প্রক্রিয়া চলাকালীন লোগো এখন পৃষ্ঠার মাঝখানে উপস্থিত হবে। এবং তারপর প্রতিক্রিয়া দ্বারা কয়েক সেকেন্ড পরে প্রতিস্থাপন করা হবে।


2

আপনার এত চেষ্টা করার দরকার নেই, এখানে একটি প্রাথমিক উদাহরণ's

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="theme-color" content="#000000" />
  <meta name="description" content="Web site created using create-react-app" />
  <link rel="apple-touch-icon" href="logo192.png" />
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
  <title>Title</title>
  <style>
    body {
      margin: 0;
    }

    .loader-container {
      width: 100vw;
      height: 100vh;
      display: flex;
      overflow: hidden;
    }

    .loader {
      margin: auto;
      border: 5px dotted #dadada;
      border-top: 5px solid #3498db;
      border-radius: 50%;
      width: 100px;
      height: 100px;
      -webkit-animation: spin 2s linear infinite;
      animation: spin 2s linear infinite;
    }

    @-webkit-keyframes spin {
      0% {
        -webkit-transform: rotate(0deg);
      }

      100% {
        -webkit-transform: rotate(360deg);
      }
    }

    @keyframes spin {
      0% {
        transform: rotate(0deg);
      }

      100% {
        transform: rotate(360deg);
      }
    }

  </style>
</head>

<body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <div id="root">
    <div class="loader-container">
      <div class="loader"></div>
    </div>
  </div>
</body>

</html>

আপনার সাথে প্রায় প্লে করতে পারেন HTMLএবং CSSএটি আপনার উদাহরণ মত দেখায় না।


1

সর্বাধিক গুরুত্বপূর্ণ প্রশ্নটি: 'লোডিং' বলতে কী বোঝ? আপনি যদি শারীরিক উপাদানটিকে মাউন্ট করার বিষয়ে কথা বলছেন তবে এখানে প্রথম কয়েকটি উত্তর দুর্দান্ত। তবে, আপনার অ্যাপ্লিকেশনটি যদি প্রথমে প্রমাণীকরণের জন্য যাচাই করে তবে আপনি যা সত্যই লোড করছেন তা ব্যাকএন্ডের ডেটা হ'ল ব্যবহারকারী কোনও কুকি পাস করেছে যা তাদের কোনও অনুমোদিত বা অননুমোদিত ব্যবহারকারীর লেবেল দিয়েছে।

এটি রিডুএক্সের চারপাশে ভিত্তিক, তবে আপনি এটিকে সহজেই প্লেইন রিঅ্যাক্ট স্টেট মডেলে পরিবর্তন করতে পারেন।

কর্ম নির্মাতা:

export const getTodos = () => {
  return async dispatch => {
    let res;
    try {
      res = await axios.get('/todos/get');

      dispatch({
        type: AUTH,
        auth: true
      });
      dispatch({
        type: GET_TODOS,
        todos: res.data.todos
      });
    } catch (e) {
    } finally {
      dispatch({
        type: LOADING,
        loading: false
      });
    }
  };
};

পরিশেষে অংশটির অর্থ ব্যবহারকারীটি শোধিত হয়েছে কি না, একটি প্রতিক্রিয়া পাওয়ার পরে লোডিং স্ক্রিনটি চলে যায়।

এখানে এমন কোনও উপাদান যা লোড করে এটি দেখতে পারে:

class App extends Component {
  renderLayout() {
    const {
      loading,
      auth,
      username,
      error,
      handleSidebarClick,
      handleCloseModal
    } = this.props;
    if (loading) {
      return <Loading />;
    }
    return (
      ...
    );
  }

  ...

  componentDidMount() {
    this.props.getTodos();
  }

...

  render() {
    return this.renderLayout();
 }

}

যদি state.loading সত্য হয়, আমরা সর্বদা একটি লোডিং স্ক্রিন দেখতে পাব। কম্পোনেন্টডিডমাউন্টে আমরা আমাদের গেটটোডস ফাংশন বলি, যা এমন ক্রিয়া স্রষ্টা যা রাষ্ট্র পরিবর্তন করে load আমাদের উপাদান আপডেট, কলগুলি আবার রেন্ডার করে, এবং এই সময় বিবৃতিটির কারণে কোনও লোডিং স্ক্রিন নেই।


1

প্রতিক্রিয়া অ্যাপ্লিকেশনটির সূচনা মূল বান্ডিল ডাউনলোডের উপর ভিত্তি করে। ব্র্যাকটিতে মূল বান্ডিলটি ডাউনলোড হওয়ার পরে কেবল প্রতিক্রিয়া অ্যাপ্লিকেশনটি শুরু হয়। অলস লোডিং আর্কিটেকচারের ক্ষেত্রে এটি এমনকি সত্য। তবে আসল বিষয়টি হ'ল আমরা কোনও বান্ডিলের নাম ঠিক বলতে পারি না। কারণ ওয়েবপ্যাক প্রতিটি বান্ডেলের শেষে হ্যাশ মান যুক্ত করবে যখন আপনি 'এনপিএম রান বিল্ড' কমান্ডটি চালাবেন। অবশ্যই আমরা হ্যাশ সেটিংস পরিবর্তন করে এড়াতে পারি, তবে এটি ব্রাউজারের ক্যাশে ডেটা সমস্যাটিকে গুরুতরভাবে প্রভাবিত করবে। একই বান্ডিল নামের কারণে ব্রাউজারগুলি নতুন সংস্করণটি নিতে পারে না। । এই পরিস্থিতিটি পরিচালনা করতে আমাদের একটি ওয়েবপ্যাক + জেএস + সিএসএস পদ্ধতির প্রয়োজন।

নীচে হিসাবে সর্বজনীন / সূচক। html পরিবর্তন করুন

<!DOCTYPE html>
<html lang="en" xml:lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=3.0, shrink-to-fit=no">
  <meta name="theme-color" content="#000000">
  <!--
      manifest.json provides metadata used when your web app is added to the
      homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
    -->
  <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
  <style>
 .percentage {
      position: absolute;
      top: 50%;
      left: 50%;
      width: 150px;
      height: 150px;
      border: 1px solid #ccc;
      background-color: #f3f3f3;
      -webkit-transform: translate(-50%, -50%);
          -ms-transform: translate(-50%, -50%);
              transform: translate(-50%, -50%);
      border: 1.1em solid rgba(0, 0, 0, 0.2);
      border-radius: 50%;
      overflow: hidden;
      display: -webkit-box;
      display: -ms-flexbox;
      display: flex;
      -webkit-box-pack: center;
          -ms-flex-pack: center;
              justify-content: center;
      -webkit-box-align: center;
          -ms-flex-align: center;
              align-items: center;
    }

    .innerpercentage {
      font-size: 20px;
    }
  </style>
  <script>
    function showPercentage(value) {
      document.getElementById('percentage').innerHTML = (value * 100).toFixed() + "%";
    }
    var req = new XMLHttpRequest();
    req.addEventListener("progress", function (event) {
      if (event.lengthComputable) {
        var percentComplete = event.loaded / event.total;
        showPercentage(percentComplete)
        // ...
      } else {
        document.getElementById('percentage').innerHTML = "Loading..";
      }
    }, false);

    // load responseText into a new script element
    req.addEventListener("load", function (event) {
      var e = event.target;
      var s = document.createElement("script");
      s.innerHTML = e.responseText;
      document.documentElement.appendChild(s);
      document.getElementById('parentDiv').style.display = 'none';

    }, false);

    var bundleName = "<%= htmlWebpackPlugin.files.chunks.main.entry %>";
    req.open("GET", bundleName);
    req.send();

  </script>
  <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->

  <title>App Name</title>
  <link href="<%= htmlWebpackPlugin.files.chunks.main.css[0] %>" rel="stylesheet">
</head>

<body>
  <noscript>
    You need to enable JavaScript to run this app.
  </noscript>
  <div id="parentDiv" class="percentage">
    <div id="percentage" class="innerpercentage">loading</div>
  </div>
  <div id="root"></div>
  <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
</body>

</html>

আপনার প্রোডাকশন ওয়েবপ্যাক কনফিগারেশনে HtmlWebpackPlugin বিকল্পটি নীচে পরিবর্তন করুন

 new HtmlWebpackPlugin({
          inject: false,
...

কনফিগারেশন ফাইলটি পেতে আপনার 'ইজেক্ট' কমান্ডটি ব্যবহার করতে হতে পারে। সর্বশেষতম ওয়েবপ্যাকের প্রকল্পটি বের করে না দিয়েই এইচটিএমএল ওয়েবপ্যাক প্লাগিন কনফিগার করার বিকল্প থাকতে পারে। এখানে চিত্র বর্ণনা লিখুন


1

আমি @ ওরি দ্রোরির উত্তরও ব্যবহার করেছি এবং এটি কাজে লাগাতে সক্ষম হয়েছি। আপনার প্রতিক্রিয়া কোডটি বাড়ার সাথে সাথে এইভাবে বান্ডিলগুলি সংকলিত হবে যে ক্লায়েন্ট ব্রাউজারটি প্রথমবার অ্যাক্সেসে ডাউনলোড করতে হবে। আপনি যদি এটি ভালভাবে পরিচালনা না করেন তবে এটি ব্যবহারকারীর অভিজ্ঞতার সমস্যাটিকে চাপিয়ে দেয়।

@ ওরি উত্তরে আমি যা যুক্ত করেছি তা হ'ল বডি ট্যাগের ওনলোড বৈশিষ্ট্যের উপর ভিত্তি করে সূচকটি.ইচটিএমএলে ওল্ড ফাংশন যুক্ত এবং সম্পাদন করা, যাতে ব্রাউজে সমস্ত কিছু পুরোপুরি লোড হয়ে যাওয়ার পরে লোডার অদৃশ্য হয়ে যায়, নীচের স্নিপেটটি দেখুন:

<html>
  <head>
     <style>
       .loader:empty {
          position: absolute;
          top: calc(50% - 4em);
          left: calc(50% - 4em);
          width: 6em;
          height: 6em;
          border: 1.1em solid rgba(0, 0, 0, 0.2);
          border-left: 1.1em solid #000000;
          border-radius: 50%;
          animation: load8 1.1s infinite linear;
        }
        @keyframes load8 {
          0% {
           transform: rotate(0deg);
          }
          100% {
           transform: rotate(360deg);
          }
        }
     </style>
     <script>
       function onLoad() {
         var loader = document.getElementById("cpay_loader");loader.className = "";}
     </script>
   </head>
   <body onload="onLoad();">
     more html here.....
   </body>
</html>

1

পেস ব্যবহার সম্পর্কে কি

এই লিঙ্ক ঠিকানাটি এখানে ব্যবহার করুন।

https://github.hubspot.com/pace/docs/welcome/

1. তাদের ওয়েবসাইটে আপনার পছন্দ মতো স্টাইল নির্বাচন করুন এবং সূচিপত্র এসএসএসে পেস্ট করুন

সিডিএনজেজে ২.go যান পেস জেএসের জন্য লিঙ্কটি অনুলিপি করুন এবং আপনার স্ক্রিপ্ট ট্যাগগুলিতে পাবলিক / ইনডেক্স html এ যুক্ত করুন

৩. এটি স্বয়ংক্রিয়ভাবে ওয়েব লোডগুলি সনাক্ত করে এবং ব্রাউজার শীর্ষে গতি প্রদর্শন করে।

আপনি CSS এও উচ্চতা এবং অ্যানিমেশন পরিবর্তন করতে পারেন।


দুর্দান্ত এবং কোনও সময়েই সংহত করা যায়।
উজুমাকিএল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.