• Отлов изменения дочернего компонента?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Храните состояние в родительском компоненте и передавайте методы в пропсах дочернему.

    class Parent extends React.Component {
    
        constructor(props) {
            super(props)
            this.testInputValue = ''
        }
    
        handleChange(event) {
            this.testInputValue = event.target.value
        }
    
        log_test_input_value = () => {
            console.log(this.testInputValue);
        }
    
        render() {
            return (
                 <div>
                  <button onClick={log_test_input_value}>Test log</button>
                  <Child onChange={ this.handleChange }/>
                </div>
            )
        }
    }
    Ответ написан
  • Что делать с сообщениями в чате, которых уже не видно?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Здравствуйте.
    Самый простой способ реализации сообщений - через массив. Если ваш подход именно таков, то вы можете просто ограничить длинную массива, например при получении нового сообщения приложением, оно проверяет длину истории сообщений и удаляет лишние, в зависимости от метода добавления(array.splice()).

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

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    https://developer.mozilla.org/ru/docs/Web/API/Canv...
    https://github.com/mdn/dom-examples/blob/master/ca...

    Тонкий намек на возможное решение.
    Самым сложным будет палитру прописывать + разлиновать исходник.
    На примере: верхняя сторона - красный цвет, левая - зеленый, правая - синий.
    У нас есть область замены - 3 штуки. Каждая из областей находит определенный цвет и заменяет его на цвет из палитры(тут главное в canvas API вникнуть, чтобы вернуть как было или два канваса, где верхний меняется, а нижний остается базовым).
    Ну, это если в общем расписывать, но, думаю, принцип понятен.
    Ответ написан
  • Как сохранить значения после перезагрузки?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    localStorage.setItem('ключ', JSON.stringify(что нужно сохранить))
      ...
      //onload
     const savedData = JSON.parse(localStorage.getItem('тот самый ключ'))

    https://developer.mozilla.org/ru/docs/Web/API/Wind...

    Либо, как уже предложили, сохранять в БД post/put запросом, и отправлять get при загрузке страницы.
    Ответ написан
    Комментировать
  • Как сделать зацикленную анимацию движения?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Добрый день.
    Могу ошибаться, но в вашем случае анимация работает только вверх, значит нужно ввести какие-то ограничения.
    Полагаю, стоит попробовать добавить условие, например
    if(vertical >= document.height){
      vertical++
    } else {
      vertical--
    }


    Таким образом элемент будет подниматься до высоты документа(играет роль позиционирование элемента. в вашем случае его позиционирование рассчитывается от bottom), и достигнув её, опускаться обратно.

    Второе, что не является ошибкой, но считается более верной практикой:
    меняйте не bottom в стиле, а transform: translateY('значение').

    Третье, как уже вам посоветовали, действительно гораздо проще зациклить анимацию в CSS.
    #ghost{
     position: absolute;
     bottom: 50px;
     animation: movement 10s linear infinite;
    
    @keyframes movement{
      50% {
        transform: translateY(100px)
      }
      100%{
        transform: translateY(0)
      }
    Ответ написан
    Комментировать
  • Как изменить состояние родителя из дочернего компонента React?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Верное решение подсказали, слегка разберу для понимания.
    <Parent>
      <Children openModal={this.state.openModal} onChange={this.onChange} />
    <Parent />


    в Parent объявите метод
    onChange=()=>{
      this.setState({openModal : true})
    }


    В Children так
    <div onClick={this.props.onChange}>
      ...какие-то элементы...
    </div>


    Всё просто)

    Но еще проще и гораздо надежнее https://ru.reactjs.org/docs/lifting-state-up.html
    Ответ написан
    5 комментариев
  • Как скрыть компонент в React при клике вне компонента?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    React.useEffect(()=>{
      document.addEventListener('onmousedown', handleClick)
        return()=> document.removeEventListener('onmousedown', handleClick)
    }, [])


    Объяснение:
    React.useEffect(()=>{
    //вешаем листенер
      document.addEventListener('onmousedown', handleClick) 
    // в зависимости хука заносим пустой массив. Таким образом мы с помощью хука выполним метод
     //componentDidMount(), вызвав useEffect 1 раз
    }, [])


    React.useEffect(()=>{
    ...какой-то код...
    //удаляем листенер
     return ()=> document.removeEventListener('onmousedown', handleClick)
    //после return прописываем методы, которые нужно выполнить после при размонтировании компонента
    //componentWillUnmount() аналог на хуках
    }, [])


    про useRef очень доступно и удобно написано в документации. Принцип такой же, как в вашем примере, только обращение к свойствам немножко иначе (refName.current...)
    Ответ написан
    1 комментарий
  • Как из одного компонента вызвать метод другого компонента в React?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Я могу ошибаться, но разве это не решается:
    1. Либо передачей метода в пропсы дочернего компонента(в таком случае состояние модального окна хранится в родительском компоненте). Модальное окно подписано на состояние showModal, а компонент Service в пропсы получает сам метод изменения состояния модального окна.
    2. Так как компоненты классовые, можно обратиться к нативному js и воспользоваться методом super()...но не уверен, что это будет хорошим решением.
    3. Либо, как предложила Zhanna_K, переписав стили компонента на абсолютное позиционирование.
    Ответ написан
    Комментировать
  • Как прописать классы в css modules в зависимости от условия (React)?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Можно без лишних стейтов обойтись.

    <LastAppointments name={'LastAppointments'} />

    То есть передаешь в пропсы компонента его имя(ну или любой другой идентификатор)

    <div className={ props.name == 'LastAppointments' ? 'row' : 'column' }> какой то код </div>


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

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    const handleClick = (e) => {
     e.preventDefault();
    SpeechRecognition.startListening({ continuous: true, language: 'ru' })
    }
    
    onClick = { handleClick }
    Ответ написан
    Комментировать
  • Как отобразить цены акций?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    ['BTC','DASH','DOGE','DCR','DAI', 'EOS','ETH','ETC',
    'XLM','XMR', 'ZRX', 'TRX'];
    //ADA,BAT,BCH,BSV,BTC,BTG,DASH,DOGE
    //,IOTA,LTC,QTUM,LINK,LSK,XEM,NEO,USDC
    //,USDT ,XRP,XTZ,ZEC доступные тикеры

    `https://production.api.coindesk.com/v2/price/ticke... вставлять доступные тикеры через запятую"`

    я брал отсюда. Покопавшись в апи, можно много другого интересного найти

    p.s. и поменяйте все же тег на api, так будет удобнее всем. Спасибо.
    Ответ написан
    Комментировать
  • Как использовать document.querySelector в React?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Говорят, что подобное вообще плохой тон в реакте(в райнем случае есть рефы), но я могу ошибаться.
    Касаемо querySelector https://ru.reactjs.org/docs/react-without-jsx.html ознакомьтесь, тут про ваш вопрос.

    querySelector: почитайте про рефы, они больше про реакт и jsx.
    Трансформ меняется <div style={{transform : `rotateZ(${hh...}deg)`> Элемент, который меняете .
    Ответ написан
    5 комментариев
  • Рендеринг массива с ограничением по длине и подстановкой "+хх more"?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Мне вот просто интересна критика своей версии, на истинность не претендую:
    через реф1 мы получаем ширину контейнера, затем вешаем рефы на каждый элемент массива, получаем их(елементов массива) ширину и индекс в массиве, складываем ширину элементов до ширины контейнера, остальные пeшим в новый массив, который развернется(если я правильно понял функционал) по клику +xxmore. Таким образом лишнего мы не рендерим, а в случае нужды - можем получить.
    Ответ написан
    Комментировать
  • Как правильно использовать useCallback в React?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    function Child ({data, sayHi}) {
    
      const handleClick = useCallback(el => {
        sayHi(el)
      }, [])
    
      return (
        <div className="App">
          {data.map(el=>
            <div
              onClick={()=>handleClick(el)}
            >
              {el}
            </div>
          )}
        </div>
      )
    }
    
    export default function App() {
      const data = [1,2,3,4]
      
      const sayHi = (el) => {
        console.log('Hi '+ el)
      } 
    
      return (
        <Child data={data} sayHi={sayHi} />
      )
    }


    Вы обманываете, тут нет ошибки в хуке.

    По-факту же ошибку вызывает doSomething( ), в которой, скорее всего, вызывается setState( ), который вызывает рендер и так далее до бесконечности, что не позволяет отрендерить.
    Ответ написан
  • Почему свойство кнопки onClick у кнопки срабатывает при загрузке страницы а не по нажатию?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Вот предыдущие два ответа верны, только уточню, что в твоем случае ты рендеришь не событие по клику, а просто алерт, а правильным решением, указанным раннее, будет вызвать анонимную/не анонимную(это лучше) функцию, которая и обработает событие.
    Ответ написан
    Комментировать
  • Что здесь является this?

    8XL
    @8XL
    Я высокий, но ниже, чем вы подумали.
    Я не очень понял твоё понимание("великий и могучий..."), но суть такова:
    (попытаюсь на пальцах, ибо сам в теории не силен)
    в пропсы компонента Square опускается не только вэлью(крестик или нолик), но и setState, обернутый в handleClick. То есть, таким образом, кликая по баттону в Square, фактически ты меняешь состояние компонента Board (

    handleClick(i) {
    const squares = this.state.squares.slice();
    squares[i] = this.state.xIsNext ? 'X' : 'O';
    this.setState({
    squares: squares,
    xIsNext: !this.state.xIsNext,
    });
    (вот тут).

    А this. говорит реакту, что нужно передать handleClick из этого компонента.
    Ответ написан
    Комментировать
  • Drag'n'drop - почему выводится старое состояние в useEffect?

    8XL
    @8XL Автор вопроса
    Я высокий, но ниже, чем вы подумали.
    Практически доведя себя до экзистенциального кризиса так нашел решение. Оставлю на случай, если кто столкнется с потерей состояния из-за слушателя событий внутри хука useEffect.

    React.useEffect(()=>{
    // добавление слушателя на все окно
        window.addEventListener('mousemove', mouseMove); 
        window.addEventListener('mouseup', mouseUp);
        
          return () => {
    // удаление слушателя после обновления эффекта
            window.removeEventListener('mousemove', mouseMove); 
            window.removeEventListener('mouseup', mouseUp);
          }             
        }
      )
    
    // эвент движения
      const mouseMove = (e) => { 
        if(motion.active){
    // считаем дельту положения мышки в моменте и первоначального положения
          const delta = e.pageY - motion.stY;

    // вот тут и далее ВАЖНО для эффекта(!!!) стэйт функционально задать!
    setMotion(motion=>( 
              {
                ...motion,
                y: delta
              }
            )
          )
        }
      }
    
    // эвент отпускания клавиши и конец днд
      const mouseUp = () =>{
        setMotion(motion=>(
          {
            ...motion,
            i: null,
            active: false,
            y: 0,
          })
        )
      }
    Ответ написан
    Комментировать