Ответы пользователя по тегу React
  • Как контролировать ввод в input?

    black1277
    @black1277
    Вольный стрелок
    примерно так
    if(name==='entity' && !value.match(/^\d+$/)) return // если имя равно entity и введены не только цифры - делаем возврат из ф-и (без изменения стейта)
    Ответ написан
  • Как поменять путь после сборки React build?

    black1277
    @black1277
    Вольный стрелок
    Перед сборкой проекта вам нужно установить переменную PUBLIC_URL. Варианты как это сделать можете подсмотреть тут или в документации React
    Ответ написан
    Комментировать
  • Почему создается вторая доска с именем undefined?

    black1277
    @black1277
    Вольный стрелок
    Отключите в React режим Strict-mode, а по ссылке в ответе почитайте, почему это так работает. Нормально ли это, что в режиме Strict-mode в React...
    Ответ написан
    Комментировать
  • Где изменять путь названия localhost:3000 react?

    black1277
    @black1277
    Вольный стрелок
    Вижу 2 варианта:
    1 сделать eject проекта(это необратимая операция) и залезть в настройки webpacka
    2 установить переменную PUBLIC_URL - варианты тут
    Ответ написан
    Комментировать
  • Нужно ли импортировать jquery в каждый файл react приложения?

    black1277
    @black1277
    Вольный стрелок
    Да нужно. Почитайте про модули и пространства имен. В финальном проекте jquery будет включен один раз(не бойтесь дублирования не будет).
    Ответ написан
    1 комментарий
  • В useState записывается предыдущее состояние?

    black1277
    @black1277
    Вольный стрелок
    Установка стейта происходит асинхронно - реакт гарантирует новое состояние к моменту рендера, а не когда вам вздумается. Т.е. он собирает все возможные изменения и применяет их пакетом, перед самым рендером. Это самая частая ошибка начинающих - установить новое состояние и тут же пытаться получить его.
    Ответ написан
  • Как сохранить select option в localstorage?

    black1277
    @black1277
    Вольный стрелок
    Чтобы при загрузке страницы был выбран сохраненный вариант из списка option, нужно чтобы у нужного варианта был атрибут selected. Пример:
    <select name="nm" id="nam">
      <option value="QBC">QBC</option>
      <option value="QEF">QEF</option>
      <option value="GHI" selected>GHI</option> <!-- этот вариант будет выбран-->
      <option value="KLM">KLM</option>
    </select>

    значит вам нужно в каждом option выводить переменную вместо selected, которая будет либо пустая, либо равна selected (если сохраненное состояние равно выводимому option).
    Добавил рабочий пример, где всё работает (проверял)
    Пример на функциональных компонентах

    import React, { useState, useEffect } from 'react'
    
    const LocalStorage = () => {
      const date = [
        { symbol: 'RU', label: 'рубль' },
        { symbol: 'USD', label: 'доллар' },
        { symbol: 'EUR', label: 'евро' }
      ]
    
      const [curr, setCurrencies] = useState(date)
      const [currentSymbol, setCurrentSymbol] = useState("EUR") // опция выбранная по умолчанию (если нет данных в localstorage)
    
    // срабатывает один раз при загрузке компонента
      useEffect(() => {
        if(localStorage.getItem('symbol')) {
          const item = localStorage.getItem('symbol')
          setCurrentSymbol(item)
        }
      }, [])
    
    // обработчик - срабатывает при выборе опции списка
      const selectHandler = (e) => {
        localStorage.setItem('symbol', e.target.value)
        setCurrentSymbol(e.target.value)
      }
    
      return (
        <div>
          <select onChange={selectHandler} value={currentSymbol}>
            {
              curr.map(currencies => (
                <option key={currencies.symbol} value={currencies.symbol}>
                  {currencies.symbol} {currencies.label}
                </option>
              )
              )
            }
          </select>
        </div>
      )
    }
    
    export default LocalStorage


    на классовых

    import React, { Component } from 'react'
    
    
    class ClassLocal extends Component {
      constructor(props){
        super(props);
        this.state = {
          curr: [
            { symbol: "RU", label: "рубль" },
            { symbol: "USD", label: "доллар" },
            { symbol: "EUR", label: "евро" }
          ],
          currentSymbol: "EUR"
        }
      }
    
    
      componentDidMount() {
        if(localStorage.getItem('symbol')) {
          const item = localStorage.getItem('symbol');
          this.setState({currentSymbol: item})
        }
      }
    
    
      selectHandler = (e) => {
        localStorage.setItem('symbol', e.target.value)
        this.setState({currentSymbol: e.target.value})
      }
    
      render() {
        return (
          <div>
            <select onChange={this.selectHandler} value={this.state.currentSymbol}>
              {
                this.state.curr.map(currencies => (
                    <option key={currencies.symbol} value={currencies.symbol}>
                      {currencies.symbol} {currencies.label}
                    </option>
                  )
                )
              }
            </select>
          </div>
        )
      }
    }
    
    export default ClassLocal

    Ответ написан
    7 комментариев
  • Событие onClick в React вызывает ошибку. Как чинить?

    black1277
    @black1277
    Вольный стрелок
    Ты делаешь условие
    if(IsMusicListShowing == 0)
    и в одной ветке делаешь return, а в другой просто пишешь
    <div>
                <MusicLineInSiteMusic onClick={UnshowMusicList}></MusicLineInSiteMusic>
                <MusicList MusicLinesInMusicList={MusicLinesInMusicList}></MusicList>
            </div>

    а должно через return возвращать, о чем тебе и сообщает ошибка.
    Ответ написан
    1 комментарий
  • Не могу подключить useState к react. Что делать?

    black1277
    @black1277
    Вольный стрелок
    Замените эту строку
    import React, { useEffect, useState } from 'react';

    на эту
    const { useEffect, useState } = React
    Ответ написан
    8 комментариев
  • Нормально ли это, что в режиме Strict-mode в React-приложении делается 2 запроса?

    black1277
    @black1277
    Вольный стрелок
    Реакт придерживается концепции "чистых" функций. Т.е. таких функций, которые всегда дают одинаковый, предсказуемый результат при одинаковых входных параметрах. В режиме разработки, с включенным strict-mode реакт помогает выявить непредвиденные эффекты и состояния, возникающие в результате нарушения концепции, вызывая дважды все функции, которые он считает "чистыми". Как это работает?
    Предположим, вы написали функцию, которая по сигналу "свет" - включает свет. Но если свет уже включен - функция его выключает. Вы довольны и счастливы - послали сигнал "свет" - свет включился, послали еще один сигнал "свет" - выключился. Но в режиме strict-mode - вы обнаружите, что свет не включается, потому что реакт шлет второй сигнал "свет", который выключает после первого сигнала! И опять, возникает вопрос - да зачем это нужно? А затем, что вы не можете предсказать результат действия сигнала "свет", не зная текущего состояния! Возникнет острая необходимость - включить свет, а вы не знаете - включен он сейчас или нет... Пошлете сигнал "свет", когда он включен - получите выключение.
    Примерно такие варианты поведения выявляет strict-mode.
    Ответ написан
    Комментировать
  • Отмена axios запроса в redux thunk?

    black1277
    @black1277
    Вольный стрелок
    Используйте AbortController для отмены запроса.
    Вот здесь на русском https://learn.javascript.ru/fetch-abort рассказано как его применять к fetch (для понимания), а вот тут https://axios-http.com/docs/cancellation как его использовать для axios. Ну и в редаксе добавите нужный action.
    Ответ написан
    Комментировать
  • Как грамотно реализовать работу с AuthToken?

    black1277
    @black1277
    Вольный стрелок
    Рекомендую посмотреть вот эти ролики, очень подробно всё изложено:
    Простая авторизация на NODE JS и
    Продвинутая JWT авторизация на React и Node js
    Ответ написан
    Комментировать
  • Почему не применяются стили в jsx?

    black1277
    @black1277
    Вольный стрелок
    Добавьте в .title стиль свойство display:inline-block
    Ответ написан
    Комментировать
  • Нужны ли классовые компоненты в React в 2022?

    black1277
    @black1277
    Вольный стрелок
    Нужно учить, и даже иногда использовать. К примеру Error Boundary довольно часто используется (не знаю в 18-й версии реакта сделали ему уже аналог или нет.) Кроме того множество старых проектов сделано на классовых - может потребоваться модернизировать или переписывать на функциональные.
    Ответ написан
    5 комментариев
  • Как отменить переход по ссылке?

    black1277
    @black1277
    Вольный стрелок
    Попробуй так
    <button
                style={{backgroundColor: `${color}`}}
                onClick={ (e):void => { e.preventDefault(); indexisbtnActive() } }
                className={styles.hero__add}>
                <img src={imgBtn}/>
                {btnText}
              </button>

    нужно остановить всплытие события, чтобы оно до Link не доходило.
    Ответ написан
    2 комментария
  • Почему не отображается компонент через map()?

    black1277
    @black1277
    Вольный стрелок
    Добавьте экспорт в файл store
    export const store =[
    Исправьте импорт в index.js
    import {store} from './store';
    и добавьте key в App.js когда проходите map-ом
    const questinsArray = props.store.map(store=> (
        <FientQuest
          key={store.quest}
          qmumb = {store.qmumb}
          quest = {store.quest}
    //...
    Ответ написан
    Комментировать
  • Почему так работает?

    black1277
    @black1277
    Вольный стрелок
    Потому что useAction() возвращает не ту же самую функцию, а функцию забинденную на dispatch и выглядит это примерно вот так:
    function bindActionCreator(actionCreator, dispatch) {
      return function () {
        return dispatch(actionCreator.apply(this, arguments));
      };
    }

    то есть по ключу fetchTodos лежит уже вызванная функция bindActionCreator(fetchTodos, dispatch) , и вызывая fetchTodos вы по сути вызываете вот этот участок:
    function () {
        return dispatch(actionCreator.apply(this, arguments));
      };

    надеюсь, понятно объяснил. Но лучше вывести самому в консоль лог и изучить.
    Ответ написан
    1 комментарий
  • Бесконечный цикл useEffect?

    black1277
    @black1277
    Вольный стрелок
    Всё от того, что вы не желаете знать про жизненный цикл компонентов. Разберем по порядку, что происходит.
    1 компонент смонтировался
    2 срабатывает useEffect - он всегда срабатывает после того как готово DOM дерево.
    3 в useEffect срабатывает useState
    4 изменение состояния обязывает реакт сделать ререндер
    5 тут ключевой момент, компонент уже был смонтирован, поэтому происходит только его обновление - и вот тут useEffect ведет себя по разному. Если у него нет массива зависимостей - то он опять сработает и всё будет повторятся с 3-го пункта. Если же у него есть массив зависимостей - то он сработает только если после рендера обновления изменилось значение в этом массиве.
    Значит вам нужно как минимум указать newSendedMessage в этом массиве. НО! У вас есть и другая функция, которая изменяет стейт - sortMessages. Её тоже нужно указать в массиве зависимостей, если не хотите пропускать обновление при изменении receivedMsg. Но если просто поместить эту ф-ю в массив зависимостей - то опять получите бесконечный перерендер - потому что ф-я каждый раз будет разная (она пересоздается каждый раз во время обновления). Есть разные варианты как это исправить - или завернуть sortMessages в useCallback (у которого должен быть массив зависимостей с receivedMsg) или перенести саму ф-ю sortMessages внутрь useEffect и вызывать там. Тут вам решать какой вариант подходит логике вашего компонента больше.
    Ответ написан
    1 комментарий