Ответы пользователя по тегу React
  • Как правильно спроектировать сайт на react + node js?

    @montecazazza
    Node, GraphQL, React
    https://github.com/facebookincubator/create-react-app - с этого можно начать, чтобы не заморачиваться со сборщиком и настройкой. Можно легко начать и фронт и бэк.
    https://github.com/styled-components/styled-components - это добавить для стилей - ИМХО самый удобный вариант
    Ну роутер и прочее что необходимо по ходу будет.
    Вообще не очень понятно зачем React если не SPA.
    Ответ написан
    Комментировать
  • Можно ли на ReactJS динамически загружать компоненты без знания о них при сборке самого приложения (как это реализовано в Angular 2+)?

    @montecazazza
    Node, GraphQL, React
    Это называется code splitting - фича включена в Webpack 2. инструкция import стала асинхронная. Можно сделать HOC (asyncComponent) и использовать его для удобства (обычно код делят по раутам).
    Потребуется настроить Webpack соответствующим образом, чтобы делил код по частям (chunks). В общем ищите по "code splitting React", кто ищет тот найдет

    Вот asyncComponent в самом простом варианте
    import React, { Component } from 'react';
    
    export default function asyncComponent(importComponent) {
      return class AsyncComponent extends Component {
        constructor(props) {
          super(props);
          this.state = { Component: null };
        }
        async componentDidMount() {
          const { default: Component } = await importComponent();
          this.setState({ Component });
        }
        render() {
          const { Component } = this.state;
          return Component && <Component {...this.props} />
        }
      }
    }


    Вот как он может быть использован с React Router 4
    import React from 'react';
    import { Route, Switch } from 'react-router-dom';
    
    import { Wrapper } from 'Styles';
    import SyncComponent from 'Components/SyncComponent';
    import { asyncComponent } from 'Helpers';
    
    const AsyncComponent = asyncComponent(() => import('Components/AsyncComponent'));
    
    const App = () => (
      <Wrapper>
        <Switch>
          <Route path='/route-to-async/' component={AsyncComponent}/>
          <Route component={SyncComponent}/>
        </Switch>
      </Wrapper>
    );
    export default App;
    Ответ написан
  • Удаление элемента?

    @montecazazza
    Node, GraphQL, React
    Если я правильно понял проблему, то вы хотите, привязать к обработчику onClick индекс элемента. Я предпочитаю делать это через замыкания.
    Попутно советую перенести bind в конструктор.
    Кстате, bind можно не делать, если заменить объявление метода на стрелочный синтаксис тогда все станет намного наглядней метод будет выглядеть вот так и как я сказал bind не нужен:
    removeCount = (idx) => (/*сюда будет передан event, но он вам типа не нужен*/) => {
      /* тело с this, он будет autobinded */
    }

    Конструктор тоже будет не нужен, можно просто написать state
    class App extends React.Component {
      //constructor(){
      //  super();
      //  this.state ={
      //   count: [1,2,3,4,5,6,7,8,9]
      //  }
      //  this.removeCount = this.removeCount.bind(this)
      //}
      this.state = {
        count: [1,2,3,4,5,6,7,8,9]
      };
      /*...*/
    }


    Но я сохранил твой вариант
    Если заменить метод splice на не мутирующий slice, то тело функции станет одной строкой без доп. переменных. Подсказка в коде

    class App extends React.Component {
      constructor(){
        super();
        this.state ={
          count: [1,2,3,4,5,6,7,8,9]
        }
      this.removeCount = this.removeCount.bind(this)
      }
      removeCount(idx) {
        return function() {
          let newItems = this.state.count;
          newItems.splice(idx, 1);
          this.setState({count: newItems});
          // this.setState({count: this.state.count.slice(/*чо нада*/)});
          // все что выше в методе тогда не нужно
        }
      }
      render() {
        const list = this.state.count.map(function(index, i){
          return (
            <div 
              key={i} 
              onClick={this.removeCount(i)}>
                <p>{index}</p>
            </div>
          );
        })
        return (
          <div className="row">
           {list}
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('container'));


    Ну ОК, мой вариант выглядел бы так (возможны опечатки, пишу прям тут)
    class App extends React.Component {
       state ={
         count: [1,2,3,4,5,6,7,8,9]
      }
      removeCount = (idx) => () => {
        this.setState({count: this.state.count.slice(idx, 1)});
      }
      render() {
        return (
          <div className="row">
           {this.state.count.map(i => (
              <div 
                key={i} 
                onClick={this.removeCount(i)}>
                  <p>{i}</p>
              </div>
            ))}
          </div>
        );
      }
    }
    
    ReactDOM.render(<App />, document.getElementById('container'));
    Ответ написан
    Комментировать
  • В чем суть React-Router 4?

    @montecazazza
    Node, GraphQL, React
    Вот тут можно посмотреть
    https://egghead.io/lessons/react-run-the-react-rou...

    Странный вопрос вообще, а прошлым пользовался?
    Ответ написан
  • Установка react/webpack, в чем проблема?

    @montecazazza
    Node, GraphQL, React
    вот это точно неправильно - './src/index.js' нужно указывать абсолютные пути.
    У вас уже указаны пути в resolve, так что можно просто оставить 'index.js'. Или пока уберите resolve раздел и используйте модуль path и __dirname переменную (просто чтобы получше разобраться на первом этапе)
    resolve: {
            moduleDirectories: ['node_modules', 'bower_components'],
            moduleTemplates: ['*', 'index'],
            extensions: ['*', 'index'],
            root: __dirname + '/src'
        },

    extensions: ['*', 'index'] - вот это тоже странное - тут должны быть указаны расширения файлов. и раз уж вы указываете '*', то на этом можно и остановиться, но лучше указывать реальные расширения файлов которые участвуют в сборке ['js', 'jsx', 'css', и тд]

    достаточно много логических несостыковок в конфиге, вы, очевидно, не доконца понимаете, что конретно тут происходит. Я бы вам порекомендовал начать с разделов entry, output и module и остальное добавлять по мере того, как будете читать документацию. сейчас она у них написана отлично. Успехов!!! разберитесь с этим, это того стОит!!!
    https://webpack.js.org/configuration/
    Ответ написан
    Комментировать