Ответы пользователя по тегу React
  • Как задать тип функции принимающей промисы и возвращающей выполненые промисы?

    daniel_pr
    @daniel_pr
    Добавьте [].

    T extends Promise<any>[] | []

    Лучше передавать импорты через callback, чтобы они каждый раз не импортировались. Вот моя версия:

    import { DependencyList, useEffect, useRef } from "react";
    
    type Import = Promise<any>;
    
    type AwaitedImports<T extends Import[]> = { [P in keyof T]: Awaited<T[P]> };
    
    type Resolve<T extends Import[]> = (result: AwaitedImports<T>) => void;
    
    function useEffectWithImports<T extends Import[] | []>(
      resolve: Resolve<T>,
      imports: () => T,
      deps?: DependencyList
    ) {
      const resolveRef = useRef(resolve);
      const importsRef = useRef(imports);
      resolveRef.current = resolve;
      importsRef.current = imports;
    
      useEffect(() => {
        const promises = importsRef.current();
        Promise.all(promises)
          .then(resolveRef.current as Resolve<T>)
          .catch(console.error);
      }, deps);
    }
    
    useEffectWithImports(
      ([fs, path]) => {},
      () => [import("fs"), import("path")],
      []
    );
    Ответ написан
    1 комментарий
  • Как node/create-react-app подключает пакет npm sass?

    daniel_pr
    @daniel_pr
    Мне этого не нужно было делать, потому что я использовал create-react-app, в конфиге вебпака которого уже произведена настройка sass?

    Да.

    Если п1 верный, то как в таком случае это реализовано? Я ведь мог установить не sass, а node-sass или dart-sass или любую другую библиотеку?

    Примерно так:

    const fs = require("fs");
    
    function modulesHasOneOf(moduleNames) {
      return moduleNames.some(name => {
        const modulePath = require.resolve(name);
        return fs.existsSync(modulePath);
      });
    }
    
    const isSassInstalled = modulesHasOneOf(["sass", "dart-sass", "node-sass"]);
    
    const webpackConfig = {
      ...
      module: {
        rules: [
          {
             test: isSassInstalled ? /\.scss$/ : /\.css$/,
             use: ["css-loader", isSassInstalled && "sass-loader"].filter(Boolean)
          }
        ]
      }
    };


    UPD:
    Все оказалось проще:

    const config = {
        module: {
          rules: [
            {
              test: /\.css$/,
              use: ["css-loader"]
            },
            {
              test: /\.s(a|c)ss$/,
              use: ["css-loader", "sass-loader"]
            }
          ]
        }
      };

    И уже в зависимости от расширения файла выбирает то или иное правило. Главное, да, просто поставить пакет (dart-,node-)sass.

    https://github.com/facebook/create-react-app/blob/...
    Ответ написан
    4 комментария
  • Как использовать провайдер контекста с отслеживанием состояния для фильтрации элементов?

    daniel_pr
    @daniel_pr
    Вы неправильно используете контекст.
    https://reactjs.org/docs/context.html

    Вы должны обернуть в провайдер те компоненты, которые будут использовать ваш контекст, то есть
    const Context = createContext();
    
    function ContextProvider({ children }) {
      const [active, setActive] = useState(false);
      return <Context.Provider value={{ active, setActive }} >{children}</Context.Provder>
    }
    
    function App() {
      return (
        <ContextProvider>
           <MyComponent />
        </ContextProvider>
      )
    }
    
    function MyComponent() {
      const { active, setActive } = useContext(Context);
      ...
    }
    Ответ написан
    1 комментарий