React Suspense / Concurrent - порядок SuspenseList не работает - PullRequest
0 голосов
/ 30 октября 2019

Я следил за видео Бена Авада и пытался расширить идею реагирования SuspenseList , но не смог заставить элементы отображаться в обратном порядке или вместе, когда я изменил revealOrder. Во всех случаях конечные точки вызываются одна за другой и загружаются в режиме forwards.

Демо-репо

const fetchPerson = () => {
    return fetch('https://randomuser.me/api').then(x => x.json()).then(x => x.results[0]); 
}; 

const wrapPromise = (promise) => {
    let status = 'pending'; 
    let result = '';
    let suspender = promise.then(r => {
        status = 'success'; 
        result = r;
    }, e => { 
        status = 'error'; 
        result = e; 
    }) 

    return {
        read(){
            if (status === 'pending'){
                throw suspender; 
            } else if (status === 'error'){
                throw result; 
            }
            return result; 
        }
    }
} 

export const createResource = () => {
    return {
        person1: wrapPromise(fetchPerson()),
        person2: wrapPromise(fetchPerson()),
        person3: wrapPromise(fetchPerson()),
        person4: wrapPromise(fetchPerson()),
        person5: wrapPromise(fetchPerson()),
        person6: wrapPromise(fetchPerson())
    }
}




import React, { Suspense } from 'react';
import './App.css';
import { createResource } from './PersonApi';
import { Person } from './Person'; 

const resource = createResource(); 

function App() {
  return (
      <div className="App">
        <Suspense fallback={<h1>loading...</h1>} revealOrder="together">
          <Suspense fallback={<h1>loading person 1</h1>}>
            <Person resource={resource} num="person1" />
          </Suspense>
          <Suspense fallback={<h1>loading person 2</h1>}>
            <Person resource={resource} num="person2" />
          </Suspense>
          <Suspense fallback={<h1>loading person 3</h1>}>
            <Person resource={resource} num="person3"/>
          </Suspense>
          <Suspense fallback={<h1>loading person 4</h1>}>
            <Person resource={resource} num="person4"/>
          </Suspense>
          <Suspense fallback={<h1>loading person 5</h1>}>
            <Person resource={resource} num="person5"/>
          </Suspense>
          <Suspense fallback={<h1>loading person 6</h1>}>
            <Person resource={resource} num="person6"/>
          </Suspense>
        </Suspense>
      </div>
  );
}

export default App;


import React from 'react'; 


export const Person = ({ resource, num  }) => {
    const person = resource[num].read(); 
    return (<div>Loaded {num}: - {person.name.first}</div>)
}; 

...