Ответы пользователя по тегу JavaScript
  • Как правильно инициализировать в проекте дефолтные настройки для одного из модулей?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Указать его в самом начале (то есть "вверху" приложения, там где он первый раз "появляется"), где применяется axios / либо где-вы его ради этого импортнете. Разве так не сработает?

    Либо такой вариант:
    function buildHeaders() {
      const authToken = localStorage.getItem('token')
      return { ...defaultHeaders, Authorization: authToken }
    }


    export function httpGet(url) { //экспортируете функцию для будущих вызовов
      return fetch(url, { // я использую fetch, но для axios сделать, думаю вы сможете
        headers: buildHeaders(), // те самые заголовки, которые нужны в каждом запросе
      })
      .then(checkStatus) // это уже не важно, у меня в коде просто далее идет еще несколько проверок общих
    }
    Ответ написан
    2 комментария
  • Какой подход (библиотеки, фреймворки) используете при верстке UI?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Всякие красивые чекбоксы, радиобаттоны и прочие интерфейсы верстаю вручную, и естесственно адаптивно.

    Значит при том вы ведете какую-то свою "библиотеку подобных элементов"?
    Так же и другие люди, "ведут" подобные библиотеки, еще больше других людей их используют и пишут о багах, поэтому получается обычно более "протестированный" элемент.

    Пример, для material design - https://getmdl.io/components/index.html
    Там есть github и можно посмотреть код любого компонента... а можно просто взять сразу готовый и использовать, при этом не писать самому.

    Другой пример: есть популярный bootstrap, есть у него сетка, по этой сетке делается много однотипных сайтов, дизайнеры по ней рисуют сразу изначально, в итоге у рядового "конвейрного" мастера по лендингам (ничего плохого не имею против таких специалистов) очень сильно понижается затраченное время на выполнение задачи по адаптивной верстке.
    ===

    По технологиям: вы верстаете, так наверное, используете gulp? Если нет - то пора, получите live reload (не нужно перезагружать страницу), сможете оптимизировать ваши скрипты/стили/картинки... и все это будет сильно высвобождать ваше время.
    Ответ написан
    3 комментария
  • В каких случаях использовать PureComponent?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Годная статья с хабра (плюс комментарии)
    Ответ написан
    1 комментарий
  • Почему первый респонс null?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Алексей Самсонов дело говорит. Нужно идти по массиву данных, когда он есть, либо когда вместо него "начальное состояние" = пустой массив.
    Судя по вашему вопросу, вам проще делать проверку, что если this.props.data.length есть, то рисуй шаблон, если нет - null

    renderTemplate(data) {
      return data.map(item => .... )
    }
    render() {
     ...
    { this.props.data.length ? this.renderTemplate(this.props.data) : null }
     ...
    }
    Ответ написан
    3 комментария
  • Почему в React созданные функции(методы) вызываются без аргументов?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    // для примера обе переменные (store и dispatch) объявлены в той же области видимости
    // на самом деле их нет в вашем файле компонента
    // Так как функция connect вызывается "где-то там, где они доступны"
    // вы имеете к ним доступ
    let dispatch = () => console.log("dispatch")
    let store = { user: { name: 'Mike', age: 15 }, data: [1,2,3] }
    
    function connect(mapStateToProps, mapDispatchToProps) {
      console.log(mapStateToProps(store))
    }
    
    function mapStateToProps(storeFromClosure) { // здесь оказывается глобальный store доступный из замыкания
      return {
        myData: storeFromClosure.data 
      }
    }
    
    connect(mapStateToProps, null)
    Ответ написан
  • "Warning: Each child in an array or iterator should have a unique "key" prop." Как исправить?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Ошибка в том, что вы не передаете key, но пытаетесь его установить в
    renderDistrict(item, key)
    У вас функция принимает 2 аргумента, а вы передаете только один здесь:
    this.renderDistrict(item)

    Тем не менее, так как у вас есть id ваша задача решается так:
    renderDistrict(item) {
         return (
            <tr key ={item.id} className="districts">
                <td>{item.id}</td>
                <td>{item.name}</td>
            </tr>
         )
    }


    p.s. для продуктивного изучения react советую подтянуть знания javascript'a
    Ответ написан
    2 комментария
  • Какой необходимый уровень знаний для junior React.js Разработчика?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    UPDATE: реальные тестовые задания и разборы здесь, ответы на все вопросы из поста в моем блоге об обучении react.

    не включая основы js

    Извините, но стандартная задача, про "напишите функуцию add, которая при вызове add(1)(2) вернет 3" - многих положила на лопатки =) Поэтому будьте готовы..

    React
    0) Какую проблему решает react ?
    1) Мгновенно ли срабатывает setState? Если нет, то как выполнить код, который 100% выполнится после того, как новый state будет установлен?
    2) Зачем многие постоянно пишут в constructor: this.FUNCTION_NAME = this.FUNCTION_NAME.bind(this) и отсюда вопрос вытекает чему равно this в разных местах вашего компонента...
    3) в каких методах жизненого цикла стоит выполнять xhr запросы? В каких стоит "обновлять state на основе props"?
    4) Что будет если вызвать this.setState в render методе компонента?
    5) зачем нужен componenWIllUnmount, приведите пример..
    6) Контролируемые, не контролируемые компоненты
    7) Как организовать роутинг в реакт приложении? (ответ: взять react-router - подходит, но было бы круто, если бы вы рассказали, как он примерно работает)*
    8) Зачем нужны propTypes? Что происходит с ними в production сборке?
    9) Как можно удобно "отлаживать" чужой код приложения, написанного на react (намек в сторону React devtools)
    ...

    Redux
    0) Какую проблему решает redux?
    1) Зачем многие создают типы действий NAME_REQUEST / NAME_SUCCESS ? А заодно, что такое "действие", а что такое "создатель действия"...
    2) Что такое редьюсер? Можете написать простой редьюсер без react/redux?*
    3) Для чего нужен redux-thunk? Как он работает? Напишите (можно псевдокод) асинхронный создатель действия (либо, если надоело говорить "терминами" - асинхронный aciton)
    4) Как компоненты приложения получают "пропсы" из "стора"?*
    5) Можно ли (и считается ли это нормальным) использовать state, если используется Redux?
    6) Почему в reducer'ax мы возвращаем новые объекты? Приведите пример, когда вы возвращаете новый объект, а когда тот же самый.
    6.5) А так же, "как в js вообще это работает?". Например:
    let obj1 { name: 'Test', age: 100 }
    let obj2 = obj1
    obj2.name = 'Test_new'

    Что будет в obj1, почему? В каких случаях объекты могут быть равны?
    7) Что возвращает функция connect (из react-redux)?
    ...

    Общее:
    0) package.json
    1) Webpack, gulp, etc...
    2) node.js
    3) promise

    Что-нибудь практическое:
    1) Как бы вы валидировали форму, если ошибки валидации приходят после submit'a ее на сервер..
    2) Почему не работает следующий код, сделайте чтобы работало
    ...
    На истину не претендую, но такие вопросы имели место быть на собеседованиях. В беседе можно многое разузнать дополнительными вопросами и так далее. Так же, если часть вопросов вам неизвестна - не беда, многие и на половину ответить не могут.

    p.s. возможно дополню...
    p.p.s. звездочкой отметил, на мой взгляд не самые необходимые для junior-собеседования вопросы.
    Ответ написан
    31 комментарий
  • Какая правильная организация react-redux приложения?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Не понял о каком наследовании идет речь, а так же последние абзацы, остальное кажется достаточно понятным, поехали.

    Есть меню(не навигация, а просто набор плюшек, к примеру добавить заметку) и сама область где отображается эта заметка.

    Почему этот "набор плюшек" не завязать на "навигации" ?
    То есть "добавить заметку" -> /add, редактировать -> /edit/:id .. ? В любом случае, вы сами пишите о 2х областях, которые есть на всех страницах, значит у вас должен быть родительский компонент, в котором рендерится "шапка (меню это или нет, не важно) + рабочая область"

    Получается, если вы все же за идею с роутером, то примерный код будет таким:
    App.js
    ...
    <HeaderContainer /> // (или тупой <Header />)
    { this.props.children }
    ...


    Внутри children, само собой разумеется - то, что возвращает ваш роутинг, значит, код роутера примерно такой:
    ...
    <Route path='/add' component={AddContainer} />
    <Route path='/edit/:id' component={EditContainer} />
    ...


    Когда я говорю "контейнер", значит я подразумеваю (как и все остальные), что это компонент, который присоединен к redux ( то есть
    connect(mapStateToProps,mapDispatchToProps)(имя_компонента)
    ).

    Таким образом, мы уже решили вашу задачу про: Меню при вызове запускает компонент конкретной задачи. тот отправляет результат на рабочий стол и там оно хранится , так как у нас в меню все сделано с помощью Link из react-router'a, и наша рабочая область изменяется вместе с URL-адресом браузера. Если есть необходимость, все клики по меню "прогонять" через ActionCreators (AC) выполняя какие-то дополнительные действия, или просто "для порядка" - то вы можете использовать внутри ваших AC push из react-router-redux, выглядит это обычно так:
    dispatch(push('/newUrl'))

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

    ---
    И еще. думаю вынести все данные(пункты меню к примеру) в отдельный файл(этакий недосервер)
    Где с ним лучше общаться? использую react-redux

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

    Как уже сказано, в конце не пойму о чем вы пишите... Структура "ответа с сервера" ? или о чем речь? Зачем вам компонент, который будет приводить структуру в нужный вид? и тд.

    ---
    Напоследок:

    Да и мне примеры вовсе не нужны. хочу для начала своих шишек набить.
    НО точно не хочу пару месяцев пилить проект(бесконечно усложняющаяся toDo) а потом понять что привык делать так как не надо.

    Никакого привыкания "делать, как не надо" - не бывает. Вы сначала делаете так, как считаете наилучше возможным, в процессе, что-то подпиливая, потом приходит озарение/совет - вы понимаете, что так будет лучше и делаете дальше. Если программист знает как "сделать лучше", но при этом делает "как привык" то грошь ему цена.
    Ответ написан
    8 комментариев
  • Чтение и перенос json данных в таблицу ES6?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    К предыдущему вопросу добавлю, так как вижу тэг 'react'

    1) вам нужно осознать, что раз приходят новые данные, значит у нас есть какой-то "изменяемый кусок", следовательно - необходимо будет использовать state, следовательно нужно задать this.state в constructor, с какими-то начальными данными, например "пустой массив"

    2) нужно выполнить запрос после того, как компонент окажется на странице, для этого подойдет метод жизненного цикла - componentDidMount

    3) в момент componentDidMount вы может выполнить запрос с помощью любой библиотеки, например jquery из ответа выше, но чаще с реактом используют npm-fetch, axios и подобные.. а можно и вообще XHR объектом стандартным обойтись...

    4) после выполнения запроса, на успешный ответ, вы должны изменить state, то есть вызвать this.setState

    5) после выполнения шагов выше, реакт вызовет метод render - в котором вы уже отрисуете таблицу, на основе ваших данных из state
    Ответ написан
  • Выбор js фреймворка (технологии) для crm?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Как уже не раз здесь обсуждалось, сейчас из "трендов" 3 технологии: react, angular, vue
    Выбирайте ту, которая больше по душе...
    По популярности уже сложно сказать, где больше/лучше, но думаю по angular больше различных материалов и рецептов, чем по react/vue + желаемый вами material и angular от одной конторы.
    Ответ написан
  • Как открыть страницу поста в wordpress rest api?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Судя по документации, чтобы получить пост, вам нужно вызвать:
    GET /wp/v2/posts/<id>
    Собственно в чем проблема?

    как сделать вывод именно того поста по которому нажали

    Передать именно тот id в запрос. Если вопрос в этом - то id можно взять, например из data-* атрибута, предварительно туда запихнув его в момент рендера всех постов на странице.

    Если вопрос в том, как открыть его по отдельному роуту, то вам нужен react-router и роут вида:
    <Route path='/posts/:id' component={PostMoreContainer} />


    Тогда у вас в this.props.params будет id вашей статьи и вы сможете выполнить GET запрос в момень componenDidMount. Подробнее в документации реакт-роутера.

    p.s. недавно подъехала статейка (ENG) по вашему вопросу.
    Ответ написан
    1 комментарий
  • React.js: Почему может не рендериться компонент?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Так же (плюс то, что вам уже ответели), возможно, что в компоненте ./Message.jsx неправильный export default

    Если там указн export без default, то значит нужно импортировать с фигурными скобками, причем имя в импорте, должно совпадать с именем в экспорте. (например, import { Message } from ... )

    p.s. приложите код компонента Message
    Ответ написан
    Комментировать
  • Как подружить React, OpenSeaDragon и плагин селекта к нему?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Судя по доке, вам достаточно "Include dist/openseadragonselection.js after OpenSeadragon in your html." (добавить openseadragonselection после вашего OpenSeadragon скрипта). Вы вроде бы так и сделали..

    Думаю, стоит попробовать без npm просто в index.html подключить сначала OpenSeadragon, затем OpenSeadragonSelection (с помощью тэга scripts) и далее уже создавать viewer как вы это делаете в вопросе. Если так будет работать, то уже думать дальше, либо так и оставить. Если так работать не будет, то вопрос не в том, как подружить React + OpenSeaDragon + плагин, и стоит создать чистый index.html статичный и прямо в нем прописать в тэге scripts пример из документаций, чтобы убедиться, что все на самом деле работает.
    Ответ написан
  • Примеры приложений, разработанных на React/Angular?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    На react: facebook, instagram.. или здесь целый список.

    Здесь можно подсмотреть некоторые open source проекты на реакте.
    Ответ написан
    Комментировать
  • Как в webpack задать компиляцию в несколько файлов?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Нужно использовать extractTextPlugin
    Кусочек конфига:

    для webpack 2:
    module.exports = {
      devtool: 'cheap-module-source-map',
      entry: [
        './src/index'
      ],
      output: {
        path: path.join(__dirname, 'production/public/'),
        filename: 'bundle.js',
        publicPath: '/',
      },
      plugins: [
        new webpack.DefinePlugin({
          'process.env': {
            'NODE_ENV': JSON.stringify('production')
          }
        }),
        new ExtractTextPlugin({
          filename: 'style.css',
          disable: false,
          allChunks: false, // true
        })
      ],
      module: {
        rules: [
          {
            test: /\.js$/,
            loaders: ['babel-loader'],
            include: path.join(__dirname, 'src'),
          },
          {
            test: /\.css$/,
            loader: ExtractTextPlugin.extract({
              fallbackLoader: 'style-loader',
              loader: ['css-loader', 'postcss-loader'],
              publicPath: '/public',
            }),
          }, {
            test: /\.scss$/,
            loader: ExtractTextPlugin.extract({
              fallbackLoader: 'style-loader',
              loader: ['css-loader', 'postcss-loader', 'sass-loader'],
              publicPath: '/public',
            }),
          },
    ....


    Для webpack 1:
    module.exports = {
      devtool: 'cheap-module-source-map',
      entry: [
        './src/index'
      ],
      output: {
        path: path.join(__dirname, 'production/public/'),
        filename: 'bundle.js',
        publicPath: '/',
      },
      plugins: [
        new webpack.DefinePlugin({
          'process.env': {
            'NODE_ENV': JSON.stringify('production')
          }
        }),
        new ExtractTextPlugin('style.css', {
          allChunks: false
        })
      ],
      module: {
        loaders: [
          {
            test: /\.js$/,
            loaders: ['babel'],
            include: path.join(__dirname, 'src')
          },
          {
            test: /\.scss$/,
            include: path.join(__dirname, 'src'),
            loader: ExtractTextPlugin.extract('style-loader', 'css-loader!postcss-loader!sass-loader')
          },
          {
            test: /\.css$/,
            loader: ExtractTextPlugin.extract('style-loader', 'css-loader')
          },
    ...


    Само собой, нужно не забыть добавить ExtractTextPlugin
    const ExtractTextPlugin = require('extract-text-webpack-plugin');
    Ответ написан
    5 комментариев
  • Есть ли смысл изучать Reac, Angular без хорошего знания JS?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Если иначе познавать JS не получается (нет мотивации, нет денег, и тд) - смысл есть.
    Всегда правильно советуют: учим основы, разбираемся во фреймворке, пишем хороший код.

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

    P.S. да, это вредный совет.
    Ответ написан
    Комментировать
  • Как вывести данные API в таблицу?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Не надо с DOM напрямую работать.
    Создаете в state переменную: data
    Далее в componentDidMount выполняете ajax запрос и его результат записываете через this.setState({data ... })
    В render методе своего компонента, в таблице делаете обход по this.state.data с помощью map / forEach / тд

    Пример:

    ...
    constructor(props) {
        super(props)
        this.state = {
          data: []
        }
    }
    ...
    componentDidMount() {
        // ваш ajax запрос
        // в success коллбэке устанавливаете новый state, из-за этого произойдет ре-рендер
        success: function(data) { this.setState(data) }
    }
    render() {
    const { data } = this.state
    ...
        <table className='table table-bordered table-striped'>
            <thead>
              <tr>
                <th>name</th>
              </tr>
            </thead>
            <tbody>
              {
                data.map(item => {
                  return (
                    <tr key={item._id}>
                      <td>{item.name}</td>
                    </tr>
                  )
                })
              }
            </tbody>
          </table>
    ...
    }
    Ответ написан
    Комментировать
  • Как правильно устроить задержку выполнения функций?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Скорее всего, где-то в коде проблема...
    Но если читать ваш вопрос буквально, то кроме как setTimeout есть еще setInterval и requestAnimationFrame (все трое вам не подходят).

    Обычно же, если хочется, чтобы функция выполнилась после получения какого-то результата, используют "коллбэки".
    Ответ написан
  • Ваши плагины и пакеты на sublime text для javascript, react, jsx разработки?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Ответ написан
    Комментировать
  • Как вывести контекст нажатого компонента React?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    Codepen

    Для изменяемых данных в зеленом блоке, можно использовать state компонента. Устанавливаете state через функцию, которую передаете в props ( везде называется handleClick, но для удобства можете переименовать). Чтобы передать 'city' можно придумать разные варианты, например, с помощью data-*атрибута у элемента, который будет доступен внутри e.target.dataset.*

    Зачем в constructor'e - this.XXX = this.XXX.bind(this) - жду ответ от вас )
    Ответ написан
    5 комментариев