Size: a a a

2020 December 25

PM

Pavel 🦇 Malyshev in Svelte [svelt]
То что смог разглядеть - попробуй сабскрайб перенести в afterUpdate и проверку на ready там тож, чтоб один раз сработал
источник

КС

Кирилл Спасибович... in Svelte [svelt]
import { writable } from 'svelte/store';

export const promises = writable([]);
export const ready = writable(false);
let waitAll = new Promise((resolve) => {});

waitAll.then(done => ready.set(true));

// как подождать, пока все конструкторы компонентов добавят свои фетч промисы ?
promises.subscribe(v => {
 waitAll = Promise.all(v);
});
источник

КС

Кирилл Спасибович... in Svelte [svelt]
може вот так ?
источник

КС

Кирилл Спасибович... in Svelte [svelt]
че будет если я буду перезаписывать промис по мере поступления новых ?
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Вот твой вопрос - ответ afterUpdate в рут компоненте
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Он по идее должен вызваться когда все конструкторы вложенных компонентов тоже отработают
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Под конструктором я понимаю код script как он есть
источник

КС

Кирилл Спасибович... in Svelte [svelt]
я подумал и понял что это не вариант, т.к. некоторые компоненты с фетчами просто не будут созданы, пока юзер не потыкает туда сюда
а потом когда они создадутся - только тогда они запустят фетч, а это никак не фоновая загрузка
источник

КС

Кирилл Спасибович... in Svelte [svelt]
т.е. надо именно в контекст модуле грузить
источник

КС

Кирилл Спасибович... in Svelte [svelt]
потому что ему вроде бы пофиг создавался инстанс компонента или нет
источник

КС

Кирилл Спасибович... in Svelte [svelt]
а там где можно загрузить в момент создания инстанса можно и без этих всех фокусов прямо в компоненте зафетчить
источник

A

Alexander in Svelte [svelt]
забавно, забавно:
источник

A

Alexander in Svelte [svelt]
источник

A

Alexander in Svelte [svelt]
одинаконый функционал, в vue с лагом и cpu под 35% улетает, когда как в svelte всё норм
источник

КС

Кирилл Спасибович... in Svelte [svelt]
ну оно логично, vdom диффинг кайф
источник

A

Alexander in Svelte [svelt]
но там дифать-то два элемента по сути, наверняка оптимизировано
источник

КС

Кирилл Спасибович... in Svelte [svelt]
если там тоже на каждый апдейт чего-то постороннего всё дерево пересоздаётся как в реакте то ваще ниче удивительного
источник

КС

Кирилл Спасибович... in Svelte [svelt]
вот к примеру простой пример на реакте:

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

interface Client {
 id: number;
 last_name: string;
 first_name: string;
 second_name: string;
 email: string;
}

const useClients = () => {
 const [ clients, setClients ] = useState<Client[]>([]);

 useEffect(() => {
   fetch('/api/clients/')
     .then(res => res.json())
     .then(setClients);
 }, []);

 return [ clients, setClients ] as const;
}

interface ClientViewProps {
 c: Client;
 updater: (id: number) => void;
};

const ClientView = ({c, updater}: ClientViewProps) => {
 return (
   <tr className="client" onClick={() => updater(c.id)}>
     <td>{c.last_name}</td>
     <td>{c.first_name}</td>
     <td>{c.second_name}</td>
     <td>{c.email}</td>
   </tr>
 );
};

function App() {
 const [ clients, setClients ] = useClients();
 const updater = useCallback((id) => {
   const newClients = clients.map((c: Client) => {
     return c.id === id ? { ...c, first_name: c.first_name + 'add' } : c;
   });
   setClients(newClients);
 }, [ clients, setClients ]);
 return (
   <>
     <table>
       <thead>
         <tr>
           <th>Фамилия</th>
           <th>Имя</th>
           <th>Отчество</th>
           <th>Email</th>
         </tr>
       </thead>
       <tbody>
         {clients.map((c: Client) => (
           <ClientView
             c={c}
             updater={updater}
             key={c.id}
           />
         ))}
       </tbody>
     </table>
   </>
 );
}

export default App;


получается каждый раз когда меняется массив clients, он вынужден сделать новый хендлер, из-за нового хендлера создаётся вдом для всех компонентов массива clients, .т.к им пришёл "новый" "пропс" и он дифается со старым
useCallback, React.memo обёртка ниче не даёт т.к. всё равно нужно поменять везде хендлеры
хоть через контекст, хоть как угодно

получается чем больше держишь нод в экране, тем дороже каждое обновление
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Кирилл Спасибович
если там тоже на каждый апдейт чего-то постороннего всё дерево пересоздаётся как в реакте то ваще ниче удивительного
Во Vue vdom работает более оптимально, потому что он точно трекает изменения стейта
источник

PM

Pavel 🦇 Malyshev in Svelte [svelt]
Кирилл Спасибович
я подумал и понял что это не вариант, т.к. некоторые компоненты с фетчами просто не будут созданы, пока юзер не потыкает туда сюда
а потом когда они создадутся - только тогда они запустят фетч, а это никак не фоновая загрузка
Дык а как по-твоему произойдёт «юзер потыкает туда-сюда» на реакт серверных компонентах?
источник