• Отфильтровать ключи по собственному приоритету?

    WblCHA
    @WblCHA
    const getPosition = (str) => {
        switch (str) {
          case 'today':
            return 0;
          case 'yesterday':
            return 1;
          case '18 February 2021':
            return 2;
    
          default:
            return 3;
        }
      };
      
      ['18 February 2021', 'asdasda', 'yesterday', 'today'].sort((a, b) => getPosition(a) - getPosition(b));
    Ответ написан
    1 комментарий
  • Хитрый редирект?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Посмотреть заголовки, а точнее https://en.wikipedia.org/wiki/HTTP_referer
    Ответ написан
    Комментировать
  • Www для домена?

    @vitaly_il1
    DevOps Consulting
    пытаюсь в hosted-zone домена, добавить запись

    Не надо в AWS, добавляйте в cloudflare.
    Ответ написан
    4 комментария
  • Как получить пользователей, которые предоставляют все услуги?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Через подсчёт количества услуг из данного списка, предоставляемых каждым пользователем. Если их две, то выводить такого пользователя.
    Ответ написан
    Комментировать
  • Как получить общее количество не прочитанных сообщений для диалога?

    @alexalexes
    У вас в итоговой выборке есть dialogId. С помощью него делаете подзапрос в select-e, чтобы получить единственное значение.
    SELECT du.*, (
        SELECT COUNT(dm."receiverRead") "unreadMessages"
        FROM dialogs_messages dm
        WHERE 
            dm."dialogId" = du."dialogId" 
            AND dm."receiverRead" = false
            AND dm."senderUserId" NOT IN ('69e56a68-edbd-4f8b-8ccd-cb8031c5c865')
            AND dm.id NOT IN (
                SELECT dmd."messageId" FROM dialogs_messages_deleted dmd
                WHERE dmd."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            )
        GROUP BY dm."receiverRead"
    ) 
    FROM (
        SELECT
            DISTINCT ON (du."dialogId") du."dialogId", 
            SUBSTRING(dm."message", 1, 60), 
            du."joinedDateTime",
            users."avatarUrl",
            users.username
        FROM dialogs_users du
        LEFT JOIN dialogs_messages dm ON dm."dialogId" = du."dialogId"
        LEFT JOIN users on users.id = dm."senderUserId"
        WHERE 
            du."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            AND dm.id NOT IN (
                SELECT dmd."messageId" FROM dialogs_messages_deleted dmd
                WHERE dmd."userId" = '69e56a68-edbd-4f8b-8ccd-cb8031c5c865'
            )
        ORDER BY du."dialogId", dm."message" DESC
    ) du
    ORDER BY du."joinedDateTime" DESC;
    Ответ написан
    3 комментария
  • Почему this является undefined?

    @kova1ev
    Упрощенно, можно представить это как-то так:

    Есть ячейка памяти где хранится какой-то объект и есть указатель на нее (переменная). И есть ячейка памяти где хранится какая то функция с this внутри и есть указатель на нее (тоже можно сказать переменная, но выглядит она как-то так - myObj.func). Когда ты выполняешь вызов функции через точку - myObj.func() интерпретатор видит контекст в котором запускается функция и откуда нужно брать значение для this.

    Но когда ты передаешь в другую функцию в параметрах что-то вроде myObj.func то передается только указатель на ячейку памяти с функцией, контекст теряется, и соответственно переданная сущность запускается не как метод объекта, а как обычная функция, у которой this будет undefined

    А во втором случае ты как раз передаешь в параметрах указатель на сам объект, а не его метод, а метод вызываешь потом в контексте этого объекта, поэтому все работает.
    Ответ написан
    1 комментарий
  • Можно ли использовать связку findDOMNode и querySelectorAll в React?

    @abberati
    frontend-разработчик
    Такой подход очень сильно противоречит канонам реакта. Не нужно обращаться к нодам без крайней необходимости (обычно это обращение к методам нод инпутов). Используйте стейт родителя.
    Ответ написан
    2 комментария
  • Правильно я визуализировал работу под капотом в Redux+ReactRedux после Reducer?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Все происходит совсем не так. Вы, видимо, пытаетесь угадать, а достаточно лишь изучить исходный код библиотеки react-redux и почитать про метод store.subscribe redux.

    redux и react-redux это две ничем не связанные и не подозревающие о существовании друг друга библиотеки. Компоненты react-redux лишь используют API объекта store из redux, который вы должны передать в Provider сами.
    Когда вы подключаете react-redux вы используете компонент Provider и HOC connect. Ниже перечислены их основные функции.

    Provider:
    1. Получает в props store и подписывается на его обновления с помощью store.subscribe.
    2. Инициирует перерисовку дочернего древа по обновлению store, с помощью вызова this.setState.
    3. Передает в контекст store и storeState(результат вызова store.getState())

    HOC connect:
    1. Передает нужные props в оборачиваемый компонент с помощью, полученного через контекст, состояния и маппера mapStateToProps.
    2. Оборачивает actions в вызов store.dispatch с помощью store, полученного через контекст, и маппера mapDispatchToProps, либо просто передает store.dispatch в props компонента как свойство dispatch.
    3. Если аргумент mapStateToProps был передан, то компонент-обертка, возвращенный вызовом connect, отслеживает обновления store. Если свойства полученные из store и props не были изменены, а компонент уже отрисован, то connect при обновлении возвращает сохраненный по ссылке отрисованный компонент, если изменения были, то дочерний компонент перерисовывается. Логику обновления можно понять, взглянув на функцию, результат вызова которой, вызывается в render компонента обертки:
    function makeChildElementSelector() {
      let lastChildProps, lastForwardRef, lastChildElement
    
      return function selectChildElement(childProps, forwardRef) {
        if (childProps !== lastChildProps || forwardRef !== lastForwardRef) {
          lastChildProps = childProps
          lastForwardRef = forwardRef
          lastChildElement = (
            <FinalWrappedComponent {...childProps} ref={forwardRef} />
          )
        }
    
        return lastChildElement
      }
    }


    Подробнее: react-redux with Dan Abramov
    Ответ написан
    Комментировать
  • Объясните простыми словами как работает Redux?

    У вас есть одно большое дерево, в котором хранится все состояние (state) приложения - это хранилище (store).
    Также у вас есть набор редьюсеров (которые скомбинированы в один общий rootReducer) - это функции, который принимают текущее состояние и действие и возвращают новое состояние:
    function someReducer(state = initialState, action) {
      // обычно выглядит как switch 
      // action - простой js-объект
      //              и обязательно имеет строковое поле type
      switch(action.type) {
        // обрабатываем действие с типом SOME_ACTION_NAME
        case 'SOME_ACTION_NAME':
          // берем какие-то данные из экшена и возвращаем новое состояние
          // при этом менять sate нельзя!
          // state.someProperty = action.newStateData <--- НЕТ!
          return { ...state, action.newStateData };
        // Если мы не обрабатываем действие - просто возвращаем старое состояние
        default:
          return state;
      }
    }


    Также есть экшен креаторы (actionCreators) - это функции, которые возвращают действие. затем это действие вещается в хранилище (диспатчится). Типичный пример:
    function someActionCreator(someArg) {
      return {
        type: 'SOME_ACTION_NAME',
        newStateData: someArg + 5, // <-- разная логика
      };
    }


    По-умолчанию в качестве экшена мы можем вернуть только простой объект, но при создании хранилища можно добавить так называемый middleWare. Это специальные функции, которые принимают все экшены из диспатча и могут передавать их дальше (при этом содержат дополнительную логику).

    Если мы хотим получить доступ к состоянию в экшен креаторе - воспользуемся thunkMiddleware:
    import thunkMiddleware from 'redux-thunk';
    
    function createStore(initialState) {
      const reducer = combineReducers(reducers);
      const finalCreateStore = applyMiddleware(
        thunkMiddleware // <-- добавляем middleware
      )(defaultCreateStore);
      return finalCreateStore(reducer, initialState);
    }


    Теперь мы можем делать так:
    function someActionCreator(someArg) {
      return (dispatch, getState) => { // <-- возвращаем фукнцию, а не объект!
        const someState = getState().reducerName;
        return {
          type: 'SOME_ACTION_NAME',
          newStateData: someArg + someState, 
        };
      };
    }


    В общем схема выглядит так:

    actionCreator --action--> dispatch --action--> middleware --action--> store --action--> reducer --> newState


    Затем мы берем из react-redux метод connect, который подключает Ваш умный компонент к хранилищу:
    import { connect } from 'react-redux';
    import { bindActionCreators } from 'redux';
    
    class MyComponent extends Component {
      static propTypes = {
        someProp: PropTypes.string.isRequired,
        someFunc: PropTypes.func.isRequired,
      };
    }
    
    // Тут мы берем из глобального состояния необходимую нам часть
    // В ownProps - свойства компонента. Тут могут быть например свойства от роутера
    function mapStateToProps(state, ownProps) {
      return {
        someProp: state.someReducer,
      };
    }
    
    function mapActionsToProps(dispatch) {
      return bindActionCreators ({ // <-- биндим все на disptach для удобства
        someFunc: (someArg) => someActionCreator(someArg + 1),
      }, dispatch);
    }
    
    export default connect(
      mapStateToProps,
      mapActionsToProps
    )(MyComponent);
    Ответ написан
    3 комментария
  • Насколько хорош этот код? Или можно лучше?

    @abberati
    frontend-разработчик
    код настолько плох, что я его не читал
    покликал, написал как-то так
    Ответ написан
  • Почему не наследуются props через redux метод connect в в компонент App?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    /* ... */
    
    const mapStateToProps = state => ({
      desks: state.desks,
    });
    
    const ConnectedApp = ReactRedux.connect(mapStateToProps)(App);
    
    ReactDOM.render(
      <ReactRedux.Provider store={store}>
        <ConnectedApp />
      </ReactRedux.Provider>, 
      document.querySelector('#root'),
    );
    Ответ написан
    Комментировать
  • Нормален ли данный подход рендеринга через setState?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Если вам по клику в шапке одной из досок, надо обновлять какое-либо состояние на уровне приложения, то, думаю, тут лучше подойдет redux.
    В других случаях, например на уровне модуля, lifting up state считается хорошей практикой.
    Ответ написан
    4 комментария
  • Почему не работает ref?

    Vlad_IT
    @Vlad_IT Куратор тега JavaScript
    Front-end разработчик
    Вы неправильно указываете. Если вы заранее определили ref через createRef, то вам не нужно писать стрелочную функцию в атрибуте ref, достаточно просто указать свойство
    ref={ this.input }
    UPD: а, у вас не в этом проблема. На момент выполнения console.log в handleShowForm, ref еще не создался, т.к. форма не нарисовалась. this.setState асинхронная функция, она не сразу вызывает render функцию, чтобы показать ваше поле. У setState есть callback, который выполняется после изменения состояния. Напишите так
    this.setState({
          showForm: true
        }, () => {
        console.log(this.input);
        });
    Ответ написан
    2 комментария
  • Как реализовать такой слайдер?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    slick + Center Mode
    Центральному блоку задаешь нужный zoom или увеличиваешь блок в px, так же там можно поиграться с расстояниями между блоками
    Ответ написан
    Комментировать
  • Как можно пробраться к родителям и поставить им свойства в объекте?

    Stalker_RED
    @Stalker_RED
    После каждого рекурсивного "заглядывания вглубь" проверяем вернулся ли результат
    Ответ написан
    1 комментарий
  • Из-за чего не работает эта задумка?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Vue не может отследить прямую установку значения элемента массива по индексу. Так что замените

    shower[index] = !shower[index]

    на

    $set(shower, index, !shower[index])

    А ещё лучше - уберите массив shower и добавьте элементам items свойство show:

    data: () => ({
      items: [
        { name: '...', show: false },
        { name: '...', show: false },
        ...
      ],
      ...
    }),

    <span @click="item.show = !item.show">{{ item.name }}</span>
    <div class="dialog_show" v-if="item.show">{{ index }}</div>
    Ответ написан
    Комментировать
  • Как вывести в v-for по строке - data переменную?

    0xD34F
    @0xD34F Куратор тега Vue.js
    Могу предложить пару вариантов.

    1. Пусть данные компонента станут свойствами объекта, тогда их можно будет получать по имени свойства. Типа так.

    2. Сделайте computed свойство, которое будет представлять текущий набор данных. Типа так.

    ...

    А, ну и конечно ключевое слово this - оно тоже доступно в шаблоне. Так что есть и третий вариант (ну, на самом деле это вариант "полтора" - отличий от первого по сути нет никаких).

    UPD. Конечно, все эти три варианта суть одно и то же - получение свойства объекта по имени в переменной. То есть, в конечном счёте, проблема в слабом знании языка. Я бы на вашем месте подтянул основы, а то так и будете сюда бегать с такими вот тривиальными вопросами.
    Ответ написан
    3 комментария