Ответы пользователя по тегу React
  • Node js nmp start почему не запускается?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Установите Node.js версии 10.15.3 LTS
    Ответ написан
    Комментировать
  • Как обернуть setState в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вариант 1:
    class Example extends React.Component {
      state = { data: [] };
    
      controller = new AbortController();
     
     componentDidMount() {
        fetch('/url', {
          signal: this.controller.signal,
        })
        .then(res => res.json())
        .then(data => this.setState({ data }));
      }
      
      componentWillUnmount() {
        this.controller.abort();
      }
      
      render(){
        return ( /* ... */ );
      }
    }

    Если используете axios: Cancellation

    Вариант 2:
    Использовать Redux и делать запросы в асинхронных действиях, обновляя по возвращению ответа store.
    Ответ написан
  • Почему jQuery не находит елемент в componentDidMount()?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Почему jQuery не находит елемент в componentDidMount()

    Потому что в момент вызова вы показываете Preloader или null.

    Не стоит использовать JQuery в React разработке.
    Ответ написан
    1 комментарий
  • Реализация ПРОСТОЙ токен авторизации между Flask и React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Так вот, будут ли ПРОСТЫЕ примеры реализации токен авторизации между этими двумя фреймворками?

    Проще некуда:

    import React from 'react';
    import Cookie from 'js-cookie';
    
    class SimpleExample extends React.Component {
      state = {
        isProcessing: false,
        token: Cookie.get('token'),
        data: null,
      };
      
      handleSignIn = () => {
        this.setState({ isProcessing: true });
    
        fetch('/singin', { 
          method: 'POST',
          data: JSON.stringify({ login: 'admin', pass: 'zx23ww' }),
        })
        .then(res => res.json())
        .then(data => {
          this.setState({
            isProcessing: false,
            token: data.token,
          });
            
          Cookie.set('token', token);
        });
      };
      
      handleLogout = () => {
        Cookie.erase('token');
        this.setState({ token: null });
      };
    
      handleGetProtectedData = () => {
        fetch('/protected'{
          method: 'GET',
          headers: {
            Authorization: `Bearer ${this.state.token}`,
          },
        })
        .then(res => res.json())
        .then(data => {
          this.setState({ data });
        });
      };
    
      render() {
        const { isProcessing, token } = this.state;
        
        if (isProcessing) return <div>...initialization</div>;
    
        const isSignedIn = !!token;
    
        return isSignedIn ? (
          <div>
            <h1>You're signed in</h1>
            <button onClick={this.handleLogout}>Logout</button>
            <button onClick={this.handleGetProtectedData}>Get protected data</button>
          </div>
        ) : (
          <div>
            <h1>You're not signed in</h1>
            <button onClick={this.handleSignIn}>Sign in</button>
          </div>
        );
      }
    }
    Ответ написан
    Комментировать
  • Как динамически задавать state?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    setVal = (propName, value) => {
      this.setState(state => ({
        formInfo: {
          ...state.formInfo,
          [propName]: value,
        }
      }));
    };

    Так же переименовал getval в setVal. Так как глагол get используют в функциях возвращающих значение, а set в устанавливающих значение.
    Ответ написан
    2 комментария
  • Vue slot это аналог react portal?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Нет
    Ответ написан
    Комментировать
  • Почему не запускается проект на React.JS?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Установите LTS версию Node.js - 10.15
    Ответ написан
    Комментировать
  • Как при клике на название задачи перейти на страницу задачи в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Вам надо в элементах списка рендерить ссылку роутера с параметром, по которому будет осуществляться поиск по json. Например:
    <Link to={`/tasks/${item.id}`}>Open</Link>

    2. Далее надо добавить Route для детализации:
    <Route exact path="tasks/:id" component={TaskDetails} />


    3. В компоненте TaskDetails получаем нужную задачу с помощью параметра перехваченного роутером:
    import React from 'react';
    import tasks from '../data/tasks';
    
    const TaskDetails = ({ match }) => {
      const { id } = match.params;
      const task = tasks.find(item => item.id === id);
    
      return ( /* ... */ );
    }
    
    export default TaskDetails;
    Ответ написан
    Комментировать
  • Импорт переменных React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. У вас не "React просто не видит переменную $", а выпадает исключение ESLint.

    2. Модули следует экспортировать и импортировать в явном виде:

    param.js
    export default selector => document.querySelector(selector);


    Nav_btn.js
    import React, { Component } from 'react';
    import $ from './param';
    
    import './style.css';
    
    
    // ...


    3. Подобные подходы в React разработке не используют. Советую изучить возможности библиотеки и решать подобные задачи средствами React.

    Простой пример:
    const Example = () => {
      const [isActive, setIsActive] = useState(false);
      const handleClick = () => {
        setIsActive(!isActive);
      };
    
      return (
        <div>
          <div className={isActive ? 'active' : ''}>Example</div>
          <button onClick={handleClick}>Toggle active</button>
        </div>
      );
    };
    Ответ написан
  • Как подключить yandex map в react компоненту?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Можно использовать специальный компонент.
    <Script src={src} onLoad={onLoad} />

    Пример реализации
    import React from 'react';
    
    class Script extends React.Component {
    
      static displayName = 'Script';
    
      static scriptObservers = {};
    
      static loadedScripts = {};
    
      static erroredScripts = {};
    
      static idCount = 0;
    
      scriptLoaderId = `id${this.constructor['idCount']++}`;
    
      componentDidMount() {
        const { onError, onLoad, src } = this.props;
    
        if (this.constructor.loadedScripts[src]) {
          if (onLoad) onLoad();
          return;
        }
    
        if (this.constructor.erroredScripts[src]) {
          if (onError) onError();
          return;
        }
    
        if (this.constructor.scriptObservers[src]) {
          this.constructor.scriptObservers[src][this.scriptLoaderId] = this.props;
          return;
        }
    
        this.constructor.scriptObservers[src] = { [this.scriptLoaderId]: this.props };
    
        this.createScript();
      }
    
      createScript() {
        const { onCreate, src, attributes } = this.props;
        const script = document.createElement('script');
    
        if (onCreate) {
          onCreate();
        }
    
        if (attributes) {
          Object.keys(attributes).forEach(prop => script.setAttribute(prop, attributes[prop]));
        }
    
        script.src = src;
    
        if (!script.hasAttribute('async')) {
          script.async = true;
        }
    
        const callObserverFuncAndRemoveObserver = (shouldRemoveObserver) => {
          const observers = this.constructor.scriptObservers[src];
          Object.keys(observers).forEach((key) => {
            if (shouldRemoveObserver(observers[key])) {
              delete observers[this.scriptLoaderId];
            }
          });
        };
    
        script.onload = () => {
          this.constructor.loadedScripts[src] = true;
          callObserverFuncAndRemoveObserver((observer) => {
            if (observer.onLoad) observer.onLoad();
            return true;
          });
        };
    
        script.onerror = () => {
          this.constructor.erroredScripts[src] = true;
          callObserverFuncAndRemoveObserver((observer) => {
            if (observer.onError) observer.onError();
            return true;
          });
        };
    
        document.body.appendChild(script);
      }
    
      componentWillUnmount() {
        const { src } = this.props;
        const observers = this.constructor.scriptObservers[src];
    
        if (observers) {
          delete observers[this.scriptLoaderId];
        }
      }
    
      render() {
        return null;
      }
    }
    
    export default Script;
    Ответ написан
  • Как отследить изменение state?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Лучше вообще не хранить результирующие поля, а считать значения по факту.
    Ответ написан
  • Как сделать правильно Route для id и new?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    <Switch>
      <Route exact path={`${match.url}/`} component={List} />
      <Route exact path={`${match.url}/new`} component={New} />
      <Route exact path={`${match.url}/:id`} component={View} />
    </Switch>
    Ответ написан
    3 комментария
  • Как правильнее получить данные с нескольких endpoint-ов?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Данные пользователя, по-хорошему, запрашивать в экшене инициализации приложения, а загрузку товаров инициировать в cdm страницы товаров.
    Ответ написан
    Комментировать
  • Авторизация react router приватными роутами?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Приватные роуты будут гораздо удобней когда маршрутов в вашем приложении будет больше двух.
    Ответ написан
    Комментировать
  • Как вывести в компонент другие компоненты, переданные как prop?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вы передаете в рендер функцию компонента вместо того чтобы его отрисовывать.
    Проблему исправит:
    const { header: Header, footer: Footer } = this.props;
    
    return (
      <Fragment>
        <Header />
        <Footer />
      </Fragment>
    );


    Но советую вам спроектировать этот участок иначе. Со стороны не видно никакого смысла в передаче Header и Footer в виде свойств. Их лучше импортировать в файле компонента Layout.
    Ответ написан
    Комментировать
  • Как подменить обработчик событий при наследовании в React?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Просто передавайте данные и обработчик в компонент в виде свойств:
    <DropDown onClickHandler={yourHandler} data={yourData} />

    class Dropdown extends React.component {  
      render() {
        const { data, onClickHandler } = this.props;
    
        return (
          <ul>
            {data.map((number, i) => 
              <li key={i} onClick={onClickHandler}>{number}</li>
            )}
          </ul>
        )}
    }
    Ответ написан
  • Как обновлять данных в React приложении без пересборки?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    1. Написать скрипт для деплоя приложения. json оставить в сборке. Деплоить изменения одной командой в консоли.
    2. Обновлять данные скриптом через ssh соединение. json вынести.
    3. Написать простенькую админку и обновлять данные через нее. json вынести.
    Ответ написан
    1 комментарий
  • Как переделать компонент Search в semantic-ui-react на Redux?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Вам надо в колбеке onSearchChange менять состояние фильтра. А хранить фильтр можно хоть в состоянии компонента. Пример:
    handleSearchChange = (e, { value }) => {
      this.setState({ filter: value });
    };

    Массив results, в вашем случае, будет содержать полученные из хранилища и обработанные фильтром данные.
    const results = data.filter(item => item.title.toLowerCase().includes(filter.toLowerCase()));
    Ответ написан
    4 комментария
  • Почему не работает анимация?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Анимация детей TransitionGroup срабатывает только для элементов добавленных или удаленных после монтирования TransitionGroup.

    TransitionGroup is a state machine for managing the mounting and unmounting of components over time.


    Посмотрите пример из официальной документации.
    Ответ написан
  • Какая разница между подключения реакт через консоль и по ссылке?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Ваш вопрос к самому React прямого отношения не имеет. Вопрос скорей о типах модулей и способах их использования. По ссылке вы подключаете UMD модуль, и React будет доступен как глобальный объект React или window.React. Работать с таким модулем можно хоть из тега script в html файле:
    <script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
    <script>
      function Greetings(props) {
        return React.createElement('div', null, 'Hello, World!');
      }
    </script>

    Когда же вы устанавливаете React как npm пакет. В папку node_modules устанавливается 5 версий модуля React:
    2 версии CommonJS модулей: production и development и 3 версии UMD: production, development и prоfiling.
    Сам пакет по-умолчанию экспортирует CommonJS модуль. Версия экспортируется в зависимости от переменной окружения process.env.NODE_ENV:
    'use strict';
    
    if (process.env.NODE_ENV === 'production') {
      module.exports = require('./cjs/react.production.min.js');
    } else {
      module.exports = require('./cjs/react.development.js');
    }

    Вы используете именно CommonJS модуль, когда пишите в коде импорт из корня пакета:
    import React from 'react';
    Как правило, современной frontend разработке используется модульная система ES6, экспериментальный синтаксис и такой код требует трансляции в кроссбраузерный код и сборки. Стандартом на этом поприще сейчас являются babel и webpack.

    Советую почитать эту статью от Yandex об эволюции модульных систем JavaScript.
    Ответ написан
    2 комментария