Ответы пользователя по тегу React
  • Как задать значение по умолчанию текстовому полю в React final form?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    initialValues
    (
      <Form
        onSubmit={onSubmit}
        subscription={{ dirty: true }}
        initialValues={{ foo: 'bar' }}
      >
        {({ handleSubmit }) => (
          <form onSubmit={handleSubmit}>
            <Field name="foo" component="input" />
            <button type="submit">Submit</button>
          </form>
        )}
      </Form>
    )
    Ответ написан
  • Как исправить ложную ошибку синтаксиса в webshtorm?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Написать в одну строку или добавить фигурные скобки?
    const Login = asyncComponent(() => import('...'));

    UPD: Если синтаксис верный и проблема в IDE, то следует либо обновить определения типов, либо переключить версию языка/стандартов, либо просто обновить ПО.


    WebStorm 2017.3 EAP, 173.2941
    • Better support for import() syntax in JavaScript and TypeScript
    Ответ написан
  • Перезагрузка страницы приводит к 404 ошибке (React Router)?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Все запросы нужно направлять на главную страницу.

    web.config
    <system.webServer>
      <rewrite>
        <rules>
          <rule name="All" patternSyntax="Wildcard" stopProcessing="true" enabled="true">
            <match url="*" />
            <conditions logicalGrouping="MatchAll">
              <add input="{REQUEST_FILENAME}" 
                   matchType="IsFile" 
                   negate="true" 
                   pattern="" 
                   ignoreCase="false" 
              />
            </conditions>
            <action type="Rewrite" url="index.html" />
          </rule>
        </rules>
      </rewrite>
    </system.webServer>

    После внесения изменений, не забудьте перезапустить рабочий процесс (пул).
    Ответ написан
    3 комментария
  • Как добавить строку в таблицу в ReactJS?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Если вы хотите что-то изменить в текущем компоненте, то используйте состояние (setState).

    Если вы хотите изменить дочерний компонент, меняйте состояние текущего (setState) и передавайте измененные данные из состояния (state) дочернему компоненту через props.

    В вашем примере, корневой компонент - Table, в который вы передаете свойства (props): head_names и rows. Если вы хотите сделать возможность добавлять новую строку в Table, то вам следует сделать контейнер, в который поместить Table и кнопку (или другой элемент) для добавления новых строк. В состояние (state) контейнера нужно добавит head_names и rows, на основе которых и будет создаваться таблица.

    class TableManagement extends React.Component {
    
      constructor(props) {
        super(props);
        
        this.state = {
          head_names: ['qwe0', 'qwe1'],
          rows: [
            [1, 2],
            [3, 4]
          ]
        };
      }  
    
      AddRow() {
        let newRows = this.state.rows;
        newRows.push([0, 0]);
        this.setState({rows: newRows});
      }
    
      render() {
        return (
          <div>
            <Table head={this.state.head_names} rows={this.state.rows} />
            <hr />
            <button onClick={ this.AddRow.bind(this) }>Add row</button>
          </div>
        );
      }
    }
    
    class Table extends React.Component {
      render() {
        return (
          <table>
            <thead>
              {this.genHead()}
            </thead>
            <tbody>
              {this.genRow()}
            </tbody>
          </table>
        );
      }
    
      genHead() {
        var head = this.props.head;
    
        return head.map(function(v, i) {
          return (
            <th key={'th' + i}>
              {v}
            </th>
          );
        });
      }
    
      genRow() {
        var rows = this.props.rows;
    
        return rows.map(function(v, i) {
          var tmp = v.map(function(v2, j) {
            return (
              <td key={'td' + i + '_' + j}>
                {v2}
              </td>
            );
          });
    
          return (
            <tr key={'tr' + i}>
              {tmp}
            </tr>
          )
        });
      }
    }
    
    ReactDOM.render(
      <TableManagement />,
      document.getElementById('root')
    );

    https://jsfiddle.net/m11x34fp/

    В процессе разработки, важно определиться, кто будет тупым, а кто умным :-)

    Тупые (простые) компоненты - это компоненты, которые ничего не делают, просто принимают свойства и рисуются.

    Умные компоненты способны управлять состоянием, как своим, так и передавать его своим тупым отпрыскам потомкам :-)

    Если компонентов много, и особенно, если много вложенных компонентов, то следует хорошо продумать роль каждого компонента. Один умный компонент с множеством тупых вложенных компонентов - это самый простой вариант. Если дети тоже будут умными и должны будут общаться с компонентами своего уровня (братьями и сестрами) или верхнего уровня (дедушками, бабушками и выше), то организовать взаимодействие между компонентами будет сложно, будут конфликты, лишние обновления, в худшем случае зацикливание. Для решения проблем таких масштабов можно использования библиотеки управления состоянием, такие как Redux, Flux и т.п.
    Ответ написан
    2 комментария
  • Как передать DOM через prop?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Не проще ли сделать общего родителя для видео и элементов управления?

    <mediaPlayer>
      <video ref={(v) => this.video = v} />
      <playerControls onStop={...} onPlay={...} onPause={...} />
    </mediaPlayer>

    Тогда элементы управления смогут общаться с проигрывателем через общего родителя.
    Ответ написан
    4 комментария
  • Как задать динамическое значение props?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Использовать state вместо props:
    var Hello = React.createClass({
      getInitialState: function() {
        return { test: 0 };
      },
      componentWillMount: function() {
        setInterval(() => {
          var dynamicData = (Math.random() * 100).toFixed(0);
          this.setState({ test: dynamicData });
        }, 3000);  
      },
      render: function() {
        return <h2>{this.state.test}</h2>;
      }
    });
    
    ReactDOM.render(
      <Hello />,
      document.getElementById('container')
    );

    Если нужны именно props, то родительский компонент может менять состояние и передавать его в нужное свойство дочернего компонента, а дочерний компонент может обрабатывать изменения в componentWillReceiveProps(nextProps).

    Еще можно вызывать forceUpdate(), но лучше так не делать.

    От идеи внешнего управления компонентами лучше сразу отказаться. Будет меньше проблем. Все должно быть внутри компонентов, либо вообще не относиться к компонентам.
    Ответ написан
    2 комментария
  • Reactjs плагины и requirejs, как?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Не переписывать же плагины, верно? Кто как с этим борется?


    Использую TypeScript и Visual Studio. Итоговый JavaScript сам собирается в нужном виде, достаточно выбрать систему модулей в свойствах проекта.

    Но с некоторыми библиотеками React в AMD возникали проблемы. И да, единственным решением было внесение изменений в код этих компонентов, что не очень хорошо и не факт, что можно будет отделаться парой простых изменений.

    В итоге пришлось использовать Webpack. Опыт работы с RequireJS сильно усложнил миграцию и в какие-то моменты я даже пытался прикрутить RequireJS в Webpack :-) Так что про RequireJS лучше полностью забыть.

    Реализация с Webpack мне нравится больше, но настроек придется написать много и иногда все это дело глючит. С использованием загрузчиков, на выходе можно получить все что угодно из чего угодно.
    Ответ написан
    Комментировать