• Как исправить ошибку "Invariant Violation: Objects are not valid as a React child"?

    Что вы пытаетесь сделать в методе рендер? Ошибка говорит о том, что вы вместо реакт-элемента рендерите объект(ы).

    Вам нужно сначала отфильтровать книги, а потом отрендерить их как элементы списка:

    render() {
        const {books, url} = this.props;
        return (
          <ul>
            {books.filter(book => book.name === url).map((book, key) => (
              <li key={key}>
                  <p>{book.name}</p>
                  <p><Link to={`/${book.author}`}>{book.author}</Link></p>
                  <p>{book.descrip}</p>
                </li>
            ))}
          </ul>
        );
      }
    Ответ написан
    2 комментария
  • Почему в React.js в событии onKeyUp не работает event.preventDefault()?

    а как же тогда сделать, так, чтоб если пользователь вводит в строку значение, которое не соответсвует регулярному выражению - выполнялась функция event.preventDefault() ? ведь keyDown и keyPress для этого не подходят, так как они берут старые занчения


    У вас подход в корне неправильный. Ваш инпут находится в состоянии uncontrolled. И вам нужно вместо этого сделать так:
    <input type="text" value={someValue} onChange={handleChangeSomeValue}/>

    handleChangeSomeValue(e) {
        const nextVal = e.currentTarget.value;
        if (!isValid(nextVal)) {
          return;
        }
        this.setState({ someValue: nextVal });
      }


    Рабочий пример -> jsfiddle.net/yuvuyrhv/20
    Ну и читаем документацию -> https://facebook.github.io/react/docs/forms.html
    Ответ написан
    Комментировать
  • Странное поведение замыканий JS. Где ошибка?

    obj - это ссылка на объект. Вы передали эту ссылку в функцию test (при этом возникла ее копия ob) и на ob замкнули анонимную функцию. Когда вы обнулили ссылку obj = null - с самим объектом ничего не стало и ob продолжает на него ссылаться.
    Ответ написан
    1 комментарий
  • Как создать простое приложение на react-native?

    У вас слишком общий вопрос.
    Посмотрите https://rnplay.org/ . Документацию. Вы знакомы с реактом? Если нет - то сначала освойтесь с ним.

    Переходы по страницам осуществляются так же, как и на react'e для web - react router, например
    Ответ написан
    5 комментариев
  • Как правильно работать/подключать sass/css в React.js?

    Попробуйте style-loader:
    import styles from 'styles.less';
    ...
    componentDidMount() {
      styles.use();
    }
    
    componentWillUnmount() {
      styles.unuse();
    }


    Тогда стили будут добавляться на страницу, когда компонент будет установлен. Но мне как-то не особо такой подход нравится и я просто делаю файл styles.less куда импортирую все нужные мне стили компонентов. И у меня на роут 'GET /styles.css' стоит обработчик, который отдает скомпиленный styles.less

    Аналогичное решение будет и для sass\postCss ...
    Ответ написан
  • Как поднять свой NS сервер, для windows openserver?

    Вам нужно именно NS сервер, или сайт поднять на вашем openserver'e?
    Если второе, то просто поменяйте А-запись у домена
    Ответ написан
    Комментировать
  • Есть ли способ не привязывать каждую функцию в которой нужен this в ES6 React?

    В babel с пометкой stage-0 есть такая штука - https://github.com/jeffmo/es-class-static-properti...

    Она позволяет делать так:

    class MyClass {
      foo = () => {
        console.log('foo a = ', this.a);
      }
    
      bar = () => {
        this.a = 10;
        setTimeout(this.foo, 10); // Мы не биндим foo на this
      }
    }
    
    const o = new MyClass();
    const bar = o.bar; // и тут тоже не биндим
    
    bar(); // выводит "foo a = 10"
    Ответ написан
    Комментировать
  • Как передать/получить атрибут data в следующей ситуации?

    Потому что this в момент выполнения кода вряд-ли указывает на div.pop.

    var $pop = $('div.dop');
    $pop.myRat({'tekr': $pop.data('rat') });
    Ответ написан
    Комментировать
  • Как обратиться к многомерному массиву имея простой массив с индексами?

    Решение на скорую руку:

    function getElementByPath(array &$arr, array $path) {
        $el = $arr[array_shift($path)];
        if (count($path) === 0) {
            return $el;
        }
        return getElementByPath($el, $path);
    }


    Пример работы:
    $arr = array(
        'one' => array(
            'two' => array(
                'three' => 'stroka'
            )
        )
    );
    
    $path = array(
        'one',
        'two',
        'three'
    );
    
    
    $el = getElementByPath($arr, $path);
    var_dump($el); // ---> 'stroka'


    Добавите всяких проверок и будет ок.

    UPD1. Решение чуть получше:
    // Последний параметр значение, если элемент не найден
    function getElementByPath(array &$arr, array $path, $initial = null) {
        return array_reduce($path, function (&$res, $key) use (&$initial) {
            return is_array($res) && isset($res[$key]) ? $res[$key] : $initial;
        }, $arr);
    }
    Ответ написан
    Комментировать
  • Можно ли написать вирус на JavaScript?

    Начнем с того, что вирус - это довольно сложная вещь и состоит он обычно из нескольких модулей. Один из них - это эксплойт. Его основная задача - эксплуатировать уже известную уязвимость с целью получения возможности выполнения произвольного кода (как пример).

    Если мы мельком полистаем список уязвимостей, то увидим, что во многих из них фигурирует JS. Вот график взятый с того же сайта:
    RXmc_1mXxXA.jpg
    На нем прекрасно видно динамику уязвимостей приводящих к удаленному выполнению кода (красная линия). Отсюда логичный вывод - js можно использовать как эксплоит.

    Некоторые предыдущие ораторы неверно отмечали - браузер, как и любое другое полноценное приложение, имеет доступ к файловой системе (тот самый обычный доступ, когда можно писать, читать, создавать не системные файлы) посредством API операционной системы (например: WinAPI для windows). Внутри это все выглядит как системный вызов - программа передает управление на уровень ядра, предварительно сказав, что нужно открыть\создать\записать такой-то файл. Значит, нам нужен ассемблерный (да-да, не удивляйтесь) код, на который наш эксплоит передаст управление.

    Ок. Теперь перейдем к самому эксплоиту. Есть такая техника - heap spraying: мы берем нашу полезную (вредную) нагрузку и заполняем ей всю память:
    var buf = new Array();
    // заполним 200МБ памяти
    for(var i = 0;  i != 200; ++i) {
      buf[i] = nop + shellcode;
    }


    И, вполне возможно, что мы перезапишем определенные области (не буду вдаваться в подробности) и сможем выполнить наш shellcode. И да, как сказал riot26 - браузер после такого, скорее всего, крэшнется ... но нам это уже не важно - код будет внедрен и выполнен. Конечно, это банальщина и есть еще 100500 различных вариантов, о которых вам никто не расскажет, но идея ясна.

    PS пользуясь случаем - передаю привет людям в погонах!
    Ответ написан
    2 комментария
  • Как добавить данные в массив через foreach в react?

    1. push мутирует массив. Читаем это и никогда не мутируем state. На ES6 добавить элемент в массив можно так:

    this.setState({ massiv: [ ...this.state.massiv, "новый элемент"  ] })


    2. Данные компоненты должны получать только через props. Конечно, некоторые из компонентов у вас будут как controller-view (подключены к store и будут получать данные через события\конекст\еще как-нибудь), но таких контроллеров должно быть мало, реально мало - в основном на верхних уровнях дерева.

    3. По поводу ajaxa - выносите такую логику в бизнес-слой. В ваши action creators, например. Тогда у вас не возникнет таких проблем: делаете запрос -> когда он завершится отправляете соответствующий action (success, failure) -> store обрабатывает экшен, изменяет свое состояние -> controller view получает новые данные и рендерится

    4. В ES6 есть промисы
    const someArr = [];
    const doAjaxJob = el => fetch('some-url', .... );
    const p = Promise.all(someArr.map(doAjaxJob)); // <-- сюда можно подписаться


    PS И главное - не превращайте хороший функциональный стиль в спагетти
    Ответ написан
    Комментировать
  • Как добавить элемент в форму по клику в React?

    Я набросал пример - jsfiddle.net/yuvuyrhv/19

    class MyForm extends React.Component {
    
      constructor(props) {
        super(props);
        this.handleSubmit = this.handleSubmit.bind(this);
        this.addGood = this.addGood.bind(this);
        this.changeGoodCount = this.changeGoodCount.bind(this);
        this.state = { goods: [] };
      }
    
      handleSubmit() {
        console.log('handleSubmit');
      }
    
      addGood() {
        const { goods } = this.state;
        this.setState({ goods: [ ...goods, { count: 0 } ] });
      }
    
      changeGoodCount(n, count) {
        const { goods } = this.state;
        this.setState({ goods: goods.map( (good, i) => i === n ? { count } : good ) });
      }
    
      render() {
        const { goods } = this.state;
        const { handleSubmit, addGood, changeGoodCount } = this;
        console.log('MyForm.render() -> goods =', goods);
        return (
          <form onSubmit={handleSubmit}>
          	<div>
              Имя пользователя: <input type="text" />
            </div>
            <div>
              Телефон: <input type="text" />
            </div>
            <div>
              { goods.map( (good, i) => <GoodInput key={i} good={good} n={i} onChange={changeGoodCount}/> ) }
            </div>
            <div>
              <button type="button" onClick={addGood}>Добавить что-либо</button>
            </div>
          </form>
        );
      }
    }
    
    class GoodInput extends React.Component {
      handleChange(e) {
        const { n, onChange } = this.props;
        const count = e.currentTarget.value;
        onChange(n, count);
      }
    
      render() {
        const { good, n } = this.props;
        return ( 
          <div>
            Количество товара {n} <input type="text" onChange={(e) => this.handleChange(e)} />
          </div>
        );
      }
    }


    Идея, надеюсь, ясна. В итоге подключите к вашим сторам все это, уберете стейт, добавить проп тайпс, добавите обработчики onChange на все инпуты и так далее...
    Ответ написан
    2 комментария
  • Когда нужно использовать props, а когда state?

    Когда нужно использовать state

    Если кратко, то - большинство ваших компонентов stateless. Есть такой паттерн controller-view: обычно у вас есть несколько компонентов-контроллеров на верхних уровнях дерева у которых есть свой state, а остальные компоненты просто принимают props и рендерят их.
    Ответ написан
    Комментировать
  • Как достать 1 значение из массива в React-е?

    Внесу свою лепту. Буду базироваться на ответе Алексей Зуев :

    1. Сделать отдельный компонент для строки с товаром (GoodRow) и строки с товарами пользователя (UserGoodsRow). Все-таки разные вещи.

    2. Для всех динамических дочерних компонентов надо добавить свойство key

    3. Никогда не называйте поля объекта с большой буквы. Фи. Да и CamelCase предпочтительней, чем SnakeCase

    Результат -> jsfiddle.net/yuvuyrhv/11

    4. Как вы относитесь к ES6? Вам все равно нужен babel!
    jsfiddle.net/yuvuyrhv/13

    5. Указывайте propTypes

    Ну и напоследок скажу, что логику разбиения продуктов по пользователям НЕОБХОДИМО вынести в отдельный слой (либо в бизнесс ... или, на худой конец в какой-нибудь controller-view вроде UserGoodsPage)

    Финальный результат -> jsfiddle.net/yuvuyrhv/14

    PS Также рекомендую взять в использование один из инструментов, облегчающих ФП - будь то lodash, underscore или ramdajs
    Ответ написан
    1 комментарий
  • Как заставить Link из react-router скроллить к диву?

    1. В случае, если у Вас сложная логика: Link принимает свойство state, через него можно передавать идентификатор куда скролить, например.

    Затем подписываетесь на history:
    let unlisten = history.listen(location => {
      console.log(location.state); // <-- переданный в Link state.
    })


    Дальше любым известным Вам способом скролите к нужному элементу.
    Но я бы Вам настоятельно советовал не выходить за рамки якорей (хэш в конце url) касаемо навигации.

    2. Навигация с хешем:
    Link принимает свойство hash, которое так-же можно получить подписавшись на history
    <Link  to="some" hash="#idOfElement" >Scroll to</Link>
    
    let unlisten = history.listen(location => {
      console.log(location.hash); // <-- переданный в Link hash.
    })
    Ответ написан
  • Принудительная загрузка скрипта на React.js, как?

    <script type="text/javascript">
      google.load('visualization', '1.1', {packages: ['geochart'], callback: drawVisualization});
    
      function drawVisualization() { ... }
    </script>

    Этот кусок кода вообще особняком стоит. Нужно же его интегрировать ... Начнем!

    Первым делом поместим функцию drawVisualization в наш js файл:
    function drawVisualization(element, commonData, regionData) {
      console.log('elemet', element);
      var data = google.visualization.arrayToDataTable(commonData);
      var mapVisualization = new google.visualization.GeoChart(element);
      mapVisualization.draw(data, regionData);
    }


    И немного модифицируем главный файл:
    <script type="text/javascript">
      google.load('visualization', '1.1', {packages: ['geochart']});
    </script>


    Затем определим компонент, который будет рисовать карту:
    class MapVisualization {
    
      componentDidMount() {
        this.drawMap();
      }
      
      componentDidUpdate() {
        this.drawMap();
      }
      
      drawMap() {
        drawVisualization(this.refs.mapDiv.getDOMNode(), this.props.commonData, this.props.data);
      }
    
      render() { 
        return (
          <div ref="mapDiv" />
        );
      }
    };


    Готово. Все данные поместим в props компонента Tabs и затем изменим его render:
    render() {
          var list = this.props.data.map(function(d, i) { return <button type = "button" className = { 'tab' + (i === this.state.current ? ' active' : '') } key = { 'tab-' + i } onClick = { this.handleClick.bind(this, i) }>{d.title}</button>
          }.bind(this));
    
          const { commonData, data } = this.props;
          const { current } = this.state;
          return (         
            < div className = 'container' >
              <div className='col-12'>
                  {list}
                  <div className = 'map'>
                    <MapVisualization data={data[current].content} commonData={commonData} />
                  </div>
              </div>
            </div>
          );
        }


    Вместо ссылки я использую конечно-же кнопку.
    Конечный результат

    Это конечно далеко от идеала, но я так понимаю Вы не давно начали реакт - поэтому пойдет
    Ответ написан
    4 комментария
  • Нужен ли react.js в полу динамическом сайте (или в конкретном случае)?

    1 )Реакт - это функциональный подход к разработке UI.
    2) Реакт принято считать V из MVC. Его чаще всего используют с какой-либо реализацией flux (MVC не используется).
    3) В основе реакта - виртуальный DOM

    Исходя из этих тезисов - на реакте (читай react + flux) надо делать все приложение, иначе профита никакого. Соответственно, если вам нужно сделать только форму входа - отбросьте реакт, Вам это не нужно.

    А вот если вам нужно разработать SPA (или даже просто сайт, на котором будет куча UI), то, поверьте, с jQ это все превратиться в спагетти, приправленные костыльной пастой очень и очень быстро.

    PS. Для реакта есть свой бутстрап с блекджеком - https://react-bootstrap.github.io/
    Ответ написан
  • Как наименее ресурсо затратно получить строку по номеру строки из txt фаила в два миллиона строк?

    Попробуйте сделать индекс. В вконтакте, например, тоже все файлы с пользовательским контентом объединяет в один большой файл и потом отдает нужный кусочек.

    Если у вас в каждой строке, например, int32, то просто вычисляете нужное смещение, затем вызываете fseek и вуаля!
    Ответ написан
    Комментировать