Ответы пользователя по тегу React
  • Могу ли я часть сайта сверстать на html/css, а другую на React js?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Ты можешь оборачивать свой html код в реакт компоненты, а css импортируется также как обычно
    Ответ написан
    Комментировать
  • Как по клику по кнопке передать DOM элемент в родительский компонент?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    import { useRef } from "react";
    
    const Item = ({ element, renderIn }) => {
      const node = useRef(null);
    
      const chooseThis = (event) => {
        renderIn.current.appendChild(node.current);
      };
    
      return (
        <li onClick={chooseThis}>
          <h1 ref={node}>{element}</h1>
        </li>
      );
    };
    
    const List = ({ elements, renderIn }) => (
      <ul>
        {elements.map((element) => (
          <Item element={element} renderIn={renderIn} />
        ))}
      </ul>
    );
    
    const App = () => {
      const elements = ["one", "two", "three"];
      const renderIn = useRef(null);
    
      return (
        <>
          <h1>
            Chosen one: <div style={{ color: "red" }} ref={renderIn}></div>
          </h1>
          <List elements={elements} renderIn={renderIn} />
        </>
      );
    };
    export default App;


    elements - массив строк, элементы для отрисовки
    renderIn - реф на ноду в которой будем отрисовывать выбранный элемент
    List - ul который рендерит Item для каждого элемента из elements, принимает renderIn реф чтобы прокинуть его в Item
    Item - li в котором создаётся h1 с содержимым элемента, внутри него инициализируется реф на h1, когда мы кликаем на li средствами DOM’а в ноду на которую указывает renderIn добавляется соответствующий h1 (для большей наглядности у блока в котором все рендерится в стилях color: ‘red’, он и применяется чилдренам)
    Ответ написан
    1 комментарий
  • Как отследить положение элемента React?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    красит все элементы списка красным
    import { useRef, useEffect } from "react";
    
    const Item = ({ element, pushNode }) => {
      const node = useRef(null);
    
      useEffect(() => {
        pushNode(node);
      }, [node]);
    
      return <li ref={node}>{element}</li>;
    };
    
    const List = ({ elements, pushNode }) => {
      return (
        <ul>
          {elements.map((element) => (
            <Item element={element} pushNode={pushNode} />
          ))}
        </ul>
      );
    };
    
    const App = () => {
      const elements = ["one", "two", "three"];
      const nodes = [];
    
      const pushNode = (node) => nodes.push(node);
    
      const paintRed = (event) => {
        nodes.forEach((node) => {
          node.current.style.color = "red";
        });
      };
    
      return (
        <>
          <List elements={elements} pushNode={pushNode} />
          <button onClick={paintRed}>Paint it red</button>
        </>
      );
    };
    
    export default App;


    elements - просто массив из стрингов которые как бы элементы
    nodes - (будущий) массив рефов
    pushNode - колбек который пушит в массив реф, его основная суть в том чтобы чистоту кода сохранять и не срать в глобальный скоуп из компонента
    List - обычный ul который мапит elements создавая Item на каждой итерации
    Item - обычный li внутри которого находится текст элемента из elements

    Внутри Item создается реф на li, после того как компонент маунтится (чтобы сам реф появился) вызывается колбек который пушит реф в nodes, потом по нажатию кнопки средствами DOM’а красятся li’шки
    Ответ написан
    Комментировать
  • Как реализовать переключение компонентов по клику на элемент?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Нормальное решение - если оно решает твою задачу. Всякие бест-практики и прочие штуки уже для тех кто начинает ощущать нехватку знаний спустя год-другой.

    Примерно так

    const TopNavigation: FC = () => {
      const { opened, setOpened } = useData()
      const { state: cityState } = useCityState()
      const { dispatch } = useNavigationDispatch()
      const { state: navigationState } = useNavigationState()
      const navRef = useRef(null)
    
      useEffect(() => {
        dispatch({ type: 'setTopNavHeight', payload: { topNavHeight: navRef.current.offsetHeight } })
      }, [])
    
      return (
        <Navigation
          size='tiny'
          fixed
          dispatch={dispatch}
          transparent={navigationState.transparent}
          borderBottom='white'
          backgroundColor={navigationState.transparent ? 'transparent' : 'slightlyGray'}
        >
          <Layout justifyContent='center'>
            <Box
              maxWidth={['90%', '90%', '1200px']}
              width='100%'
              height='48px'
              ref={navRef}
              alignSelf='center'
              alignItems='center'
            >
              <CityPinIcon
                color={navigationState.transparent ? 'white' : ''}
                width='10px'
                height='13px'
              />
              <Layout flexBasis='8px' />
              <Text
                fontSize='small'
                lineHeight='normal'
                color={navigationState.transparent ? 'white' : 'dustyGray'}
                cursor='pointer'
                onClick={() => setOpened(true)}
              >
                {cityState.city.name}
              </Text>
              <Layout flexGrow={1} />
              <TopBarList />
            </Box>
          </Layout>
          <CityModal onClose={() => setOpened(false)} opened={opened} />
        </Navigation>
      )
    }
    
    export default TopNavigation
    Ответ написан
    Комментировать
  • Как правильно перенаправить пользователя на другую страницу после верификаций емайла в spa с REST api?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Что есть приватный путь?
    Ответ написан
    Комментировать
  • Как выбрать систему оплаты для mern react приложения?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Привет. Можешь смело брать эквайринг Тинькофф Банка

    Насчёт реализации - можешь брать у нас

    Помогу если что
    Ответ написан
    Комментировать
  • Как настраивать robots и sitemap в react?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Привет. Вариантов в принципе не много, вернее вариантов много, но, нормальных 1-2, приведу их ниже:
    Ты можешь использовать react-helmet.
    Например:
    import React       from 'react'
    import Helmet      from 'react-helmet'
    import { useIntl } from 'react-intl'
    
    import messages    from './messages'
    
    export const Seo = () => {
      const intl = useIntl()
    
      const title = intl.formatMessage(messages.title)
      const description = intl.formatMessage(messages.description)
    
      return (
        <Helmet
          htmlAttributes={{ lang: intl.locale }}
          title={title}
          titleTemplate={`%s | ${title}`}
          meta={[
            {
              name: 'description',
              content: description,
            },
            {
              property: 'og:title',
              content: title,
            },
            {
              property: 'og:description',
              content: description,
            },
            {
              property: 'og:type',
              content: 'website',
            },
            {
              name: 'twitter:card',
              content: 'summary',
            },
            {
              name: 'twitter:title',
              content: title,
            },
            {
              name: 'twitter:description',
              content: description,
            },
          ]}
        />
      )
    }

    Для sitemap можешь использовать react-router-sitemap
    import { Router, Route, IndexRoute, Redirect, IndexRedirect } from 'react-router'
    import React from 'react';
    
    export default (
        <Router>
            <Route path="/">
                <IndexRoute/>
                <Route path="test" />
                <Route path="posts(/:page)" />
                <Route path="article/:hrefTitle" />
                <Route path="tags/:tagName" />
                <Route path="tags/pages/(:page)" />
                <Route path="archive(/:searchKey)" />
                <Redirect path="*" to="/" />
            </Route>
        </Router>
    )
    Ответ написан
    Комментировать
  • Как сделать поле автокомплит с яндекс карты api?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    nickname13384
    import React, { useState, useRef } from 'react'
    import { withYMaps } from 'react-yandex-maps'
    import { Column, Layout } from '@ui/layout'
    import { ContentLight } from '@ui/dropdown'
    import { Input } from '@ui/input'
    import styled from '@emotion/styled'
    import OnOutsideClick from '@ui/layer/src/OnOutsideClick'
    import Dropdown from './Dropdown'
    import SuggestView from './SuggestView'
    import { update, change, select } from './handlers'
    import { SuggestProps } from './types'
    
    const Wrapper = styled('div')({
      position: 'relative',
      width: '100%',
    })
    
    const Suggest = ({
      color,
      disabled,
      id,
      readOnly,
      placeholder,
      value,
      ymaps,
      onChange,
      onSuggest,
    }: SuggestProps) => {
      const [items, setItems] = useState([])
      const [toggle, setToggle] = useState(false)
      const suggestRef = useRef()
      const onUpdate = update(ymaps, setItems)
      const content = []
      content.push(
        <Input
          id={id}
          key='smart-input'
          disabled={disabled}
          value={value}
          onChange={
            disabled ? null : targetValue => change(targetValue, onUpdate, onChange)
          }
          color={color}
          readOnly={readOnly}
          placeholder={placeholder}
          onClick={() => setToggle(true)}
        />,
      )
    
      if (
        toggle &&
        items.length > 0 &&
        !(items[0] !== value && items.length === 1)
      ) {
        content.push(
          <OnOutsideClick
            key='smart-suggest'
            target={suggestRef.current}
            onOutsideClick={() => setToggle(false)}
          >
            <Dropdown>
              <ContentLight borderRadius='s' width='large' noPopup>
                <Column>
                  <Layout basis='12px' />
                  {items.map(s => (
                    <SuggestView
                      key={Math.random()}
                      onClick={() =>
                        select(s.value, onSuggest, onUpdate, onChange, setToggle)
                      }
                    >
                      {s.displayName}
                    </SuggestView>
                  ))}
                  <Layout basis='12px' />
                </Column>
              </ContentLight>
            </Dropdown>
          </OnOutsideClick>,
        )
      }
    
      return <Wrapper ref={suggestRef}>{content}</Wrapper>
    }
    Ответ написан
  • Где найти актуальные уроки по react?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Нигде, следовать туторам на медиуме в отдельных тэгах и читать репозитории по теме
    С 2016 документации почти не обновляются под текущий ход дел, поэтому только подобным опытом и только
    Ответ написан
    Комментировать
  • Как протестировать keyDown и изменение url?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Jest
    const map = {};
    Window.addEventListener = jest.genMockFn().mockImpl((event, cb) => {
      map[event] = cb;
    });
    
    map.event(...args);

    Enzyme
    import { mount } from 'enzyme';
    ...
    describe('Editor', function () {
      it('dispatch COMMAND_SAVE when command+s key pressesd', function () {
        const dispatchSpy = sinon.spy();
        dispatchSpy.withArgs(COMMAND_SAVE);
    
        // 1. use `mount` API for Full DOM Rendering
        const wrapper = mount(<Editor dispatch={dispatchSpy} />);
    
        // 2. find a DOM element with '.public-DraftEditor-content' classname
        const ed = wrapper.find('.public-DraftEditor-content');
    
        // 3. dispatch the 'keyDown' event with `simulate` API
        ed.simulate('keyDown', {
          keyCode: KeyCode.KEY_S,
          metaKey: false, // is IS_OSX=true, this should be true
          ctrlKey: true,
          altKey: false,
        });
    
        assert.equal(dispatchSpy.calledOnce, true);
        assert.equal(dispatchSpy.withArgs(COMMAND_SAVE).calledOnce, true);
      });
    });
    Ответ написан
  • Как при переходе на новую страницу прокручивать её вверх?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    npm i --save scroll-into-view
    P.S: render можешь не смотреть, там моя кастомная сетка, но для абстракции к применению может подойти
    class ScrollToTop extends Component {
      onClick = () => {
        if (this.element && this.element.parentNode) {
          scrollIntoView(this.element.parentNode.parentNode, {
            time: 500,
            align: {
              top: 0.1,
            },
          })
        }
      }
    
      onSetRef = (element) => {
        this.element = element
      }
    
      render() {
        const { intl } = this.props
    
        return (
          <div
            ref={this.onSetRef}
            style={{ width: '100%' }}
          >
            <Layer
              align='mc-mc'
              constraints={[{
                to: 'window',
                attachment: 'none',
                pin: ['top'],
              }]}
              classes={{
                pinned: styles(),
              }}
            >
              <div style={{ display: 'none', marginTop: 60, paddingRight: 40, paddingBottom: 20 }}>
                <Text color='blue400'>
                  &#8593;
                </Text>
                <Space />
                <Link onClick={this.onClick}>
                  <Text color='blue400'>
                    {intl.formatMessage(messages.up)}
                  </Text>
                </Link>
              </div>
            </Layer>
          </div>
        )
      }
    }
    Ответ написан
    Комментировать
  • Как правильно обновлять состояние?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Для обновления состояния вызывается функция setState():
    this.setState({welcome: "Привет Андрей"});

    Изменение состояния вызовет повторный рендеринг компонента, в соответствии с чем веб-страница будет обновлена.

    В то же время не стоит изменять свойства состояния напрямую, например:
    this.state.welcome = "Привет Андрей";
    В данном случае изменения повторного рендеринга компонента происходить не будет.

    При этом нам не обязательно обновлять все его значения. В процессе работы приложения мы можем обновить только некоторые свойства. Тогда необновленные свойства будут сохранять старые значения.
    Ответ написан
  • FlatList в ScrollView как реализовать в React Native?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    по возможности лучше не делать двойной скролл т.к. есть риск оставить пользователя с флэтвью, если он достаточно большой, что бы целиком экран перекрыть
    Ответ написан
    Комментировать
  • Функция не видет обновление стейта Reacta?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    А откуда onSortChange и fetchData вызывается?
    Ну и setState и props.sortColumn асинхронны...
    Ответ написан
  • Почему webpack не рендерит имэджи?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Потому что гладиолус)
    {
                test: /\.(png|jpg|svg|ttf|eot|woff|woff2|gif)$/,
                use: [
                    'file-loader?name=[hash:12].[ext]&outputPath=images/',
                    'image-webpack-loader',
                ],
            },
    Ответ написан
    1 комментарий
  • React element ui что передавать в custom template?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Комментировать
  • IOS 11 Разрешение на доступ к камере?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Судя по ошибке вам всё-таки не хватает прав, надо смотреть код который проверяет их
    Ответ написан
    Комментировать
  • Как определиться с технологией для простого приложения под IOS?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    SuperNikiforov зачем так человека пугаешь?
    Old Odessa https://github.com/Microsoft/react-native-windows держи)

    UPD: А если тебе нужны приложения прям в релиз, то используй стандартную связку ReactJS+Redux+ReactNative+VMWare (для xcode) или аналоги

    UPD2: "Технология" более чем подходящая
    Ответ написан
    Комментировать
  • Как добавить объект в массив объектов React?

    Torin_Asakura
    @Torin_Asakura
    Lead Architect
    Привет.
    Ну, тут в целом всё просто
    const info = [
        {
            title: 'Сделать уроки',
            description: 'Нужно сделать математику и русский язык',
            importance: 'Важно',
            done: '12.12.2017',
            deadline: '14.12.2017'
        }
    ], 
    const newObject={}
    info.push(newObject)

    И тебе почитать -> https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан