• Babel или Typescript? Есть ли смысл учить второй?

    RUVATA
    @RUVATA
    Разработчик, гик, меломан, разгильдяй
    TypeScript и Babel сравнить можно, разве что в отношении того что их реализация предполагает прекомпиляцию JS,
    Тем не менее, Babel - это просто прекомпилятор (т.е. он не вводит каких-то своих требований или понятий/концепта просто позволяет писать, например используя синтаксис нового стандарта JS, получая на выходе код совместимый с интерпритаторами JS которые его не поддерживают),
    В то время как TypeScript - это всё таки, другой подход/концепт ("не поворачивается" назвать его полноценным языком)
    Его основные "фичи" - строгая типизация, интерфейсы (в понятии ООП), сигнатуры методов подключаемых библиотек.
    В Vanilla JS (в "чистом" JS) - этого нет как "явления", многим этого очень не хватет. (Особенно программистам которые пришли в JavaScript с других языков, не будем называть каких :))
    Тем не менее одно неоспоримое преимущество использования TypeScript всё же есть - если это не home project, то он не позволяет при интенсивной разработке "выстрелить себе в ногу", по крайне мере в отношении - типизации и сигнатуры.
    Ответ написан
    Комментировать
  • Как вызвать функцию в компоненте после того как свойство в vuex store изменится?

    Через watch

    Можно запихнуть getters в computed

    И получится

    const app = new Vue({
        store,
        el: '#app',
        data() {
            return {}
        },
        computed: {
            rgbColors() {
                return this.$store.getters.rgbColors
            }
        },
        watch: {
            rgbColors(newValue, oldValue) {
    
            }
        }
    });


    И еще вот ссылка
    Ответ написан
    3 комментария
  • Как задать отображение spinner до ответа от сервера reactJS?

    rockon404
    @rockon404 Куратор тега React
    Frontend Developer
    Идеальный вариант, создать для этих задач компонент:
    function Block({ 
      children,
      isLoading, 
      isError, 
      isEmpty, 
      emptyText, 
      fetch,
    }) {
      const showPreloader = isLoading && !isError;
      const allDataIsReady = !isLoading && !isError;
      const showEmptyText = allDataIsReady && isEmpty && emptyText;
    
      return (
        <Wrapper>
          {showPreloader && <Preloader />}
          {isError && <TryAgain fetch={fetch} />}
          {showEmptyText && <Empty>{emptyText}</Empty>}
          {allDataIsReady && children}
        </Wrapper>
      );
    }


    И использовать его в коде так:
    render() {
      const { isLoading, isError, orderList } = this.props;
    
      return (
        <Block
          isLoading={isLoading}
          isError={isError}
          isEmpty={!ordersList.length}
          fetch={this.fetchOrdersList}
          emptyText="You don't have any orders."
        >
          {ordersList.map(order => <Order key={order.id} order={order} />}
        </Block>
      )
    }


    Название служебных дочерних компонентов компонента Block условные, но думаю суть их задач передают.
    Ответ написан
    4 комментария
  • Как сложить два массива в массиве объектов?

    @Ridz
    "use strict"
    function chartSumm(arr) {
        let obj = {
                'Общая экономия': 0
            },
            lb = {
                'Эккономия на аннуляции': 'Аннуляция без штрафа',
                'Экономия на цене у стойки': 'Цена у стойки'
            };
        let sum = function(a, b) {
            return a + b
        }
        return arr.reduce(function(obj, el) {
            let label = el.label;
            if (label in lb) label = lb[label];
            let total = el.data.reduce(sum, 0);
            el.total = total;
            obj[label] = total;
            obj['Общая экономия'] += total;
            return obj
        }, obj)
    
    }
    let arr = [{
            label: 'Эккономия на аннуляции',
            backgroundColor: '#ef9d4d',
            data: [1000, 400, 1500, 1500, 3000, 4000]
        },
        {
            label: 'Экономия на цене у стойки',
            backgroundColor: '#476e8f',
            data: [1170, 460, 2000, 2500, 2700, 4000]
        },
    ];
    
    let Summ = chartSumm(arr)
    
    console.log(Summ, arr)
    Ответ написан
    2 комментария
  • Как создавать элемент только в том случае если прошла последняя проверка?

    boratsagdiev
    @boratsagdiev
    Может попробовать привязать значения чекбоксов к моделям и на основе их значений показывать или не показывать виджет? Если чекбоксов не очень много, то прокатит.

    В checkboxSettings я так понял лежат статусы чекбоксов типа true/false?

    Просто вы не так много кода показали и сложновато подсказать точнее. Пишите если что.
    Ответ написан
    6 комментариев
  • Как научиться алгоритмическому мышлению?

    max-kuznetsov
    @max-kuznetsov
    Главный IT-архитектор
    Бьёрн Страуструп, описывая C++, говорил: "Язык программирования служит двум связанным между собой целям: он является выразительным средством программиста для указания действий, которые надо выполнить, а также набором концепций, которыми пользуется программист при решении проблемы." Но язык программирования точно не является решением проблемы, он только средство выражения и инструмент. Поэтому для начала давайте оставим в стороне программирование.

    С остальным всё просто. Программисту часто не хватает некоторой "прелюдии", позволяющей перебросить мостик между идеей программы и написанием кода. Мостик этот строится так:

    1. Имеем некоторую идею: "а хорошо бы написать программу, которая делала бы...".
    2. Определяете предметную область с теми процессами, которые имеют отношение к разрабатываемой программе.
    3. Формулируете цель проекта: как программа должна повлиять на предметную область (не вдаваясь в реализацию).
    4. Формулируете бизнес-задачи, решение которых позволят достичь поставленной цели.
    5. Указываете ограничения, в рамках которых будет создаваться программа.
    6. Создаёте концепцию - некое видение того, какой будет новая программа, без технических деталей.
    7. Решаете, а нужна ли такая программа?
    8. Если нужна, то прорабатываете одно или несколько технических решений, как можно сделать программу. Делаете оценки реализуемости и оставляете одно решение.
    9. Разрабатываете детальные требования к вашей программе.
    10. Создаёте архитектурное решение, логическое и физическое.
    11. Проводите детальное проектирование каждого компонента вашей архитектуры.
    12. Программируете, тестируете, отлаживаете код.
    13. И - ура! - внедряете программу.


    Это выглядит сложным. Но не очень сложно.

    Как я смотрю на весь этот процесс, можете посмотреть тут: Обзор процесса разработки программного обеспечения. Краткий академический обзор всего процесса можно найти в книге Макконнелла "Остаться в живых. Руководство для менеджеров программных проектов" - книга небольшая, для начала самое то.
    Ответ написан
    1 комментарий
  • Как отрисовать данные из одного массива по 6 строк в 3ех столбцах?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Остаток от деления порядкового номера элемента в массиве на число элементов в блоке принимает нулевое значение, когда пора создавать новый блок. А предыдущий готовый, если есть, вставлять в документ.

    var i
      , w
      , div
      , box
      , label
      , parent = document.body // к чему приклеивать блоки
      , perBlock = 5 // сколько в одном блоке
    ;
      
    for( i = 0; i < widgetSettings.length; i++) {
      w = widgetSettings[i];
    
      box = document.createElement('input');
      box.type = 'checkbox';
      box.id = box.name = w.id;
      box.value = w.value;
      
      label = document.createElement('label');
      label.appendChild(box);
      label.appendChild( document.createTextNode(w.text));
      
      if( i % perBlock === 0) {
        if(div) parent.appendChild(div);
        div = document.createElement('div');
      }
      div.appendChild(label);
    }
    if( (i-1) % perBlock) parent.appendChild(div);

    Fiddle
    Ответ написан
    Комментировать
  • Как удалить элемент из компонента и из store?

    Да, оперируйте id. Сохраняйте его в action и дальше фильтруйте

    function removeSomething(id) {
      return { type: 'RemoveSomething_Action', payload: { id } }
    }
    
    function reducer(state = initialState, action) {
      switch(action.type) {
        //...
        case 'RemoveSomething_Action':
          return state.filter(el => el.id !== action.payload.id)
        // ...
      }
    }


    У вас так и сделано :)
    Ответ написан
    6 комментариев
  • Как проверить размеры картинки до ее отрисовки в dom?

    После того, как компонент будет добавлен в DOM - берем src из props и создаем новый DOM-элемент img, ставим обработчик onLoad и загружаем картинку. Затем проверяем размеры и устанавливаем стейт

    class Cover extends Component { 
       state = {
         loaded: false,
         width: 0,
         height: 0,
       }
    
       componentDidMount() {
         const img = document.createElement('img')
    
         img.onload = e => {
           console.log('image loaded', img.width, img.height)
           this.setState({ loaded: true, width: img.width, height: img.height })
         }
    
         img.src = this.props.src
       }
    
      renderLoading() {
        return <div>loading... </div>
      }
      
      renderLoaded() {
        const { width, height } = this.state
        const isFits = width === 140 && height === 205
        return isFits
          ? <div>обложка успешно установлена</div>
          : <div>Обложка должна быть 140х205</div>
      }
    
       render() {
           return this.state.loaded ? this.renderLoaded() : this.renderLoading()
       }
    }
    Ответ написан
    Комментировать
  • Как правильно передать action в reducer из компонента?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    export default function rootReducer(state = [], action) {
        console.log(action);
        if(action.type === 'BUTTON_CLICK'){
            return[
            ...state,
                action.book
            ]
                store.dispatch(state) // выкинуть отсюда.
        }
        return state;
    }


    В компоненте, используйте state, в нем храните name и author. По клику на кнопку, вам нужно вызвать ACTION. Скорее всего он вам придет из родителя-контейнера (компонента, который присоединен к store, с помощью функции connect).

    Inputs переписать можно так:
    export default class Inputs extends Component {
        constructor(props) {
            super(props)
            this.onAuthorChange = this.onAuthorChange.bind(this)
            this.onNameChange = this.onNameChange.bind(this)
            this.takeVal = this.this.takeVal.bind(this)
            this.state = {
                author: '',
                name: '',
            }
        }
        onAuthorChange(e) {
            this.setState({ author: e.target.value })
        }
        onNameChange(e) {
            this.setState({ name: e.target.value })
        }
        takeVal() {
            this.props.addItem({ // имя, под которым вы передали свой экшен в качестве пропса от родителя
                author: this.state.author,
                name: this.state.name,
            })
        }
        render() {
            const {author, name} = this.state
            return (
                <div className="app__enter">
                    <div className="inputs-bock">
                        <input onChange={this.onAuthorChange} className="inputs-book__author" placeholder="Автор" type="text" value={author}/>
                        <input onChange={this.onNameChange} className="inputs-book__name" placeholder="Название" type="text" value={name}/>
                    </div>
                    <div className="button-wrap">
                        <button onClick={this.takeVal}>Добавить книгу</button>
                    </div>
                </div>
            )
        }
    }


    Конечно, так как код функций onAuthorChange и onNameChange одинаковый, его можно уместить (и очень просто) в одной функции...

    Ваш "приконекченый родитель" может выглядеть так:

    import React, { Component } from 'react'
    import Inputs from '../components/Inputs'
    import { connect } from 'react-redux'
    
    import {
      addItem,
    } from '../../actions/UserActions'
    
    class InputsContainer extends Component {
      render() {
        return <Inputs addItem={this.props.addItem} />
      }
    }
    
    const mapStateToProps = (state) => ({})
    
    const mapDispatchToProps = (dispatch) => ({
      addItem: (params) => dispatch(addItem(params)),
    })
    
    export default connect(mapStateToProps, mapDispatchToProps)(InputsContainer)


    p.s. доки читать нужно, поддерживаю. ДЗ: переименовать addItem в пропсах и вызвать его внутри takeVal. Сделать из 2х функций обработчиков изменений в инпутах - одну.
    Ответ написан
    1 комментарий
  • Правильная ли логика работы приложения на react/redux?

    maxfarseer
    @maxfarseer
    https://maxpfrontend.ru, обучаю реакту и компании
    При нажатии на кнопку генерируется action - тип: "КНОПКА_НАЖАТА" (1), у него в payload (полезной нагрузке, поле можно как угодно называть): какая это кнопка.
    Эти данные обрабатываются в редьюсере (2). Например: было пусто, после КНОПКА_НАЖАТА стало "в".
    Это изменение в редьюсере увидели подключенные (с помощью connect) компоненты. И перерендерились*.(3)

    * - если вы никак не мешаете render'y (например: не передаете тот же объект, или используете какое-то условие в shouldComponentUpdate,)

    ---

    Еще вариант, что это у вас все 1 компонент (либо 1 компонент + дети), и вам не надо гонять данные через store (то есть action + reducer ...), а просто можете использовать state.
    Ответ написан
    Комментировать
  • Как подключить свой стиль в дочерней теме wp?

    HectorPrima
    @HectorPrima
    программист
    в дочерней теме в function.php добавьте
    add_action( 'wp_enqueue_scripts', 'register_my_styles' );
    
    function register_my_styles() {
    	wp_register_style( 'mystyle1', get_stylesheet_directory_uri().'/style1.css' );
    	wp_enqueue_style( 'mystyle1' );
    }
    Ответ написан
    Комментировать
  • Как проще и правильнее хранить и доставать json данные?

    akzhan
    @akzhan
    слишком общий вопрос. непонятен даже шаблонизатор.

    а вообще ваш пример записывается как

    var storage = {
            "id": "4",
            "name": "Товар 4",
            "price": "2500"
    };
    Ответ написан
    2 комментария
  • Как вывести суб меню с произвольными заголовками wp?

    Pshkll
    @Pshkll
    Ответ написан
    Комментировать
  • Как сделать сброс фильтров?

    lazalu68
    @lazalu68
    Salmon
    Немного мимикрии, попробуйте использовать эту функцию:

    function berocket_reset() {
    	$('.berocket_checked').click();
    	$('select[name="orderby"] :first').prop('selected', true);
    	$('.berocket_filter_slider').each(function(i, o) {
    	    var $o = $( o ), all_terms_name = $o.data('all_terms_name');
    	    $o.data({
    	        value1: $o.data('min'),
    	        value2: $o.data('max')
    	    })
    	    if( $o.data('all_terms_name') == null )  {
    	        $( '#'+$o.data('fields_1') ).val( berocket_format_number ($o.data('value1') / $o.data( 'step' ) ) );
    	        $( '#'+$o.data('fields_2') ).val( berocket_format_number ($o.data('value2') / $o.data( 'step' ) ) );
    	    } else {
    	        $( '#'+$o.data('fields_1') ).val( all_terms_name[ $o.data('value1')>>0 ] );
    	        $( '#'+$o.data('fields_2') ).val( all_terms_name[ $o.data('value2')>>0 ] );
    	    }
    	    berocket_set_slider ( i, o );
    	})
    	updateProducts();
    }


    Вероятно, предварительно стоит сделать так:
    $ = jQuery
    Ответ написан
    3 комментария
  • Почему не срабатывает php код с else?

    nazares
    @nazares
    Software Engineer
    <?php if ( is_front_page() ) : ?>
             <div class="header-page clearfix">
                  <h2 class="name-page">Акции</h2><a href="#" class="cart-btn">
                  <div class="cart-btn__img"><img src=" <?php echo esc_url( get_template_directory_uri() );?>/img/shopping-bag.svg" alt=""></div>
                  <div class="cart-btn__text">Ваша корзина</div></a>
             </div>
    <?php else: ?>
            <div>AAAAAAAAAAAAAAAA</div>
    <?php endif; ?>
    Ответ написан
    1 комментарий
  • Почему не срабатывает скрипт на iphone?

    gubin_niko
    @gubin_niko
    У iOS с событиями клика бывают проблемы.
    Помочь вам сможет эта статья.

    Одно из решений - поставить в свойство cursor для ваших кликабельных элементов значение pointer. Это баг jQuery, к сожалению. Сейчас попробовать не могу, но если не получится - пишите, будем разбираться :-)
    Ответ написан
    3 комментария
  • Как выгрузить данные из json для множества элементов?

    Fzero0
    @Fzero0
    Вечный студент
    Ответ написан
    Комментировать
  • Как сделать плавную анимацию c выезжающим блоком?

    aliencash
    @aliencash
    Партизан
    Тут не нужен js
    codepen.io/aliencash/pen/yJEZrB
    Ответ написан
    Комментировать