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

    TMProject
    @TMProject
    Frontend developer React/Redux
    Сделай отдельно кастомный хук, который будет принимать реф на элемент и возвращать true/false.

    useScroll.ts
    import React, { useLayoutEffect, useState} from 'react'; 
    
     export const useScroll = ( ref ) => { 
         const [ scroll, setScroll ] = useState(false); 
         const updateScroll      = () => {
                If (!ref.current) return
    
                let isScroll = false
                const heightTop: number = window.scrollY
    
                if(ref.current.offsetHeight < heightTop) 
                isScroll = true
           
    
                if(heightHeaderRef.current.offsetHeight > heightTop)
                isScroll = false
    
                setScroll(isScroll)
    }
      
         useLayoutEffect( () => { 
             window.addEventListener('scroll',updateScroll)
             updateScroll(); 
             return () => {
                   window.removeEventListener('scroll',updateScroll)
             } 
         }, [] ); 
         return scroll; 
     }


    И теперь в компоненте

    const Header = () => {
        const heightHeaderRef = useRef<HTMLDivElement | null>(null)
        const scroll = useScroll<boolean>(heightHeaderRef)
    
        console.log(scroll)
      return (
        <header className={`${background} sticky top-0 left-0`} ref={heightHeaderRef}>
            <div className={`${container} ${scroll ? 'py-2' : 'py-6'} duration-300`}>
                <div className={'flex justify-between items-center'}>
    
                    <div className={'flex'}>
                        <NavLink to={''} className={'text-xl text-white mr-6'}>ГЛАВНАЯ</NavLink>
                        <NavLink to={'/about'} className={'text-xl text-white mr-6'}>О НАС</NavLink>
                        <NavLink to={'/crm'} className={'text-xl text-white mr-6'}>CRM</NavLink>
                        <NavLink to={'/licenses'} className={'text-xl text-white mr-6'}>ЛИЦЕНЗИИ</NavLink>
                        <NavLink to={'/blog'} className={'text-xl text-white mr-6'}>БЛОГ</NavLink>
                        <NavLink to={'/faq'} className={'text-xl text-white'}>FAQ</NavLink>
                    </div>
    
                    <div>
                        <a className={'text-white text-center block text-2xl'} href="tel::+7(385) 299-20-21">+7(385) 299-20-21</a>
                        <div className={'text-white text-center block text-xs'}>ЗВОНОК ПО РОССИИ БЕСПЛАТНЫЙ</div>
                    </div>
                </div>
            </div>
        </header>
      )
    }
    
    export default Header


    Могу где-то ошибиться, пишу с мобилы
    Ответ написан
  • Почему происходит рендер не ожидая ответа от сервера?

    TMProject
    @TMProject
    Frontend developer React/Redux
    У тебя в newsReducer и в newReducer используются одни и те же action.type, у тебя два ведь два разных стейта поэтому и разные должны быть типы экшенов. Например
    export const newsReducer = (state = initialState, action:DataAction): DataState =>{
        switch (action.type){
            case DataActionTypes.FETCH_DATA_NEWS:
                return {loading:true, error:null, data: []};
            case DataActionTypes.FETCH_DATA_NEWS_SUCCESS:
                return {loading:false, error:null, data: action.payload};
            case DataActionTypes.FETCH_DATA_NEWS_ERROR:
                return {loading:false, error:action.payload, data: []};  
    
            default:
                return state
        }
    
    }
    
    export const newReducer = (state = initialStateNew, action:DataActionNew): DataStateNew =>{
        switch (action.type){
            case DataActionTypes.FETCH_DATA_NEW:
                return {loading:true, error:null, data: []};
            case DataActionTypes.FETCH_DATA_NEW_SUCCESS:
                return {loading:false, error:null, data: action.payload};
            case DataActionTypes.FETCH_DATA_NEW_ERROR:
                return {loading:false, error:action.payload, data: []};  
    
            default:
                return state
        }
    
    }

    Далее соответственно эти типы нужно использовать при диспатче
    Ответ написан
  • В чем проблема, при попытке удалить компонент?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Что находится в стейте components? Изначально там пустой массив. Что ты туда заносишь?

    Во-первых,
    onclick должен вызывать функцию с передачей item, в твоём случае передается контекст img.

    Во-вторых,
    removeThisComponent={removeComponent}
    это вообще зачем?
    Зачем передавать в компонент функцию для удаления, если нужно передать item. И этот item дальше использовать в onclick.

    Encountered two children with the same key, `null`. Keys should be unique so that components maintain their identity across updates. Non-unique keys may cause children to be duplicated and/or omitted — the behavior is unsupported and could change in a future version.

    Это говорит о том, что используется не уникальные, в пределах итерации key
    Ответ написан
    3 комментария
  • Можно ли в пропсах указать длину элементов?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Передай в пропсы количество и циклом сгенерируй это нужное количество
    Ответ написан
    Комментировать
  • Как лучше скрыть элемент в react?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Я предпочел бы 2 вариант.
    только единственное, что бы сделал это отдельный хук, который бы возвращал ширину экрана и использовал бы в компоненте. Передача пропсом здесь не нужна.
    Если сравнивать с css вариантом, то тут выгода на лицо, меньше медиа запросов и логика компонента упакована в одном месте. Например компонент делает какие-то вычисления, то смысл их делать если ширина экрана не та, следовательно нужно меньше ресурсов на рендер.
    Ответ написан
    6 комментариев
  • Как отследить клики по модальному окну на React?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Повесить слушатель событий на корневой элемент модальных окон или же на весь документ (смотря какая структура) и при клике проверять был ли этот клик на нужный элемент или нет. Если да то изменять Стейт/контекст/стор
    Ответ написан
    Комментировать
  • Как сделать стейт лайка?

    TMProject
    @TMProject
    Frontend developer React/Redux
    Во первых, тебе нужен Стейт не булевный, а массив.
    При клике на лайк заноси или убирай из массива индекс айтема.
    Во вторых, при итерации массива айтемов проверяй есть ли в стейте нужный индекс. Это и будет условие для смены картинки.
    В третьих, при условии не обязательно менять элемент, достаточно изменять путь к картинке.
    Ответ написан
    Комментировать