Ответы пользователя по тегу React
  • Почему не обновляется компонента при изменении props React?

    @dimoff66
    Кратко о себе: Я есть
    Потому что вы меняете count, но сам элемент заказа не спредите, ссылка остается той же и реакт думает что ничего не изменилось

    Вместо
    order[index].count = blablabla

    напишите
    order[index] = {...order[index], count: blablabla }
    Ответ написан
    1 комментарий
  • Как проверить redux через jest?

    @dimoff66
    Кратко о себе: Я есть
    const store = Redux.createStore(yourReducer)
    store.dispatch(AuthMethod(login, password))
    const value = store.getState().someKey // вместо someKey нужный вам ключ


    И дальше сравниваете value с ожидаемым значением
    Ответ написан
  • Как вывести N экземпляров компонента?

    @dimoff66
    Кратко о себе: Я есть
    Самый короткий синтаксис такой

    const length= 5; // передается в props
    Array.from({ length }, (_, index) => <MyComponent key={`_${index}`} /> );


    но вообще достаточно создать один раз функцию в каком-нибудь utils и использовать ее или использовать range из библиотеки lodash
    Ответ написан
    Комментировать
  • React: почему импортированная переменная в хуке useCallback не определена?

    @dimoff66
    Кратко о себе: Я есть
    это просто импорт, в чем смысл его перезаписывать, он содержит в себе значение из файла. Создайте другую переменную, инициируйте ее значением myModule и перезаписывайте ее сколько влезет.

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

    @dimoff66
    Кратко о себе: Я есть
    1) Как работает updateDataset ? Что она меняет, если она не меняет состояние? Она вызывает свойства chartInstance, но я не вижу, где этот объект у вас используется?

    2) Логика React такова что все сообщение от родителя к детям идет исключительно через props-ы, поэтому по хорошему если вы что-то хотите поменять в дочернем элементе, вы должны изменить state родителя так, чтобы в дочерний элемент передались нужные пропсы, которые обрабатывались бы в дочернем элементе. Например в родительском рисуете элемент так

    <Chart updateData={ [datasetIndex, newLabels, newData] }/>


    а в Chart обрабатываете

    if (props.updateData) updateDataset(...props.updateData)


    Такой подход будет соответствовать принципам реакт.

    3) Если все же хотите сделать по своему, то просто передайте в Chart функцию установки значения

    let updateDataHandler = {}
    return <Chart updateDataHandler={ h => { updateDataHandler = h } }/>


    а внутри Chart напишите
    props.updateDataHandler(updateDataset)

    теперь в родительском компоненте updateDataHandler будет ссылаться на функцию Chart И вы можете ее спокойно вызывать
    Ответ написан
  • Компонент React Select (Creatable). Как сделать так, чтобы при клике не открывался выпадающий список?

    @dimoff66
    Кратко о себе: Я есть
    Это не сложный вопрос, просто всегда в таких случаях лезьте на api страницу с описанием props-ов
    https://react-select.com/props#select-props

    Там вы найдете свойство openMenuOnClick, которое отвечает за упомянутое вами поведение.
    Ответ написан
    3 комментария
  • Как создать Route с путём, зависящем от просов переданных в компонент роута?

    @dimoff66
    Кратко о себе: Я есть
    Внутри компонента читаете пропсы и делаете редирект например через window. location
    Ответ написан
    Комментировать
  • Как в React лучше делать функционал, общий для компонентов страниц?

    @dimoff66
    Кратко о себе: Я есть
    В данном случае нет никакого смысла, проще функции редиректа объявить в отдельном файле и вызывать с передачей props. Все же постепенно разработка переходит на хуки, то есть на чистые функции без классов.

    componentDidMount() {
      redirectIfNotLoggedIn(props);
      redirectIfNoAdministratorPrivileges(props);
    }
    Ответ написан
    1 комментарий
  • Ошибка при маршрутизации?

    @dimoff66
    Кратко о себе: Я есть
    Перевод: вместо валидного jsx вы где-то вернули обычный объект. Строка где вы это сделали указана - div (at link.js:7) Поставьте точку останова в этом месте и посмотрите что у вас туда возвращается.
    Ответ написан
  • Что не стоит хранить в store redux?

    @dimoff66
    Кратко о себе: Я есть
    Если данные используются только компонентом и только на время его жизненного цикла тогда стейт, в прочих случаях хранилище, как явствует из самого названия - туда кладём то что нуждается в хранении.
    Ответ написан
    6 комментариев
  • Как передать родительский метод в дочерний?

    @dimoff66
    Кратко о себе: Я есть
    В этом месте в компоненте CardList обрывается передача handler-а

    {props.cards.map(card => <CardStructure {...card} />)}


    Нужно в CarfStructure передать handler из props
    Ответ написан
    Комментировать
  • React и Vue. Что желательно знать?

    @dimoff66
    Кратко о себе: Я есть
    С моей точки зрения React + redux + какие-нибудь примочки для упрощения css - например sass, css--modules, styled components . Всё остальное не принципиально. Из роуд-мапа 30% я вообще не слышал, еще 50% слышал но не пользовался. Тем не менее замечательно профессионально работаю.

    UPD Что я использую
    1) Понятно что основы: js(esma) + css + html
    2) React + redux
    3) React hooks (небольшая библитека для превращения простых функций в полноценный реакт компонент с состоянием и событиями, для начала достаточно посмотреть несколько примеров по useState и UseEffect, а потом по мере необходимости углубляться.
    4) Менеджер пакетов npm - Там нечего знать, просто несколько основных команд
    5) Для CSS - css-modules (учить там нечего, в современных сборках create-react-app идет из коробки) и SASS, тут стоит потратить полдня почитать документацию, для маленьких и средних проектов или проектов с небольшим количеством элементов на странице смысла особого использовать может нет, css-modules более чем выполняет задачу, но для больших проектов может быть очень полезен
    6) Сборщик: WebPack - никогда сам не настраивал. Читал, вроде ничего сложного.
    7) ReactRouter - необходимая вещь, хотя в последнее время я смотрю в сторону Hookrouter, более простая и приятная штука
    8) Тестирование jest, enzyme - Их невозможно выучить, приходит только с опытом. Тестирование это вообще отдельное искусство и требует отдельной конфигурации головного мозга. Я бы вообще тесты сажал писать отдельного человека, когда их пишут сами разработчики в 80% случаев они делают это на отвали.
    9) Библиотека функций Lodash - куча полезных функций, упрощающих работу с кодом для массивов, объектов, строк и т.д.
    10) Библиотека moment - приходит с опытом. Недостаточно ее просто прочитать, много подводных камней, особенно с временными зонами, которые понимаешь только понаступав на грабли.
    Ответ написан
  • Как сгенерировать событие onMouseLeave в React?

    @dimoff66
    Кратко о себе: Я есть
    Как вариант:

    1. Добавьте div-у событие onMouseMove, в нем запоминайте координаты мышки
    onMouseMove={e => { this.mouse = { clientX: e.clientX, clientY: e.clientY }} }


    2. В процедуре close Проверяйте координаты и вызывайте disable в случае выхода за них

    const rect = document.querySelector('.Message').getBoundingClientRect()
    if (this.mouse.clientX < rect.left || 
      this.mouse.clientX > rect.right || 
      this.mouse.clientY < rect.top ||
      this.mouse.clientY > rect.bottom) {
      this.disable()
    }


    Строка
    document.querySelector('.Message')

    просто для примера, искать по хорошему надо через ref

    https://codepen.io/dimoff66/pen/zYxBQvo?editors=0010
    Ответ написан
  • Что такое React Mock API? И как его использовать?

    @dimoff66
    Кратко о себе: Я есть
    Запрос к серверному api это асинхронные функции, которые посылают запрос и ждут ответа, соответственно вы можете подменить их на свои, например у вас есть объект с функциями серверного запроса

    const serverAPI = {
      getCategories: () => fetch('/categories'),
      getCategory: (id) => fetch('/categories/' + id)
    }


    И есть моковые запросы с теми же самыми ключами, что и serverAPI

    // Создадим базу данных
    const mockDB = {
      categories: [
        { id: 1, name: 'products'}, 
        { id: 2, name: 'services'}
      ]
    }
    
    const mockAPI = {
      getCategories: () => Promise.resolve(mockDB.categories),
      getCategory:  (id) => Promise.resolve(mockDB.categories.find(v => v.id === id)),
    }


    И создайте объект
    const currentAPI = serverAPI

    все запросы из кода делайте к currentAPI, переключать его с мокового на нормальный и наоборот можно
    Object.assign(currentAPI, mockAPI)
    Object.assign(currentAPI, serverAPI)


    Сохранять данные мокового DB можно в localStorage между сеансами. естественно это будет работать только локально
    Ответ написан
    Комментировать
  • Правильно ли реализовано тестирование?

    @dimoff66
    Кратко о себе: Я есть
    Как вариант

    import { createHashHistory } from 'history'
    import { createStore } from 'redux'
    import reducer from 'reducer'
    
    import { Provider } from 'react-redux'
    import { store } from 'store'
    
    const history = createHashHistory()
    const store = createStore(reducer(history))
    Ответ написан
    Комментировать
  • React + php, правильно ли я понял суть?

    @dimoff66
    Кратко о себе: Я есть
    По 0-2 выше ответили
    3. Нет, пользователь может посмотреть минифицированный файл и скорей всего понять из него не больше, чем вы поймете, открыв экзе файл в текстовом редакторе.
    Ответ написан
    Комментировать
  • Как отобразить данные JSON в react-native без списка?

    @dimoff66
    Кратко о себе: Я есть
    { cells.map((cell, cell_i) => {
      const cell_name = cell.name == '' ? 'Без ячейки' : cell.name;
      return <>
        <Text key={cell_i}>Ячейка {cell_name}</Text> 
        {cell.pallets.map(pallet => {...})} // троеточие замените на текст вывода
      </>
    })}
    Ответ написан
    Комментировать
  • React OnClick fun is udefined?

    @dimoff66
    Кратко о себе: Я есть
    Object.keys(manage.UserBy).map(function(key) {

    замените на стрелочную функцию, так как у обычных функций свой this, от личный от контекста, в котором они вызываются, потому и не работает.

    Object.keys(manage.UserBy).map(key => {

    PS Но по хорошему весь кусок я бы переписал так:

    {Object.entries(manage.UserBy).map(([key, value]) => 
      key == "id" 
       ? <button onClick={this.handleClick} >Удалить</button>  
       : <div>{`${value} ${manage.price}%`}</div> 
    )}
    Ответ написан
    3 комментария
  • Как в react передавать фокус от 1 инпута к другому?

    @dimoff66
    Кратко о себе: Я есть
    При рендеринге:
    <input 
      ref={someConditionIsTrue ? (input) => { this.focusedInput = input } : null} 
      ...        
    />


    и

    componentDidMount(){
      this.focusedInput && this.focusedInput.focus();
    }
    Ответ написан
    Комментировать
  • Как лучше организовать стейт каталога с раскрывающимися списками?

    @dimoff66
    Кратко о себе: Я есть
    1. Жестокий хардкодинг.

    subtopicList1: false,
    subtopicList2: false,


    Что там в пропущенных частях кода даже сложно представить. JSX тоже похоже выводится для каждой темы отдельно. Лучше все повторяющиеся части делать в цикле

    2. Вместо
    data-subtopic-list="subtopicList1"
     onClick={handleTopicClick}


    лучше просто написать
    onClick={e => { e.preventDefault(); handleTopicClick('subtopicList1'); }}

    и
    const handleTopicClick = subtopicList => {
      setSubtopicLists({
        ...subtopicLists,
        ...{ [subTopicList]: !subtopicLists[subTopicList] }
      });
    };
    Ответ написан
    7 комментариев